@dragonmastery/dragoncore-vue 0.0.18 → 0.0.19

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 (162) hide show
  1. package/dist/ChangePasswordPage-BuVNYC_G.js +6 -0
  2. package/dist/{ChangePasswordPage-D2Ci00Sh.js → ChangePasswordPage-DXzU3NI9.js} +2 -2
  3. package/dist/{ChangePasswordPage-D2Ci00Sh.js.map → ChangePasswordPage-DXzU3NI9.js.map} +1 -1
  4. package/dist/CreateTeamForm-BuMrZ169.js +32 -0
  5. package/dist/CreateTeamMemberForm-D0xqR9me.js +32 -0
  6. package/dist/CreateUserPage-BWIvFF-4.js +6 -0
  7. package/dist/{CreateUserPage-DbT_l32W.js → CreateUserPage-bwR6fq5C.js} +2 -2
  8. package/dist/{CreateUserPage-DbT_l32W.js.map → CreateUserPage-bwR6fq5C.js.map} +1 -1
  9. package/dist/CreditBalanceDashboard-BR-er7gs.js +32 -0
  10. package/dist/CreditManagement-CyjrE1ep.js +32 -0
  11. package/dist/CustomerCreateSupportTicketForm-C9-CLRRQ.js +32 -0
  12. package/dist/{CustomerSupportTicketDetailPage-CthS9akm.js → CustomerSupportTicketDetailPage-D_1t2EpN.js} +9 -9
  13. package/dist/{CustomerSupportTicketDetailPage-CthS9akm.js.map → CustomerSupportTicketDetailPage-D_1t2EpN.js.map} +1 -1
  14. package/dist/CustomerSupportTicketList-B0dC7lgD.js +32 -0
  15. package/dist/{CustomerSupportTicketParent-iBV1KRKL.js → CustomerSupportTicketParent-B09_iFpJ.js} +4 -4
  16. package/dist/{CustomerSupportTicketParent-iBV1KRKL.js.map → CustomerSupportTicketParent-B09_iFpJ.js.map} +1 -1
  17. package/dist/CustomerSupportTicketParent-D0wLnKXf.js +7 -0
  18. package/dist/CustomerSupportTicketSuccess-BvuBglg8.js +32 -0
  19. package/dist/EditTeamForm-BJlOKEkI.js +32 -0
  20. package/dist/EditTeamMemberForm-CbDvTLXI.js +6 -0
  21. package/dist/{EditTeamMemberForm-Cy8nzoUb.js → EditTeamMemberForm-DJW7yRQW.js} +2 -2
  22. package/dist/{EditTeamMemberForm-Cy8nzoUb.js.map → EditTeamMemberForm-DJW7yRQW.js.map} +1 -1
  23. package/dist/EditUserPage-CsHl1h_g.js +7 -0
  24. package/dist/{EditUserPage-CIRqNko-.js → EditUserPage-aDygGmfD.js} +4 -4
  25. package/dist/{EditUserPage-CIRqNko-.js.map → EditUserPage-aDygGmfD.js.map} +1 -1
  26. package/dist/{ForgotPassword-CJg_buPl.js → ForgotPassword-CJjzm9GK.js} +3 -4
  27. package/dist/{ForgotPassword-CJg_buPl.js.map → ForgotPassword-CJjzm9GK.js.map} +1 -1
  28. package/dist/ForgotPassword-DJjmzU_m.js +7 -0
  29. package/dist/LoginForm-BeiI_y3E.js +7 -0
  30. package/dist/{LoginForm-DyHmiC1I.js → LoginForm-IEP-hEh0.js} +4 -5
  31. package/dist/{LoginForm-DyHmiC1I.js.map → LoginForm-IEP-hEh0.js.map} +1 -1
  32. package/dist/Logout-Cm9kEzgH.js +70 -0
  33. package/dist/Logout-Cm9kEzgH.js.map +1 -0
  34. package/dist/Logout-DmZTNQDP.js +7 -0
  35. package/dist/MfaSetup-BwkenBRD.js +8 -0
  36. package/dist/{MfaSetup-D80HhwEz.js → MfaSetup-Ch0w-gTN.js} +4 -5
  37. package/dist/{MfaSetup-D80HhwEz.js.map → MfaSetup-Ch0w-gTN.js.map} +1 -1
  38. package/dist/MfaVerify-BaUROEol.js +8 -0
  39. package/dist/{MfaVerify-BEd-f6oV.js → MfaVerify-BwzjVrTj.js} +5 -6
  40. package/dist/{MfaVerify-BEd-f6oV.js.map → MfaVerify-BwzjVrTj.js.map} +1 -1
  41. package/dist/ResetPassword-DEFj1pgV.js +7 -0
  42. package/dist/{ResetPassword-4HLdgM7s.js → ResetPassword-DuLuXaNp.js} +3 -4
  43. package/dist/{ResetPassword-4HLdgM7s.js.map → ResetPassword-DuLuXaNp.js.map} +1 -1
  44. package/dist/{SavedFiltersPage-p0qGRIuN.js → SavedFiltersPage-CawED9Oz.js} +29 -29
  45. package/dist/{SavedFiltersPage-p0qGRIuN.js.map → SavedFiltersPage-CawED9Oz.js.map} +1 -1
  46. package/dist/{Signup-Ct0m0x78.js → Signup-C94alv87.js} +41 -12
  47. package/dist/Signup-C94alv87.js.map +1 -0
  48. package/dist/Signup-CFUbdrYs.js +7 -0
  49. package/dist/StaffCreateSupportTicketForm-AxprwWRv.js +32 -0
  50. package/dist/{StaffSupportTicketDetailPage-TaAPQARa.js → StaffSupportTicketDetailPage-DZZN3jmt.js} +11 -11
  51. package/dist/{StaffSupportTicketDetailPage-TaAPQARa.js.map → StaffSupportTicketDetailPage-DZZN3jmt.js.map} +1 -1
  52. package/dist/StaffSupportTicketList-DYKysNs3.js +32 -0
  53. package/dist/{StaffSupportTicketParent-KYzy4eb4.js → StaffSupportTicketParent-BYxQPuhI.js} +4 -4
  54. package/dist/{StaffSupportTicketParent-KYzy4eb4.js.map → StaffSupportTicketParent-BYxQPuhI.js.map} +1 -1
  55. package/dist/StaffSupportTicketParent-CT8oYFd6.js +7 -0
  56. package/dist/StaffSupportTicketSuccess-zWEagE4E.js +32 -0
  57. package/dist/{SupportStaffPage-D_YsHZZa.js → SupportStaffPage-B05UR5LK.js} +7 -7
  58. package/dist/{SupportStaffPage-D_YsHZZa.js.map → SupportStaffPage-B05UR5LK.js.map} +1 -1
  59. package/dist/{SupportTicketDevLifecycleBadge-B2NysMAj.js → SupportTicketDevLifecycleBadge-Ba-Rm6QW.js} +1 -1
  60. package/dist/{SupportTicketDevLifecycleBadge-B2NysMAj.js.map → SupportTicketDevLifecycleBadge-Ba-Rm6QW.js.map} +1 -1
  61. package/dist/{SupportTicketMaintenancePage-CpK1esq2.js → SupportTicketMaintenancePage-BoZpjcAF.js} +4 -4
  62. package/dist/{SupportTicketMaintenancePage-CpK1esq2.js.map → SupportTicketMaintenancePage-BoZpjcAF.js.map} +1 -1
  63. package/dist/TeamAttachmentsTab-BFRMbPlZ.js +32 -0
  64. package/dist/{TeamHistoryTab-BQ-eXtiw.js → TeamHistoryTab-BrC6FFIw.js} +3 -3
  65. package/dist/{TeamHistoryTab-BQ-eXtiw.js.map → TeamHistoryTab-BrC6FFIw.js.map} +1 -1
  66. package/dist/TeamHistoryTab-CYrt5KnE.js +4 -0
  67. package/dist/TeamList-CF5BQhfx.js +32 -0
  68. package/dist/TeamMemberList-Dfi2iKOH.js +32 -0
  69. package/dist/TeamMemberParent-DXcumR-Q.js +32 -0
  70. package/dist/{TeamNotesTab-Dj12Q2gD.js → TeamNotesTab-B2eETkAz.js} +5 -5
  71. package/dist/{TeamNotesTab-Dj12Q2gD.js.map → TeamNotesTab-B2eETkAz.js.map} +1 -1
  72. package/dist/TeamNotesTab-Bv_HPC6f.js +7 -0
  73. package/dist/TeamParent-DLoNn-mW.js +32 -0
  74. package/dist/{TimelineNoteInput-DGDgyGe-.js → TimelineNoteInput-C0a0WRQC.js} +2 -2
  75. package/dist/{TimelineNoteInput-DGDgyGe-.js.map → TimelineNoteInput-C0a0WRQC.js.map} +1 -1
  76. package/dist/{TimelineSystemEvent-CBwUl5G8.js → TimelineSystemEvent-Dj2TMOF6.js} +4 -4
  77. package/dist/{TimelineSystemEvent-CBwUl5G8.js.map → TimelineSystemEvent-Dj2TMOF6.js.map} +1 -1
  78. package/dist/UserListPage-CBwfXo15.js +4 -0
  79. package/dist/{UserListPage-D-IdlsHK.js → UserListPage-QSdxrJT6.js} +3 -3
  80. package/dist/{UserListPage-D-IdlsHK.js.map → UserListPage-QSdxrJT6.js.map} +1 -1
  81. package/dist/{UserProfilePage-DMwDVgXa.js → UserProfilePage-X4z2lG-J.js} +4 -4
  82. package/dist/{UserProfilePage-DMwDVgXa.js.map → UserProfilePage-X4z2lG-J.js.map} +1 -1
  83. package/dist/UserProfilePage-cTrZuwOT.js +7 -0
  84. package/dist/{VerifyEmail-CHfTzrHg.js → VerifyEmail-8bsvoDdM.js} +57 -22
  85. package/dist/VerifyEmail-8bsvoDdM.js.map +1 -0
  86. package/dist/VerifyEmail-Cpc0umIu.js +7 -0
  87. package/dist/{VerifyEmailRequired-BCKREd_C.js → VerifyEmailRequired-CN1FU1AE.js} +6 -7
  88. package/dist/{VerifyEmailRequired-BCKREd_C.js.map → VerifyEmailRequired-CN1FU1AE.js.map} +1 -1
  89. package/dist/ViewTeam-DpjnoTwo.js +32 -0
  90. package/dist/ViewTeamMember-CRb2oBHG.js +32 -0
  91. package/dist/{convertToLocalDateTime-mKs5eC9T.js → convertToLocalDateTime-DOSGtMn8.js} +1 -1
  92. package/dist/{convertToLocalDateTime-mKs5eC9T.js.map → convertToLocalDateTime-DOSGtMn8.js.map} +1 -1
  93. package/dist/{displayIdFormatter-rSbbsHIX.js → displayIdFormatter-B1ZKgofu.js} +1 -1
  94. package/dist/{displayIdFormatter-rSbbsHIX.js.map → displayIdFormatter-B1ZKgofu.js.map} +1 -1
  95. package/dist/{extractRpcErrorMessage-pP3v8kKE.js → extractRpcErrorMessage-C_UbKgHL.js} +1 -1
  96. package/dist/{extractRpcErrorMessage-pP3v8kKE.js.map → extractRpcErrorMessage-C_UbKgHL.js.map} +1 -1
  97. package/dist/index.d.ts +785 -776
  98. package/dist/index.js +31 -32
  99. package/dist/{mfaSchema-_vbG9jiT.js → mfaSchema-nfNCcEhM.js} +1 -1
  100. package/dist/{mfaSchema-_vbG9jiT.js.map → mfaSchema-nfNCcEhM.js.map} +1 -1
  101. package/dist/{src-B5eswi_J.js → src-CkgUIye9.js} +66 -60
  102. package/dist/src-CkgUIye9.js.map +1 -0
  103. package/dist/{useBreadcrumbs-B-W-miq6.js → useBreadcrumbs-DmgSucoe.js} +1 -1
  104. package/dist/{useBreadcrumbs-B-W-miq6.js.map → useBreadcrumbs-DmgSucoe.js.map} +1 -1
  105. package/dist/{useMutation-DzRSXPB1.js → useMutation-DbzXtqf1.js} +3 -3
  106. package/dist/{useMutation-DzRSXPB1.js.map → useMutation-DbzXtqf1.js.map} +1 -1
  107. package/dist/{useQuery-bvJabe9Q.js → useQuery-BKb5JXVS.js} +3 -3
  108. package/dist/{useQuery-bvJabe9Q.js.map → useQuery-BKb5JXVS.js.map} +1 -1
  109. package/dist/{useQueryCache-DIGf3fCM.js → useQueryCache-CHG4-HGF.js} +2 -2
  110. package/dist/{useQueryCache-DIGf3fCM.js.map → useQueryCache-CHG4-HGF.js.map} +1 -1
  111. package/dist/useReturnUrl-Da8PpLb9.js +118 -0
  112. package/dist/useReturnUrl-Da8PpLb9.js.map +1 -0
  113. package/dist/{useRpcAuth-SgNzCAPa.js → useRpcAuth-8Byr6SSI.js} +21 -9
  114. package/dist/{useRpcAuth-SgNzCAPa.js.map → useRpcAuth-8Byr6SSI.js.map} +1 -1
  115. package/package.json +2 -2
  116. package/dist/AppLink-CHMMrSFI.js +0 -54
  117. package/dist/AppLink-CHMMrSFI.js.map +0 -1
  118. package/dist/ChangePasswordPage-DqnWhaUa.js +0 -6
  119. package/dist/CreateTeamForm-LadKAxsM.js +0 -32
  120. package/dist/CreateTeamMemberForm-eWL__TEt.js +0 -32
  121. package/dist/CreateUserPage-cduuWl9g.js +0 -6
  122. package/dist/CreditBalanceDashboard-CgRRO6MD.js +0 -32
  123. package/dist/CreditManagement-BBb_Xumq.js +0 -32
  124. package/dist/CustomerCreateSupportTicketForm-yfyeXr0V.js +0 -32
  125. package/dist/CustomerSupportTicketList-Zzsg1FtO.js +0 -32
  126. package/dist/CustomerSupportTicketParent-CqR8lF7r.js +0 -7
  127. package/dist/CustomerSupportTicketSuccess-BPyydSLQ.js +0 -32
  128. package/dist/EditTeamForm-D0wZKYm2.js +0 -32
  129. package/dist/EditTeamMemberForm-JuRGiWOn.js +0 -6
  130. package/dist/EditUserPage-Dl6d3Cuh.js +0 -7
  131. package/dist/ForgotPassword-rSN-8EC4.js +0 -7
  132. package/dist/LoginForm-YCzdrekw.js +0 -7
  133. package/dist/Logout-C6pWyTIm.js +0 -41
  134. package/dist/Logout-C6pWyTIm.js.map +0 -1
  135. package/dist/Logout-Ctc8b-B0.js +0 -6
  136. package/dist/MfaSetup-xNmNjSh1.js +0 -8
  137. package/dist/MfaVerify-C0COXH_W.js +0 -8
  138. package/dist/ResetPassword-BCzMTXpT.js +0 -7
  139. package/dist/Signup-Ct0m0x78.js.map +0 -1
  140. package/dist/Signup-DNEklGpK.js +0 -7
  141. package/dist/StaffCreateSupportTicketForm-CxpKnqCq.js +0 -32
  142. package/dist/StaffSupportTicketList-BuKBTk2v.js +0 -32
  143. package/dist/StaffSupportTicketParent-Lkn-5u7C.js +0 -7
  144. package/dist/StaffSupportTicketSuccess-BD1Xsnx1.js +0 -32
  145. package/dist/TeamAttachmentsTab-DA_MBYj8.js +0 -32
  146. package/dist/TeamHistoryTab-lz2ouNyP.js +0 -4
  147. package/dist/TeamList-T3mZJTzq.js +0 -32
  148. package/dist/TeamMemberList-BW4qqzC1.js +0 -32
  149. package/dist/TeamMemberParent-Wcht0pIz.js +0 -32
  150. package/dist/TeamNotesTab-aGD8O49y.js +0 -7
  151. package/dist/TeamParent-BkhaJwud.js +0 -32
  152. package/dist/UserListPage-C9zUjaOK.js +0 -4
  153. package/dist/UserProfilePage-D52_Q5yf.js +0 -7
  154. package/dist/VerifyEmail-5thal4d_.js +0 -7
  155. package/dist/VerifyEmail-CHfTzrHg.js.map +0 -1
  156. package/dist/ViewTeam-g7WhYvsR.js +0 -32
  157. package/dist/ViewTeamMember-ByCSsl5k.js +0 -32
  158. package/dist/src-B5eswi_J.js.map +0 -1
  159. package/dist/useReturnUrl-BBoPnDR3.js +0 -51
  160. package/dist/useReturnUrl-BBoPnDR3.js.map +0 -1
  161. /package/dist/{Appearance-CohgRf-_.js → Appearance-C3WguxT-.js} +0 -0
  162. /package/dist/{TeamMembersTab-CpE9BaCi.js → TeamMembersTab-DTJxmb-M.js} +0 -0
@@ -38,4 +38,4 @@ function useBreadcrumbs(getBreadcrumbs, useSegmentMode = false) {
38
38
 
39
39
  //#endregion
40
40
  export { useBreadcrumbs as n, BREADCRUMB_KEY as t };
41
- //# sourceMappingURL=useBreadcrumbs-B-W-miq6.js.map
41
+ //# sourceMappingURL=useBreadcrumbs-DmgSucoe.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useBreadcrumbs-B-W-miq6.js","names":[],"sources":["../src/composables/useBreadcrumbs.ts"],"sourcesContent":["import { inject, onUnmounted, watchEffect } from 'vue';\n\nexport const BREADCRUMB_KEY = Symbol('breadcrumbs');\n\nexport interface Breadcrumb {\n label: string;\n to: any;\n loading?: boolean;\n}\n\nexport interface BreadcrumbSegment {\n componentId: symbol;\n breadcrumbs: Breadcrumb[];\n}\n\nexport interface BreadcrumbContext {\n setBreadcrumbs: (breadcrumbs: Breadcrumb[] | null) => void;\n setBreadcrumbSegment: (componentId: symbol, breadcrumbs: Breadcrumb[] | null) => void;\n}\n\nlet componentIdCounter = 0;\n\n/**\n * Composable for components to set their own breadcrumbs\n * Accepts a function that returns breadcrumbs - handles reactivity automatically\n * Automatically clears breadcrumbs when component unmounts\n *\n * @param getBreadcrumbs - Function that returns breadcrumb array (reactive)\n * @param useSegmentMode - If true, uses the new segment-based system for nested breadcrumbs\n */\nexport function useBreadcrumbs(\n getBreadcrumbs: () => Breadcrumb[],\n useSegmentMode: boolean = false,\n) {\n const context = inject<BreadcrumbContext>(BREADCRUMB_KEY);\n\n if (!context) {\n console.warn(\n 'useBreadcrumbs: No breadcrumb context found. Make sure InApp.vue provides it.',\n );\n return;\n }\n\n if (useSegmentMode) {\n // Use segment-based mode for nested breadcrumbs\n const componentId = Symbol(`breadcrumb-${componentIdCounter++}`);\n\n watchEffect(() => {\n const breadcrumbs = getBreadcrumbs();\n context.setBreadcrumbSegment(componentId, breadcrumbs.length > 0 ? breadcrumbs : null);\n });\n\n onUnmounted(() => {\n context.setBreadcrumbSegment(componentId, null);\n });\n } else {\n // Legacy mode: single breadcrumb setter (for backward compatibility)\n watchEffect(() => {\n context.setBreadcrumbs(getBreadcrumbs());\n });\n\n onUnmounted(() => {\n context.setBreadcrumbs(null);\n });\n }\n}\n"],"mappings":";;;AAEA,MAAa,iBAAiB,OAAO,cAAc;AAkBnD,IAAI,qBAAqB;;;;;;;;;AAUzB,SAAgB,eACd,gBACA,iBAA0B,OAC1B;CACA,MAAM,UAAU,OAA0B,eAAe;AAEzD,KAAI,CAAC,SAAS;AACZ,UAAQ,KACN,gFACD;AACD;;AAGF,KAAI,gBAAgB;EAElB,MAAM,cAAc,OAAO,cAAc,uBAAuB;AAEhE,oBAAkB;GAChB,MAAM,cAAc,gBAAgB;AACpC,WAAQ,qBAAqB,aAAa,YAAY,SAAS,IAAI,cAAc,KAAK;IACtF;AAEF,oBAAkB;AAChB,WAAQ,qBAAqB,aAAa,KAAK;IAC/C;QACG;AAEL,oBAAkB;AAChB,WAAQ,eAAe,gBAAgB,CAAC;IACxC;AAEF,oBAAkB;AAChB,WAAQ,eAAe,KAAK;IAC5B"}
1
+ {"version":3,"file":"useBreadcrumbs-DmgSucoe.js","names":[],"sources":["../src/composables/useBreadcrumbs.ts"],"sourcesContent":["import { inject, onUnmounted, watchEffect } from 'vue';\n\nexport const BREADCRUMB_KEY = Symbol('breadcrumbs');\n\nexport interface Breadcrumb {\n label: string;\n to: any;\n loading?: boolean;\n}\n\nexport interface BreadcrumbSegment {\n componentId: symbol;\n breadcrumbs: Breadcrumb[];\n}\n\nexport interface BreadcrumbContext {\n setBreadcrumbs: (breadcrumbs: Breadcrumb[] | null) => void;\n setBreadcrumbSegment: (componentId: symbol, breadcrumbs: Breadcrumb[] | null) => void;\n}\n\nlet componentIdCounter = 0;\n\n/**\n * Composable for components to set their own breadcrumbs\n * Accepts a function that returns breadcrumbs - handles reactivity automatically\n * Automatically clears breadcrumbs when component unmounts\n *\n * @param getBreadcrumbs - Function that returns breadcrumb array (reactive)\n * @param useSegmentMode - If true, uses the new segment-based system for nested breadcrumbs\n */\nexport function useBreadcrumbs(\n getBreadcrumbs: () => Breadcrumb[],\n useSegmentMode: boolean = false,\n) {\n const context = inject<BreadcrumbContext>(BREADCRUMB_KEY);\n\n if (!context) {\n console.warn(\n 'useBreadcrumbs: No breadcrumb context found. Make sure InApp.vue provides it.',\n );\n return;\n }\n\n if (useSegmentMode) {\n // Use segment-based mode for nested breadcrumbs\n const componentId = Symbol(`breadcrumb-${componentIdCounter++}`);\n\n watchEffect(() => {\n const breadcrumbs = getBreadcrumbs();\n context.setBreadcrumbSegment(componentId, breadcrumbs.length > 0 ? breadcrumbs : null);\n });\n\n onUnmounted(() => {\n context.setBreadcrumbSegment(componentId, null);\n });\n } else {\n // Legacy mode: single breadcrumb setter (for backward compatibility)\n watchEffect(() => {\n context.setBreadcrumbs(getBreadcrumbs());\n });\n\n onUnmounted(() => {\n context.setBreadcrumbs(null);\n });\n }\n}\n"],"mappings":";;;AAEA,MAAa,iBAAiB,OAAO,cAAc;AAkBnD,IAAI,qBAAqB;;;;;;;;;AAUzB,SAAgB,eACd,gBACA,iBAA0B,OAC1B;CACA,MAAM,UAAU,OAA0B,eAAe;AAEzD,KAAI,CAAC,SAAS;AACZ,UAAQ,KACN,gFACD;AACD;;AAGF,KAAI,gBAAgB;EAElB,MAAM,cAAc,OAAO,cAAc,uBAAuB;AAEhE,oBAAkB;GAChB,MAAM,cAAc,gBAAgB;AACpC,WAAQ,qBAAqB,aAAa,YAAY,SAAS,IAAI,cAAc,KAAK;IACtF;AAEF,oBAAkB;AAChB,WAAQ,qBAAqB,aAAa,KAAK;IAC/C;QACG;AAEL,oBAAkB;AAChB,WAAQ,eAAe,gBAAgB,CAAC;IACxC;AAEF,oBAAkB;AAChB,WAAQ,eAAe,KAAK;IAC5B"}
@@ -1,5 +1,5 @@
1
- import { r as executeWithAuth, s as getRefreshTokenHandler } from "./useRpcAuth-SgNzCAPa.js";
2
- import { t as queryCache } from "./useQueryCache-DIGf3fCM.js";
1
+ import { r as executeWithAuth, s as getRefreshTokenHandler } from "./useRpcAuth-8Byr6SSI.js";
2
+ import { t as queryCache } from "./useQueryCache-CHG4-HGF.js";
3
3
  import { shallowRef } from "vue";
4
4
 
5
5
  //#region src/composables/useMutation.ts
@@ -47,4 +47,4 @@ function useMutation(mutationFn, options) {
47
47
 
48
48
  //#endregion
49
49
  export { useMutation as t };
50
- //# sourceMappingURL=useMutation-DzRSXPB1.js.map
50
+ //# sourceMappingURL=useMutation-DbzXtqf1.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useMutation-DzRSXPB1.js","names":[],"sources":["../src/composables/useMutation.ts"],"sourcesContent":["import type { DragoncoreApi } from '@dragonmastery/dragoncore-shared';\nimport { shallowRef, type ShallowRef } from 'vue';\nimport { getRefreshTokenHandler } from '../utils/EnhancedRefreshTokenHandler';\nimport type { MutationFunction, UseMutationOptions } from './types';\nimport { queryCache } from './useQueryCache';\nimport { executeWithAuth } from './useRpcAuth';\n\nexport interface UseMutationReturn<TInput, TOutput> {\n data: ShallowRef<TOutput | null>;\n loading: ShallowRef<boolean>;\n error: ShallowRef<Error | null>;\n mutate: (input: TInput) => Promise<TOutput>;\n reset: () => void;\n}\n\nexport function useMutation<\n TApi extends Record<string, any> = DragoncoreApi,\n TInput = any,\n TOutput = any,\n>(\n mutationFn: MutationFunction<TApi, TInput, TOutput>,\n options?: UseMutationOptions<TInput, TOutput>,\n): UseMutationReturn<TInput, TOutput> {\n // Get the global refresh token handler - Dragoncore handles this automatically\n const refreshTokenHandler = getRefreshTokenHandler();\n const loading = shallowRef(false);\n const error = shallowRef<Error | null>(null);\n const data = shallowRef<TOutput | null>(null);\n\n const mutate = async (input: TInput): Promise<TOutput> => {\n loading.value = true;\n error.value = null;\n\n try {\n // Skip auth check for public endpoints (signup) or login/logout operations\n const skipAuthCheck = options?.skipAuthCheck || options?.credentials === 'include';\n const result = await executeWithAuth<TApi, TOutput>(\n (batch) => mutationFn(batch, input),\n {\n credentials: options?.credentials,\n skipAuthCheck,\n refreshTokenHandler,\n },\n );\n data.value = result;\n\n // Invalidate related queries\n if (options?.invalidate) {\n if (Array.isArray(options.invalidate)) {\n options.invalidate.forEach((key) => queryCache.invalidate(key));\n } else {\n queryCache.invalidate(options.invalidate);\n }\n }\n\n // Call success callback\n if (options?.onSuccess) {\n options.onSuccess(result, input);\n }\n\n return result;\n } catch (e) {\n error.value = e instanceof Error ? e : new Error('Unknown error');\n\n // Call error callback\n if (options?.onError) {\n options.onError(error.value, input);\n }\n\n throw e;\n } finally {\n loading.value = false;\n }\n };\n\n const reset = () => {\n data.value = null;\n error.value = null;\n loading.value = false;\n };\n\n return { mutate, loading, error, data, reset };\n}\n"],"mappings":";;;;;AAeA,SAAgB,YAKd,YACA,SACoC;CAEpC,MAAM,sBAAsB,wBAAwB;CACpD,MAAM,UAAU,WAAW,MAAM;CACjC,MAAM,QAAQ,WAAyB,KAAK;CAC5C,MAAM,OAAO,WAA2B,KAAK;CAE7C,MAAM,SAAS,OAAO,UAAoC;AACxD,UAAQ,QAAQ;AAChB,QAAM,QAAQ;AAEd,MAAI;GAEF,MAAM,gBAAgB,SAAS,iBAAiB,SAAS,gBAAgB;GACzE,MAAM,SAAS,MAAM,iBAClB,UAAU,WAAW,OAAO,MAAM,EACnC;IACE,aAAa,SAAS;IACtB;IACA;IACD,CACF;AACD,QAAK,QAAQ;AAGb,OAAI,SAAS,WACX,KAAI,MAAM,QAAQ,QAAQ,WAAW,CACnC,SAAQ,WAAW,SAAS,QAAQ,WAAW,WAAW,IAAI,CAAC;OAE/D,YAAW,WAAW,QAAQ,WAAW;AAK7C,OAAI,SAAS,UACX,SAAQ,UAAU,QAAQ,MAAM;AAGlC,UAAO;WACA,GAAG;AACV,SAAM,QAAQ,aAAa,QAAQ,oBAAI,IAAI,MAAM,gBAAgB;AAGjE,OAAI,SAAS,QACX,SAAQ,QAAQ,MAAM,OAAO,MAAM;AAGrC,SAAM;YACE;AACR,WAAQ,QAAQ;;;CAIpB,MAAM,cAAc;AAClB,OAAK,QAAQ;AACb,QAAM,QAAQ;AACd,UAAQ,QAAQ;;AAGlB,QAAO;EAAE;EAAQ;EAAS;EAAO;EAAM;EAAO"}
1
+ {"version":3,"file":"useMutation-DbzXtqf1.js","names":[],"sources":["../src/composables/useMutation.ts"],"sourcesContent":["import type { DragoncoreApi } from '@dragonmastery/dragoncore-shared';\nimport { shallowRef, type ShallowRef } from 'vue';\nimport { getRefreshTokenHandler } from '../utils/EnhancedRefreshTokenHandler';\nimport type { MutationFunction, UseMutationOptions } from './types';\nimport { queryCache } from './useQueryCache';\nimport { executeWithAuth } from './useRpcAuth';\n\nexport interface UseMutationReturn<TInput, TOutput> {\n data: ShallowRef<TOutput | null>;\n loading: ShallowRef<boolean>;\n error: ShallowRef<Error | null>;\n mutate: (input: TInput) => Promise<TOutput>;\n reset: () => void;\n}\n\nexport function useMutation<\n TApi extends Record<string, any> = DragoncoreApi,\n TInput = any,\n TOutput = any,\n>(\n mutationFn: MutationFunction<TApi, TInput, TOutput>,\n options?: UseMutationOptions<TInput, TOutput>,\n): UseMutationReturn<TInput, TOutput> {\n // Get the global refresh token handler - Dragoncore handles this automatically\n const refreshTokenHandler = getRefreshTokenHandler();\n const loading = shallowRef(false);\n const error = shallowRef<Error | null>(null);\n const data = shallowRef<TOutput | null>(null);\n\n const mutate = async (input: TInput): Promise<TOutput> => {\n loading.value = true;\n error.value = null;\n\n try {\n // Skip auth check for public endpoints (signup) or login/logout operations\n const skipAuthCheck = options?.skipAuthCheck || options?.credentials === 'include';\n const result = await executeWithAuth<TApi, TOutput>(\n (batch) => mutationFn(batch, input),\n {\n credentials: options?.credentials,\n skipAuthCheck,\n refreshTokenHandler,\n },\n );\n data.value = result;\n\n // Invalidate related queries\n if (options?.invalidate) {\n if (Array.isArray(options.invalidate)) {\n options.invalidate.forEach((key) => queryCache.invalidate(key));\n } else {\n queryCache.invalidate(options.invalidate);\n }\n }\n\n // Call success callback\n if (options?.onSuccess) {\n options.onSuccess(result, input);\n }\n\n return result;\n } catch (e) {\n error.value = e instanceof Error ? e : new Error('Unknown error');\n\n // Call error callback\n if (options?.onError) {\n options.onError(error.value, input);\n }\n\n throw e;\n } finally {\n loading.value = false;\n }\n };\n\n const reset = () => {\n data.value = null;\n error.value = null;\n loading.value = false;\n };\n\n return { mutate, loading, error, data, reset };\n}\n"],"mappings":";;;;;AAeA,SAAgB,YAKd,YACA,SACoC;CAEpC,MAAM,sBAAsB,wBAAwB;CACpD,MAAM,UAAU,WAAW,MAAM;CACjC,MAAM,QAAQ,WAAyB,KAAK;CAC5C,MAAM,OAAO,WAA2B,KAAK;CAE7C,MAAM,SAAS,OAAO,UAAoC;AACxD,UAAQ,QAAQ;AAChB,QAAM,QAAQ;AAEd,MAAI;GAEF,MAAM,gBAAgB,SAAS,iBAAiB,SAAS,gBAAgB;GACzE,MAAM,SAAS,MAAM,iBAClB,UAAU,WAAW,OAAO,MAAM,EACnC;IACE,aAAa,SAAS;IACtB;IACA;IACD,CACF;AACD,QAAK,QAAQ;AAGb,OAAI,SAAS,WACX,KAAI,MAAM,QAAQ,QAAQ,WAAW,CACnC,SAAQ,WAAW,SAAS,QAAQ,WAAW,WAAW,IAAI,CAAC;OAE/D,YAAW,WAAW,QAAQ,WAAW;AAK7C,OAAI,SAAS,UACX,SAAQ,UAAU,QAAQ,MAAM;AAGlC,UAAO;WACA,GAAG;AACV,SAAM,QAAQ,aAAa,QAAQ,oBAAI,IAAI,MAAM,gBAAgB;AAGjE,OAAI,SAAS,QACX,SAAQ,QAAQ,MAAM,OAAO,MAAM;AAGrC,SAAM;YACE;AACR,WAAQ,QAAQ;;;CAIpB,MAAM,cAAc;AAClB,OAAK,QAAQ;AACb,QAAM,QAAQ;AACd,UAAQ,QAAQ;;AAGlB,QAAO;EAAE;EAAQ;EAAS;EAAO;EAAM;EAAO"}
@@ -1,5 +1,5 @@
1
- import { f as logIfEnabled, r as executeWithAuth, s as getRefreshTokenHandler } from "./useRpcAuth-SgNzCAPa.js";
2
- import { t as queryCache } from "./useQueryCache-DIGf3fCM.js";
1
+ import { f as logIfEnabled, r as executeWithAuth, s as getRefreshTokenHandler } from "./useRpcAuth-8Byr6SSI.js";
2
+ import { t as queryCache } from "./useQueryCache-CHG4-HGF.js";
3
3
  import { onMounted, onUnmounted, shallowRef, watch } from "vue";
4
4
 
5
5
  //#region src/composables/useQuery.ts
@@ -104,4 +104,4 @@ function useQuery(queryFn, options) {
104
104
 
105
105
  //#endregion
106
106
  export { useQuery as t };
107
- //# sourceMappingURL=useQuery-bvJabe9Q.js.map
107
+ //# sourceMappingURL=useQuery-BKb5JXVS.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useQuery-bvJabe9Q.js","names":[],"sources":["../src/composables/useQuery.ts"],"sourcesContent":["import type { DragoncoreApi } from '@dragonmastery/dragoncore-shared';\nimport { onMounted, onUnmounted, shallowRef, type ShallowRef, watch } from 'vue';\nimport { getRefreshTokenHandler } from '../utils/EnhancedRefreshTokenHandler';\nimport { logIfEnabled } from '../utils/logger';\nimport type { QueryFunction, UseQueryOptions } from './types';\nimport { queryCache } from './useQueryCache';\nimport { executeWithAuth } from './useRpcAuth';\n\nexport interface UseQueryReturn<T> {\n data: ShallowRef<T | null>;\n loading: ShallowRef<boolean>;\n error: ShallowRef<Error | null>;\n dataUpdatedAt: ShallowRef<number>;\n execute: () => Promise<void>;\n refetch: () => Promise<void>;\n}\n\nexport function useQuery<TApi extends Record<string, any> = DragoncoreApi, T = any>(\n queryFn: QueryFunction<TApi, T>,\n options?: UseQueryOptions,\n): UseQueryReturn<T> {\n // Get the global refresh token handler - Dragoncore handles this automatically\n const refreshTokenHandler = getRefreshTokenHandler();\n\n const data = shallowRef<T | null>(null);\n const loading = shallowRef(options?.immediate !== false);\n const error = shallowRef<Error | null>(null);\n const dataUpdatedAt = shallowRef<number>(0);\n // Internal flag to prevent duplicate background fetches (not exposed to consumers)\n let isBackgroundFetching = false;\n // Default debug to false if not specified\n const debug = options?.debug ?? false;\n // Default persist to true when cacheKey is provided (localStorage persistence is default)\n // Set persist: false to disable localStorage persistence (in-memory caching still works)\n const persist = options?.persist ?? (options?.cacheKey ? true : false);\n\n const execute = async (skipCache = false) => {\n const isEnabled =\n typeof options?.enabled === 'boolean'\n ? options?.enabled\n : (options?.enabled?.value ?? true);\n\n if (!isEnabled) {\n loading.value = false;\n return;\n }\n\n loading.value = true;\n error.value = null;\n\n // Check cache first (unless explicitly skipping)\n if (options?.cacheKey && !skipCache) {\n const cached = queryCache.get<T>(options.cacheKey, {\n staleTime: options?.staleTime,\n persist: persist,\n debug: debug,\n });\n\n if (cached !== null) {\n logIfEnabled('debug', `[Query] Cache HIT: ${options.cacheKey}`, debug);\n data.value = cached;\n loading.value = false;\n\n // Optionally fetch fresh data in background if refetchOnWindowFocus\n if (options?.refetchOnWindowFocus) {\n executeInBackground();\n }\n return;\n }\n logIfEnabled('debug', `[Query] Cache MISS: ${options.cacheKey}`, debug);\n }\n\n try {\n const result = await executeWithAuth<TApi, T>((batch) => queryFn(batch), {\n credentials: options?.credentials,\n skipAuthCheck: false, // Queries always need auth\n mode: options?.batchMode,\n trackedSegment: options?.trackedSegment, // Pass through the tracked segment\n refreshTokenHandler,\n });\n data.value = result;\n dataUpdatedAt.value = Date.now();\n\n // Cache the result\n if (options?.cacheKey) {\n queryCache.set(options.cacheKey, result, {\n staleTime: options?.staleTime,\n persist: persist,\n debug: options?.debug,\n });\n }\n } catch (e) {\n error.value = e instanceof Error ? e : new Error('Unknown error');\n data.value = null;\n } finally {\n loading.value = false;\n }\n };\n\n const executeInBackground = async () => {\n if (isBackgroundFetching || loading.value) return; // Don't fetch if already fetching\n\n isBackgroundFetching = true;\n try {\n const result = await executeWithAuth<TApi, T>((batch) => queryFn(batch), {\n credentials: options?.credentials,\n skipAuthCheck: false, // Queries always need auth\n mode: options?.batchMode ? 'batch' : 'tracked',\n trackedSegment: options?.trackedSegment, // Pass through the tracked segment\n refreshTokenHandler,\n });\n data.value = result;\n dataUpdatedAt.value = Date.now();\n\n if (options?.cacheKey) {\n queryCache.set(options.cacheKey, result, {\n staleTime: options?.staleTime,\n persist: persist,\n debug: debug,\n });\n }\n } catch (e) {\n // Silent failure for background refetch\n logIfEnabled('error', '[Query] Background refetch failed:', debug, e);\n } finally {\n isBackgroundFetching = false;\n }\n };\n\n // Auto-execute on mount\n if (options?.immediate !== false) {\n onMounted(execute);\n }\n\n // Refetch on window focus\n if (options?.refetchOnWindowFocus) {\n const handleFocus = () => {\n if (data.value !== null) {\n executeInBackground();\n }\n };\n onMounted(() => window.addEventListener('focus', handleFocus));\n onUnmounted(() => window.removeEventListener('focus', handleFocus));\n }\n\n // Watch for changes\n if (options?.watch) {\n const watchTargets = Array.isArray(options.watch) ? options.watch : [options.watch];\n watch(watchTargets, () => execute());\n }\n\n // Watch enabled state\n if (options?.enabled && typeof options?.enabled !== 'boolean') {\n watch(options?.enabled, (isEnabled) => {\n if (isEnabled) execute();\n });\n }\n\n return {\n data,\n loading,\n error,\n dataUpdatedAt,\n execute: () => execute(),\n refetch: () => execute(true), // Skip cache on manual refetch\n };\n}\n"],"mappings":";;;;;AAiBA,SAAgB,SACd,SACA,SACmB;CAEnB,MAAM,sBAAsB,wBAAwB;CAEpD,MAAM,OAAO,WAAqB,KAAK;CACvC,MAAM,UAAU,WAAW,SAAS,cAAc,MAAM;CACxD,MAAM,QAAQ,WAAyB,KAAK;CAC5C,MAAM,gBAAgB,WAAmB,EAAE;CAE3C,IAAI,uBAAuB;CAE3B,MAAM,QAAQ,SAAS,SAAS;CAGhC,MAAM,UAAU,SAAS,YAAY,SAAS,WAAW,OAAO;CAEhE,MAAM,UAAU,OAAO,YAAY,UAAU;AAM3C,MAAI,EAJF,OAAO,SAAS,YAAY,YACxB,SAAS,UACR,SAAS,SAAS,SAAS,OAElB;AACd,WAAQ,QAAQ;AAChB;;AAGF,UAAQ,QAAQ;AAChB,QAAM,QAAQ;AAGd,MAAI,SAAS,YAAY,CAAC,WAAW;GACnC,MAAM,SAAS,WAAW,IAAO,QAAQ,UAAU;IACjD,WAAW,SAAS;IACX;IACF;IACR,CAAC;AAEF,OAAI,WAAW,MAAM;AACnB,iBAAa,SAAS,sBAAsB,QAAQ,YAAY,MAAM;AACtE,SAAK,QAAQ;AACb,YAAQ,QAAQ;AAGhB,QAAI,SAAS,qBACX,sBAAqB;AAEvB;;AAEF,gBAAa,SAAS,uBAAuB,QAAQ,YAAY,MAAM;;AAGzE,MAAI;GACF,MAAM,SAAS,MAAM,iBAA0B,UAAU,QAAQ,MAAM,EAAE;IACvE,aAAa,SAAS;IACtB,eAAe;IACf,MAAM,SAAS;IACf,gBAAgB,SAAS;IACzB;IACD,CAAC;AACF,QAAK,QAAQ;AACb,iBAAc,QAAQ,KAAK,KAAK;AAGhC,OAAI,SAAS,SACX,YAAW,IAAI,QAAQ,UAAU,QAAQ;IACvC,WAAW,SAAS;IACX;IACT,OAAO,SAAS;IACjB,CAAC;WAEG,GAAG;AACV,SAAM,QAAQ,aAAa,QAAQ,oBAAI,IAAI,MAAM,gBAAgB;AACjE,QAAK,QAAQ;YACL;AACR,WAAQ,QAAQ;;;CAIpB,MAAM,sBAAsB,YAAY;AACtC,MAAI,wBAAwB,QAAQ,MAAO;AAE3C,yBAAuB;AACvB,MAAI;GACF,MAAM,SAAS,MAAM,iBAA0B,UAAU,QAAQ,MAAM,EAAE;IACvE,aAAa,SAAS;IACtB,eAAe;IACf,MAAM,SAAS,YAAY,UAAU;IACrC,gBAAgB,SAAS;IACzB;IACD,CAAC;AACF,QAAK,QAAQ;AACb,iBAAc,QAAQ,KAAK,KAAK;AAEhC,OAAI,SAAS,SACX,YAAW,IAAI,QAAQ,UAAU,QAAQ;IACvC,WAAW,SAAS;IACX;IACF;IACR,CAAC;WAEG,GAAG;AAEV,gBAAa,SAAS,sCAAsC,OAAO,EAAE;YAC7D;AACR,0BAAuB;;;AAK3B,KAAI,SAAS,cAAc,MACzB,WAAU,QAAQ;AAIpB,KAAI,SAAS,sBAAsB;EACjC,MAAM,oBAAoB;AACxB,OAAI,KAAK,UAAU,KACjB,sBAAqB;;AAGzB,kBAAgB,OAAO,iBAAiB,SAAS,YAAY,CAAC;AAC9D,oBAAkB,OAAO,oBAAoB,SAAS,YAAY,CAAC;;AAIrE,KAAI,SAAS,MAEX,OADqB,MAAM,QAAQ,QAAQ,MAAM,GAAG,QAAQ,QAAQ,CAAC,QAAQ,MAAM,QACzD,SAAS,CAAC;AAItC,KAAI,SAAS,WAAW,OAAO,SAAS,YAAY,UAClD,OAAM,SAAS,UAAU,cAAc;AACrC,MAAI,UAAW,UAAS;GACxB;AAGJ,QAAO;EACL;EACA;EACA;EACA;EACA,eAAe,SAAS;EACxB,eAAe,QAAQ,KAAK;EAC7B"}
1
+ {"version":3,"file":"useQuery-BKb5JXVS.js","names":[],"sources":["../src/composables/useQuery.ts"],"sourcesContent":["import type { DragoncoreApi } from '@dragonmastery/dragoncore-shared';\nimport { onMounted, onUnmounted, shallowRef, type ShallowRef, watch } from 'vue';\nimport { getRefreshTokenHandler } from '../utils/EnhancedRefreshTokenHandler';\nimport { logIfEnabled } from '../utils/logger';\nimport type { QueryFunction, UseQueryOptions } from './types';\nimport { queryCache } from './useQueryCache';\nimport { executeWithAuth } from './useRpcAuth';\n\nexport interface UseQueryReturn<T> {\n data: ShallowRef<T | null>;\n loading: ShallowRef<boolean>;\n error: ShallowRef<Error | null>;\n dataUpdatedAt: ShallowRef<number>;\n execute: () => Promise<void>;\n refetch: () => Promise<void>;\n}\n\nexport function useQuery<TApi extends Record<string, any> = DragoncoreApi, T = any>(\n queryFn: QueryFunction<TApi, T>,\n options?: UseQueryOptions,\n): UseQueryReturn<T> {\n // Get the global refresh token handler - Dragoncore handles this automatically\n const refreshTokenHandler = getRefreshTokenHandler();\n\n const data = shallowRef<T | null>(null);\n const loading = shallowRef(options?.immediate !== false);\n const error = shallowRef<Error | null>(null);\n const dataUpdatedAt = shallowRef<number>(0);\n // Internal flag to prevent duplicate background fetches (not exposed to consumers)\n let isBackgroundFetching = false;\n // Default debug to false if not specified\n const debug = options?.debug ?? false;\n // Default persist to true when cacheKey is provided (localStorage persistence is default)\n // Set persist: false to disable localStorage persistence (in-memory caching still works)\n const persist = options?.persist ?? (options?.cacheKey ? true : false);\n\n const execute = async (skipCache = false) => {\n const isEnabled =\n typeof options?.enabled === 'boolean'\n ? options?.enabled\n : (options?.enabled?.value ?? true);\n\n if (!isEnabled) {\n loading.value = false;\n return;\n }\n\n loading.value = true;\n error.value = null;\n\n // Check cache first (unless explicitly skipping)\n if (options?.cacheKey && !skipCache) {\n const cached = queryCache.get<T>(options.cacheKey, {\n staleTime: options?.staleTime,\n persist: persist,\n debug: debug,\n });\n\n if (cached !== null) {\n logIfEnabled('debug', `[Query] Cache HIT: ${options.cacheKey}`, debug);\n data.value = cached;\n loading.value = false;\n\n // Optionally fetch fresh data in background if refetchOnWindowFocus\n if (options?.refetchOnWindowFocus) {\n executeInBackground();\n }\n return;\n }\n logIfEnabled('debug', `[Query] Cache MISS: ${options.cacheKey}`, debug);\n }\n\n try {\n const result = await executeWithAuth<TApi, T>((batch) => queryFn(batch), {\n credentials: options?.credentials,\n skipAuthCheck: false, // Queries always need auth\n mode: options?.batchMode,\n trackedSegment: options?.trackedSegment, // Pass through the tracked segment\n refreshTokenHandler,\n });\n data.value = result;\n dataUpdatedAt.value = Date.now();\n\n // Cache the result\n if (options?.cacheKey) {\n queryCache.set(options.cacheKey, result, {\n staleTime: options?.staleTime,\n persist: persist,\n debug: options?.debug,\n });\n }\n } catch (e) {\n error.value = e instanceof Error ? e : new Error('Unknown error');\n data.value = null;\n } finally {\n loading.value = false;\n }\n };\n\n const executeInBackground = async () => {\n if (isBackgroundFetching || loading.value) return; // Don't fetch if already fetching\n\n isBackgroundFetching = true;\n try {\n const result = await executeWithAuth<TApi, T>((batch) => queryFn(batch), {\n credentials: options?.credentials,\n skipAuthCheck: false, // Queries always need auth\n mode: options?.batchMode ? 'batch' : 'tracked',\n trackedSegment: options?.trackedSegment, // Pass through the tracked segment\n refreshTokenHandler,\n });\n data.value = result;\n dataUpdatedAt.value = Date.now();\n\n if (options?.cacheKey) {\n queryCache.set(options.cacheKey, result, {\n staleTime: options?.staleTime,\n persist: persist,\n debug: debug,\n });\n }\n } catch (e) {\n // Silent failure for background refetch\n logIfEnabled('error', '[Query] Background refetch failed:', debug, e);\n } finally {\n isBackgroundFetching = false;\n }\n };\n\n // Auto-execute on mount\n if (options?.immediate !== false) {\n onMounted(execute);\n }\n\n // Refetch on window focus\n if (options?.refetchOnWindowFocus) {\n const handleFocus = () => {\n if (data.value !== null) {\n executeInBackground();\n }\n };\n onMounted(() => window.addEventListener('focus', handleFocus));\n onUnmounted(() => window.removeEventListener('focus', handleFocus));\n }\n\n // Watch for changes\n if (options?.watch) {\n const watchTargets = Array.isArray(options.watch) ? options.watch : [options.watch];\n watch(watchTargets, () => execute());\n }\n\n // Watch enabled state\n if (options?.enabled && typeof options?.enabled !== 'boolean') {\n watch(options?.enabled, (isEnabled) => {\n if (isEnabled) execute();\n });\n }\n\n return {\n data,\n loading,\n error,\n dataUpdatedAt,\n execute: () => execute(),\n refetch: () => execute(true), // Skip cache on manual refetch\n };\n}\n"],"mappings":";;;;;AAiBA,SAAgB,SACd,SACA,SACmB;CAEnB,MAAM,sBAAsB,wBAAwB;CAEpD,MAAM,OAAO,WAAqB,KAAK;CACvC,MAAM,UAAU,WAAW,SAAS,cAAc,MAAM;CACxD,MAAM,QAAQ,WAAyB,KAAK;CAC5C,MAAM,gBAAgB,WAAmB,EAAE;CAE3C,IAAI,uBAAuB;CAE3B,MAAM,QAAQ,SAAS,SAAS;CAGhC,MAAM,UAAU,SAAS,YAAY,SAAS,WAAW,OAAO;CAEhE,MAAM,UAAU,OAAO,YAAY,UAAU;AAM3C,MAAI,EAJF,OAAO,SAAS,YAAY,YACxB,SAAS,UACR,SAAS,SAAS,SAAS,OAElB;AACd,WAAQ,QAAQ;AAChB;;AAGF,UAAQ,QAAQ;AAChB,QAAM,QAAQ;AAGd,MAAI,SAAS,YAAY,CAAC,WAAW;GACnC,MAAM,SAAS,WAAW,IAAO,QAAQ,UAAU;IACjD,WAAW,SAAS;IACX;IACF;IACR,CAAC;AAEF,OAAI,WAAW,MAAM;AACnB,iBAAa,SAAS,sBAAsB,QAAQ,YAAY,MAAM;AACtE,SAAK,QAAQ;AACb,YAAQ,QAAQ;AAGhB,QAAI,SAAS,qBACX,sBAAqB;AAEvB;;AAEF,gBAAa,SAAS,uBAAuB,QAAQ,YAAY,MAAM;;AAGzE,MAAI;GACF,MAAM,SAAS,MAAM,iBAA0B,UAAU,QAAQ,MAAM,EAAE;IACvE,aAAa,SAAS;IACtB,eAAe;IACf,MAAM,SAAS;IACf,gBAAgB,SAAS;IACzB;IACD,CAAC;AACF,QAAK,QAAQ;AACb,iBAAc,QAAQ,KAAK,KAAK;AAGhC,OAAI,SAAS,SACX,YAAW,IAAI,QAAQ,UAAU,QAAQ;IACvC,WAAW,SAAS;IACX;IACT,OAAO,SAAS;IACjB,CAAC;WAEG,GAAG;AACV,SAAM,QAAQ,aAAa,QAAQ,oBAAI,IAAI,MAAM,gBAAgB;AACjE,QAAK,QAAQ;YACL;AACR,WAAQ,QAAQ;;;CAIpB,MAAM,sBAAsB,YAAY;AACtC,MAAI,wBAAwB,QAAQ,MAAO;AAE3C,yBAAuB;AACvB,MAAI;GACF,MAAM,SAAS,MAAM,iBAA0B,UAAU,QAAQ,MAAM,EAAE;IACvE,aAAa,SAAS;IACtB,eAAe;IACf,MAAM,SAAS,YAAY,UAAU;IACrC,gBAAgB,SAAS;IACzB;IACD,CAAC;AACF,QAAK,QAAQ;AACb,iBAAc,QAAQ,KAAK,KAAK;AAEhC,OAAI,SAAS,SACX,YAAW,IAAI,QAAQ,UAAU,QAAQ;IACvC,WAAW,SAAS;IACX;IACF;IACR,CAAC;WAEG,GAAG;AAEV,gBAAa,SAAS,sCAAsC,OAAO,EAAE;YAC7D;AACR,0BAAuB;;;AAK3B,KAAI,SAAS,cAAc,MACzB,WAAU,QAAQ;AAIpB,KAAI,SAAS,sBAAsB;EACjC,MAAM,oBAAoB;AACxB,OAAI,KAAK,UAAU,KACjB,sBAAqB;;AAGzB,kBAAgB,OAAO,iBAAiB,SAAS,YAAY,CAAC;AAC9D,oBAAkB,OAAO,oBAAoB,SAAS,YAAY,CAAC;;AAIrE,KAAI,SAAS,MAEX,OADqB,MAAM,QAAQ,QAAQ,MAAM,GAAG,QAAQ,QAAQ,CAAC,QAAQ,MAAM,QACzD,SAAS,CAAC;AAItC,KAAI,SAAS,WAAW,OAAO,SAAS,YAAY,UAClD,OAAM,SAAS,UAAU,cAAc;AACrC,MAAI,UAAW,UAAS;GACxB;AAGJ,QAAO;EACL;EACA;EACA;EACA;EACA,eAAe,SAAS;EACxB,eAAe,QAAQ,KAAK;EAC7B"}
@@ -1,4 +1,4 @@
1
- import { f as logIfEnabled, p as logger } from "./useRpcAuth-SgNzCAPa.js";
1
+ import { f as logIfEnabled, p as logger } from "./useRpcAuth-8Byr6SSI.js";
2
2
 
3
3
  //#region src/composables/useQueryCache.ts
4
4
  var QueryCache = class {
@@ -251,4 +251,4 @@ if (import.meta.env.DEV) {
251
251
 
252
252
  //#endregion
253
253
  export { queryCache as t };
254
- //# sourceMappingURL=useQueryCache-DIGf3fCM.js.map
254
+ //# sourceMappingURL=useQueryCache-CHG4-HGF.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useQueryCache-DIGf3fCM.js","names":["keysToRemove: string[]","entry: CacheEntry<T>","entries: Record<\n string,\n {\n data: any;\n ageMs: number;\n expiresInMs: number;\n isExpired: boolean;\n source: 'memory' | 'storage';\n }\n >","entries: [string, number][]"],"sources":["../src/composables/useQueryCache.ts"],"sourcesContent":["import { logger, logIfEnabled } from '../utils/logger';\n\ninterface CacheEntry<T> {\n data: T;\n timestamp: number;\n expiresAt: number;\n}\n\ninterface CacheOptions {\n staleTime?: number; // How long data is fresh (ms), default 5 minutes\n persist?: boolean; // Save to localStorage\n debug?: boolean; // Enable/disable debug logging for this cache operation (default: false)\n}\n\nclass QueryCache {\n private memoryCache = new Map<string, CacheEntry<any>>();\n private readonly BUILD_TAG = import.meta.env.VITE_BUILD_TAG || 'dev';\n private readonly STORAGE_PREFIX = `rpc-cache:${this.BUILD_TAG}:`;\n private readonly BUILD_TAG_KEY = 'rpc-cache-build-tag';\n private cleanupTimers = new Map<string, number>();\n\n constructor() {\n // Check if this is a new deployment and clear old cache\n this.handleDeploymentChange();\n\n // Clean up expired localStorage entries on init\n this.cleanExpiredStorage();\n }\n\n /**\n * Detect deployment changes and clear old cache\n */\n private handleDeploymentChange() {\n const lastBuildTag = localStorage.getItem(this.BUILD_TAG_KEY);\n\n // If build tag is missing, clear all cache (first load or manual clear)\n if (!lastBuildTag) {\n // Use global log level for deployment change detection\n logger.debug('[Cache] Build tag missing - clearing all cache');\n this.clearAllStorage();\n }\n // If deployment changed, clear old cache from previous build\n else if (lastBuildTag !== this.BUILD_TAG) {\n // Use global log level for deployment change detection\n logger.debug(`[Cache] New deployment detected: ${lastBuildTag} → ${this.BUILD_TAG}`);\n logger.debug('[Cache] Clearing old cache from previous deployment');\n\n // Clear all old cache entries (from previous build tag)\n this.clearAllOldDeploymentCache(lastBuildTag);\n }\n\n // Store current build tag\n localStorage.setItem(this.BUILD_TAG_KEY, this.BUILD_TAG);\n }\n\n /**\n * Clear cache from previous deployment\n */\n private clearAllOldDeploymentCache(oldBuildTag: string) {\n const oldPrefix = `rpc-cache:${oldBuildTag}:`;\n const keysToRemove: string[] = [];\n\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(oldPrefix)) {\n keysToRemove.push(key);\n }\n }\n\n keysToRemove.forEach((key) => localStorage.removeItem(key));\n\n if (keysToRemove.length > 0) {\n // Use global log level for deployment change detection\n logger.debug(`[Cache] Removed ${keysToRemove.length} entries from previous deployment`);\n }\n }\n\n /**\n * Get data from cache (memory first, then localStorage if persist enabled)\n */\n get<T>(key: string, options: CacheOptions = {}): T | null {\n const now = Date.now();\n const debug = options.debug ?? false;\n\n // 1. Try memory cache first\n const memoryEntry = this.memoryCache.get(key);\n if (memoryEntry) {\n if (now < memoryEntry.expiresAt) {\n return memoryEntry.data as T;\n }\n // Expired in memory\n this.memoryCache.delete(key);\n }\n\n // 2. Try localStorage if persist is enabled\n if (options.persist) {\n const storageEntry = this.getFromStorage<T>(key, debug);\n if (storageEntry) {\n if (now < storageEntry.expiresAt) {\n // Rehydrate to memory cache\n this.memoryCache.set(key, storageEntry);\n return storageEntry.data;\n }\n // Expired in storage\n this.removeFromStorage(key);\n }\n }\n\n return null;\n }\n\n /**\n * Set data in cache (memory and optionally localStorage)\n */\n set<T>(key: string, data: T, options: CacheOptions = {}) {\n const staleTime = options.staleTime ?? 300000; // Default 5 minutes\n const debug = options.debug ?? false;\n const entry: CacheEntry<T> = {\n data,\n timestamp: Date.now(),\n expiresAt: Date.now() + staleTime,\n };\n\n // 1. Set in memory\n this.memoryCache.set(key, entry);\n\n // 2. Persist to localStorage if enabled\n if (options.persist) {\n this.setInStorage(key, entry, debug);\n }\n\n // 3. Schedule automatic cleanup\n this.scheduleCleanup(key, staleTime);\n }\n\n /**\n * Invalidate cache entries matching a pattern\n */\n invalidate(pattern: string | RegExp, debug: boolean = false) {\n const keysToRemove: string[] = [];\n\n // Find matching keys in memory\n for (const key of this.memoryCache.keys()) {\n if (this.matchesPattern(key, pattern)) {\n keysToRemove.push(key);\n }\n }\n\n // Remove from memory and storage\n keysToRemove.forEach((key) => {\n this.memoryCache.delete(key);\n this.removeFromStorage(key);\n this.cancelCleanup(key);\n });\n\n logIfEnabled(\n 'debug',\n `[Cache] Invalidated ${keysToRemove.length} entries matching:`,\n debug,\n pattern,\n );\n }\n\n /**\n * Clear all cache entries\n */\n clear(debug: boolean = false) {\n // Clear memory\n this.memoryCache.clear();\n\n // Clear all cleanup timers\n for (const timer of this.cleanupTimers.values()) {\n clearTimeout(timer);\n }\n this.cleanupTimers.clear();\n\n // Clear localStorage\n this.clearAllStorage();\n\n logIfEnabled('debug', '[Cache] Cleared all entries', debug);\n }\n\n /**\n * Get cache statistics (for debugging)\n */\n inspect() {\n const entries: Record<\n string,\n {\n data: any;\n ageMs: number;\n expiresInMs: number;\n isExpired: boolean;\n source: 'memory' | 'storage';\n }\n > = {};\n\n const now = Date.now();\n\n // Memory entries\n for (const [key, value] of this.memoryCache.entries()) {\n entries[key] = {\n data: value.data,\n ageMs: now - value.timestamp,\n expiresInMs: value.expiresAt - now,\n isExpired: now > value.expiresAt,\n source: 'memory',\n };\n }\n\n // Storage entries not in memory\n for (let i = 0; i < localStorage.length; i++) {\n const storageKey = localStorage.key(i);\n if (storageKey?.startsWith(this.STORAGE_PREFIX)) {\n const key = storageKey.substring(this.STORAGE_PREFIX.length);\n if (!entries[key]) {\n try {\n const entry = JSON.parse(localStorage.getItem(storageKey)!) as CacheEntry<any>;\n entries[key] = {\n data: entry.data,\n ageMs: now - entry.timestamp,\n expiresInMs: entry.expiresAt - now,\n isExpired: now > entry.expiresAt,\n source: 'storage',\n };\n } catch {\n // Ignore parse errors\n }\n }\n }\n }\n\n return {\n totalEntries: Object.keys(entries).length,\n memoryEntries: Array.from(this.memoryCache.keys()).length,\n storageEntries: this.countStorageEntries(),\n entries,\n };\n }\n\n /**\n * Get size of cache in localStorage (approximate)\n */\n getStorageSize(): number {\n let size = 0;\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(this.STORAGE_PREFIX)) {\n const value = localStorage.getItem(key);\n if (value) {\n size += key.length + value.length;\n }\n }\n }\n return size;\n }\n\n // Private methods\n\n private getFromStorage<T>(key: string, debug: boolean = false): CacheEntry<T> | null {\n try {\n const stored = localStorage.getItem(this.STORAGE_PREFIX + key);\n if (!stored) return null;\n\n const entry = JSON.parse(stored) as CacheEntry<T>;\n return entry;\n } catch (error) {\n logIfEnabled('error', '[Cache] Error reading from storage:', debug, error);\n return null;\n }\n }\n\n private setInStorage<T>(key: string, entry: CacheEntry<T>, debug: boolean = false) {\n try {\n localStorage.setItem(this.STORAGE_PREFIX + key, JSON.stringify(entry));\n } catch (error) {\n // Handle quota exceeded\n if (error instanceof DOMException && error.name === 'QuotaExceededError') {\n logIfEnabled('warn', '[Cache] Storage quota exceeded, clearing old entries', debug);\n this.clearOldestStorageEntries(debug);\n // Try again\n try {\n localStorage.setItem(this.STORAGE_PREFIX + key, JSON.stringify(entry));\n } catch (retryError) {\n logIfEnabled('error', '[Cache] Still cannot write to storage after cleanup', debug);\n }\n } else {\n logIfEnabled('error', '[Cache] Error writing to storage:', debug, error);\n }\n }\n }\n\n private removeFromStorage(key: string) {\n localStorage.removeItem(this.STORAGE_PREFIX + key);\n }\n\n private clearAllStorage() {\n const keysToRemove: string[] = [];\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(this.STORAGE_PREFIX)) {\n keysToRemove.push(key);\n }\n }\n keysToRemove.forEach((key) => localStorage.removeItem(key));\n }\n\n private cleanExpiredStorage() {\n const now = Date.now();\n const keysToRemove: string[] = [];\n\n for (let i = 0; i < localStorage.length; i++) {\n const storageKey = localStorage.key(i);\n if (storageKey?.startsWith(this.STORAGE_PREFIX)) {\n try {\n const entry = JSON.parse(localStorage.getItem(storageKey)!) as CacheEntry<any>;\n if (now > entry.expiresAt) {\n keysToRemove.push(storageKey);\n }\n } catch {\n // Remove corrupted entries\n keysToRemove.push(storageKey);\n }\n }\n }\n\n keysToRemove.forEach((key) => localStorage.removeItem(key));\n if (keysToRemove.length > 0) {\n // Use global log level for internal cleanup operations\n logger.debug(`[Cache] Cleaned up ${keysToRemove.length} expired storage entries`);\n }\n }\n\n private clearOldestStorageEntries(debug: boolean = false) {\n const entries: [string, number][] = [];\n\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(this.STORAGE_PREFIX)) {\n try {\n const entry = JSON.parse(localStorage.getItem(key)!) as CacheEntry<any>;\n entries.push([key, entry.timestamp]);\n } catch {\n // Remove corrupted entries\n localStorage.removeItem(key);\n }\n }\n }\n\n // Sort by timestamp (oldest first) and remove oldest 25%\n entries.sort((a, b) => a[1] - b[1]);\n const toRemove = Math.ceil(entries.length * 0.25);\n entries.slice(0, toRemove).forEach(([key]) => {\n localStorage.removeItem(key);\n });\n\n logIfEnabled('debug', `[Cache] Removed ${toRemove} oldest entries to free space`, debug);\n }\n\n private scheduleCleanup(key: string, delay: number) {\n // Cancel existing cleanup if any\n this.cancelCleanup(key);\n\n // Schedule new cleanup\n const timer = setTimeout(() => {\n this.memoryCache.delete(key);\n this.cleanupTimers.delete(key);\n }, delay);\n\n this.cleanupTimers.set(key, timer);\n }\n\n private cancelCleanup(key: string) {\n const timer = this.cleanupTimers.get(key);\n if (timer) {\n clearTimeout(timer);\n this.cleanupTimers.delete(key);\n }\n }\n\n private matchesPattern(key: string, pattern: string | RegExp): boolean {\n if (typeof pattern === 'string') {\n // Exact match or prefix match\n return key === pattern || key.startsWith(pattern);\n }\n return pattern.test(key);\n }\n\n private countStorageEntries(): number {\n let count = 0;\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(this.STORAGE_PREFIX)) {\n count++;\n }\n }\n return count;\n }\n}\n\n// Singleton instance\nexport const queryCache = new QueryCache();\n\n// Expose for debugging in dev mode\nif (import.meta.env.DEV) {\n (window as any).__queryCache = queryCache;\n // Always log this in dev mode\n logger.debug('[Cache] Debug available: window.__queryCache');\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"useQueryCache-CHG4-HGF.js","names":["keysToRemove: string[]","entry: CacheEntry<T>","entries: Record<\n string,\n {\n data: any;\n ageMs: number;\n expiresInMs: number;\n isExpired: boolean;\n source: 'memory' | 'storage';\n }\n >","entries: [string, number][]"],"sources":["../src/composables/useQueryCache.ts"],"sourcesContent":["import { logger, logIfEnabled } from '../utils/logger';\n\ninterface CacheEntry<T> {\n data: T;\n timestamp: number;\n expiresAt: number;\n}\n\ninterface CacheOptions {\n staleTime?: number; // How long data is fresh (ms), default 5 minutes\n persist?: boolean; // Save to localStorage\n debug?: boolean; // Enable/disable debug logging for this cache operation (default: false)\n}\n\nclass QueryCache {\n private memoryCache = new Map<string, CacheEntry<any>>();\n private readonly BUILD_TAG = import.meta.env.VITE_BUILD_TAG || 'dev';\n private readonly STORAGE_PREFIX = `rpc-cache:${this.BUILD_TAG}:`;\n private readonly BUILD_TAG_KEY = 'rpc-cache-build-tag';\n private cleanupTimers = new Map<string, number>();\n\n constructor() {\n // Check if this is a new deployment and clear old cache\n this.handleDeploymentChange();\n\n // Clean up expired localStorage entries on init\n this.cleanExpiredStorage();\n }\n\n /**\n * Detect deployment changes and clear old cache\n */\n private handleDeploymentChange() {\n const lastBuildTag = localStorage.getItem(this.BUILD_TAG_KEY);\n\n // If build tag is missing, clear all cache (first load or manual clear)\n if (!lastBuildTag) {\n // Use global log level for deployment change detection\n logger.debug('[Cache] Build tag missing - clearing all cache');\n this.clearAllStorage();\n }\n // If deployment changed, clear old cache from previous build\n else if (lastBuildTag !== this.BUILD_TAG) {\n // Use global log level for deployment change detection\n logger.debug(`[Cache] New deployment detected: ${lastBuildTag} → ${this.BUILD_TAG}`);\n logger.debug('[Cache] Clearing old cache from previous deployment');\n\n // Clear all old cache entries (from previous build tag)\n this.clearAllOldDeploymentCache(lastBuildTag);\n }\n\n // Store current build tag\n localStorage.setItem(this.BUILD_TAG_KEY, this.BUILD_TAG);\n }\n\n /**\n * Clear cache from previous deployment\n */\n private clearAllOldDeploymentCache(oldBuildTag: string) {\n const oldPrefix = `rpc-cache:${oldBuildTag}:`;\n const keysToRemove: string[] = [];\n\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(oldPrefix)) {\n keysToRemove.push(key);\n }\n }\n\n keysToRemove.forEach((key) => localStorage.removeItem(key));\n\n if (keysToRemove.length > 0) {\n // Use global log level for deployment change detection\n logger.debug(`[Cache] Removed ${keysToRemove.length} entries from previous deployment`);\n }\n }\n\n /**\n * Get data from cache (memory first, then localStorage if persist enabled)\n */\n get<T>(key: string, options: CacheOptions = {}): T | null {\n const now = Date.now();\n const debug = options.debug ?? false;\n\n // 1. Try memory cache first\n const memoryEntry = this.memoryCache.get(key);\n if (memoryEntry) {\n if (now < memoryEntry.expiresAt) {\n return memoryEntry.data as T;\n }\n // Expired in memory\n this.memoryCache.delete(key);\n }\n\n // 2. Try localStorage if persist is enabled\n if (options.persist) {\n const storageEntry = this.getFromStorage<T>(key, debug);\n if (storageEntry) {\n if (now < storageEntry.expiresAt) {\n // Rehydrate to memory cache\n this.memoryCache.set(key, storageEntry);\n return storageEntry.data;\n }\n // Expired in storage\n this.removeFromStorage(key);\n }\n }\n\n return null;\n }\n\n /**\n * Set data in cache (memory and optionally localStorage)\n */\n set<T>(key: string, data: T, options: CacheOptions = {}) {\n const staleTime = options.staleTime ?? 300000; // Default 5 minutes\n const debug = options.debug ?? false;\n const entry: CacheEntry<T> = {\n data,\n timestamp: Date.now(),\n expiresAt: Date.now() + staleTime,\n };\n\n // 1. Set in memory\n this.memoryCache.set(key, entry);\n\n // 2. Persist to localStorage if enabled\n if (options.persist) {\n this.setInStorage(key, entry, debug);\n }\n\n // 3. Schedule automatic cleanup\n this.scheduleCleanup(key, staleTime);\n }\n\n /**\n * Invalidate cache entries matching a pattern\n */\n invalidate(pattern: string | RegExp, debug: boolean = false) {\n const keysToRemove: string[] = [];\n\n // Find matching keys in memory\n for (const key of this.memoryCache.keys()) {\n if (this.matchesPattern(key, pattern)) {\n keysToRemove.push(key);\n }\n }\n\n // Remove from memory and storage\n keysToRemove.forEach((key) => {\n this.memoryCache.delete(key);\n this.removeFromStorage(key);\n this.cancelCleanup(key);\n });\n\n logIfEnabled(\n 'debug',\n `[Cache] Invalidated ${keysToRemove.length} entries matching:`,\n debug,\n pattern,\n );\n }\n\n /**\n * Clear all cache entries\n */\n clear(debug: boolean = false) {\n // Clear memory\n this.memoryCache.clear();\n\n // Clear all cleanup timers\n for (const timer of this.cleanupTimers.values()) {\n clearTimeout(timer);\n }\n this.cleanupTimers.clear();\n\n // Clear localStorage\n this.clearAllStorage();\n\n logIfEnabled('debug', '[Cache] Cleared all entries', debug);\n }\n\n /**\n * Get cache statistics (for debugging)\n */\n inspect() {\n const entries: Record<\n string,\n {\n data: any;\n ageMs: number;\n expiresInMs: number;\n isExpired: boolean;\n source: 'memory' | 'storage';\n }\n > = {};\n\n const now = Date.now();\n\n // Memory entries\n for (const [key, value] of this.memoryCache.entries()) {\n entries[key] = {\n data: value.data,\n ageMs: now - value.timestamp,\n expiresInMs: value.expiresAt - now,\n isExpired: now > value.expiresAt,\n source: 'memory',\n };\n }\n\n // Storage entries not in memory\n for (let i = 0; i < localStorage.length; i++) {\n const storageKey = localStorage.key(i);\n if (storageKey?.startsWith(this.STORAGE_PREFIX)) {\n const key = storageKey.substring(this.STORAGE_PREFIX.length);\n if (!entries[key]) {\n try {\n const entry = JSON.parse(localStorage.getItem(storageKey)!) as CacheEntry<any>;\n entries[key] = {\n data: entry.data,\n ageMs: now - entry.timestamp,\n expiresInMs: entry.expiresAt - now,\n isExpired: now > entry.expiresAt,\n source: 'storage',\n };\n } catch {\n // Ignore parse errors\n }\n }\n }\n }\n\n return {\n totalEntries: Object.keys(entries).length,\n memoryEntries: Array.from(this.memoryCache.keys()).length,\n storageEntries: this.countStorageEntries(),\n entries,\n };\n }\n\n /**\n * Get size of cache in localStorage (approximate)\n */\n getStorageSize(): number {\n let size = 0;\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(this.STORAGE_PREFIX)) {\n const value = localStorage.getItem(key);\n if (value) {\n size += key.length + value.length;\n }\n }\n }\n return size;\n }\n\n // Private methods\n\n private getFromStorage<T>(key: string, debug: boolean = false): CacheEntry<T> | null {\n try {\n const stored = localStorage.getItem(this.STORAGE_PREFIX + key);\n if (!stored) return null;\n\n const entry = JSON.parse(stored) as CacheEntry<T>;\n return entry;\n } catch (error) {\n logIfEnabled('error', '[Cache] Error reading from storage:', debug, error);\n return null;\n }\n }\n\n private setInStorage<T>(key: string, entry: CacheEntry<T>, debug: boolean = false) {\n try {\n localStorage.setItem(this.STORAGE_PREFIX + key, JSON.stringify(entry));\n } catch (error) {\n // Handle quota exceeded\n if (error instanceof DOMException && error.name === 'QuotaExceededError') {\n logIfEnabled('warn', '[Cache] Storage quota exceeded, clearing old entries', debug);\n this.clearOldestStorageEntries(debug);\n // Try again\n try {\n localStorage.setItem(this.STORAGE_PREFIX + key, JSON.stringify(entry));\n } catch (retryError) {\n logIfEnabled('error', '[Cache] Still cannot write to storage after cleanup', debug);\n }\n } else {\n logIfEnabled('error', '[Cache] Error writing to storage:', debug, error);\n }\n }\n }\n\n private removeFromStorage(key: string) {\n localStorage.removeItem(this.STORAGE_PREFIX + key);\n }\n\n private clearAllStorage() {\n const keysToRemove: string[] = [];\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(this.STORAGE_PREFIX)) {\n keysToRemove.push(key);\n }\n }\n keysToRemove.forEach((key) => localStorage.removeItem(key));\n }\n\n private cleanExpiredStorage() {\n const now = Date.now();\n const keysToRemove: string[] = [];\n\n for (let i = 0; i < localStorage.length; i++) {\n const storageKey = localStorage.key(i);\n if (storageKey?.startsWith(this.STORAGE_PREFIX)) {\n try {\n const entry = JSON.parse(localStorage.getItem(storageKey)!) as CacheEntry<any>;\n if (now > entry.expiresAt) {\n keysToRemove.push(storageKey);\n }\n } catch {\n // Remove corrupted entries\n keysToRemove.push(storageKey);\n }\n }\n }\n\n keysToRemove.forEach((key) => localStorage.removeItem(key));\n if (keysToRemove.length > 0) {\n // Use global log level for internal cleanup operations\n logger.debug(`[Cache] Cleaned up ${keysToRemove.length} expired storage entries`);\n }\n }\n\n private clearOldestStorageEntries(debug: boolean = false) {\n const entries: [string, number][] = [];\n\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(this.STORAGE_PREFIX)) {\n try {\n const entry = JSON.parse(localStorage.getItem(key)!) as CacheEntry<any>;\n entries.push([key, entry.timestamp]);\n } catch {\n // Remove corrupted entries\n localStorage.removeItem(key);\n }\n }\n }\n\n // Sort by timestamp (oldest first) and remove oldest 25%\n entries.sort((a, b) => a[1] - b[1]);\n const toRemove = Math.ceil(entries.length * 0.25);\n entries.slice(0, toRemove).forEach(([key]) => {\n localStorage.removeItem(key);\n });\n\n logIfEnabled('debug', `[Cache] Removed ${toRemove} oldest entries to free space`, debug);\n }\n\n private scheduleCleanup(key: string, delay: number) {\n // Cancel existing cleanup if any\n this.cancelCleanup(key);\n\n // Schedule new cleanup\n const timer = setTimeout(() => {\n this.memoryCache.delete(key);\n this.cleanupTimers.delete(key);\n }, delay);\n\n this.cleanupTimers.set(key, timer);\n }\n\n private cancelCleanup(key: string) {\n const timer = this.cleanupTimers.get(key);\n if (timer) {\n clearTimeout(timer);\n this.cleanupTimers.delete(key);\n }\n }\n\n private matchesPattern(key: string, pattern: string | RegExp): boolean {\n if (typeof pattern === 'string') {\n // Exact match or prefix match\n return key === pattern || key.startsWith(pattern);\n }\n return pattern.test(key);\n }\n\n private countStorageEntries(): number {\n let count = 0;\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(this.STORAGE_PREFIX)) {\n count++;\n }\n }\n return count;\n }\n}\n\n// Singleton instance\nexport const queryCache = new QueryCache();\n\n// Expose for debugging in dev mode\nif (import.meta.env.DEV) {\n (window as any).__queryCache = queryCache;\n // Always log this in dev mode\n logger.debug('[Cache] Debug available: window.__queryCache');\n}\n"],"mappings":"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"}
@@ -0,0 +1,118 @@
1
+ import { computed, createBlock, createElementBlock, defineComponent, mergeProps, openBlock, renderSlot, unref, withCtx } from "vue";
2
+ import { RouterLink } from "vue-router";
3
+
4
+ //#region src/components/AppLink.vue
5
+ const _hoisted_1 = ["href"];
6
+ const _sfc_main = /* @__PURE__ */ defineComponent({
7
+ __name: "AppLink",
8
+ props: {
9
+ to: {
10
+ type: String,
11
+ required: true
12
+ },
13
+ activeClass: {
14
+ type: String,
15
+ default: "active"
16
+ },
17
+ exactActiveClass: {
18
+ type: String,
19
+ default: "exact-active"
20
+ }
21
+ },
22
+ setup(__props) {
23
+ const props = __props;
24
+ const isExternalLink = computed(() => {
25
+ return typeof props.to === "string" && props.to.startsWith("http");
26
+ });
27
+ return (_ctx, _cache) => {
28
+ return isExternalLink.value ? (openBlock(), createElementBlock("a", mergeProps({ key: 0 }, _ctx.$attrs, {
29
+ href: __props.to,
30
+ target: "_blank",
31
+ rel: "noopener noreferrer",
32
+ class: [_ctx.$attrs.class]
33
+ }), [renderSlot(_ctx.$slots, "default")], 16, _hoisted_1)) : (openBlock(), createBlock(unref(RouterLink), mergeProps({ key: 1 }, _ctx.$attrs, {
34
+ to: __props.to,
35
+ class: [_ctx.$attrs.class],
36
+ "active-class": __props.activeClass,
37
+ "exact-active-class": __props.exactActiveClass
38
+ }), {
39
+ default: withCtx(() => [renderSlot(_ctx.$slots, "default")]),
40
+ _: 3
41
+ }, 16, [
42
+ "to",
43
+ "class",
44
+ "active-class",
45
+ "exact-active-class"
46
+ ]));
47
+ };
48
+ }
49
+ });
50
+ var AppLink_default = _sfc_main;
51
+
52
+ //#endregion
53
+ //#region src/utils/useReturnUrl.ts
54
+ /** Storage key for return URL when awaiting email verification from signup (strict mode). */
55
+ const EMAIL_VERIFICATION_RETURN_URL_KEY = "dragoncore_email_verification_return_url";
56
+ /**
57
+ * Store return URL for post-verification redirect. Uses localStorage (not sessionStorage)
58
+ * so the verification link opened in a new tab can access it.
59
+ */
60
+ function setEmailVerificationReturnUrl(url) {
61
+ if (!url.startsWith("/") || url.startsWith("/auth/")) return;
62
+ localStorage.setItem(EMAIL_VERIFICATION_RETURN_URL_KEY, url);
63
+ }
64
+ function getAndClearEmailVerificationReturnUrl() {
65
+ const url = localStorage.getItem(EMAIL_VERIFICATION_RETURN_URL_KEY);
66
+ localStorage.removeItem(EMAIL_VERIFICATION_RETURN_URL_KEY);
67
+ return url && url.startsWith("/") && !url.startsWith("/auth/") ? url : null;
68
+ }
69
+ /**
70
+ * Validates a return URL: must be a relative path starting with / and not /auth/
71
+ * to avoid redirect loops and external URLs.
72
+ */
73
+ function getValidReturnUrl(route, defaultPath) {
74
+ const returnUrl = route.query.returnUrl;
75
+ if (!returnUrl) return defaultPath;
76
+ if (returnUrl.startsWith("/") && !returnUrl.startsWith("/auth/")) return returnUrl;
77
+ return defaultPath;
78
+ }
79
+ /**
80
+ * Builds a path string with returnUrl preserved in query params.
81
+ * Use when linking to login, logout, etc. from a page that has returnUrl.
82
+ */
83
+ function withReturnUrl(path, returnUrl) {
84
+ if (!returnUrl || !returnUrl.startsWith("/") || returnUrl.startsWith("/auth/")) return path;
85
+ return `${path}${path.includes("?") ? "&" : "?"}returnUrl=${encodeURIComponent(returnUrl)}`;
86
+ }
87
+ /** Same validation as returnUrl: relative path, not /auth/ */
88
+ function isValidBackLinkPath(path) {
89
+ return path.startsWith("/") && !path.startsWith("/auth/");
90
+ }
91
+ /**
92
+ * Extracts a valid back link from route query params.
93
+ * Supports backLink (path) and backLinkLabel (optional label).
94
+ */
95
+ function getBackLinkFromRoute(route) {
96
+ const path = route.query.backLink;
97
+ const raw = typeof path === "string" ? path : Array.isArray(path) ? path[0] ?? void 0 : void 0;
98
+ if (!raw || typeof raw !== "string" || !isValidBackLinkPath(raw)) return null;
99
+ const label = route.query.backLinkLabel;
100
+ return {
101
+ to: raw,
102
+ label: typeof label === "string" ? label : Array.isArray(label) ? label[0] ?? void 0 : void 0
103
+ };
104
+ }
105
+ /**
106
+ * Appends backLink (and optional backLinkLabel) to a path.
107
+ * Use when linking to auth pages so the Auth layout shows a back link.
108
+ */
109
+ function withBackLink(path, backLink, backLinkLabel) {
110
+ if (!backLink || !isValidBackLinkPath(backLink)) return path;
111
+ let result = `${path}${path.includes("?") ? "&" : "?"}backLink=${encodeURIComponent(backLink)}`;
112
+ if (backLinkLabel) result += `&backLinkLabel=${encodeURIComponent(backLinkLabel)}`;
113
+ return result;
114
+ }
115
+
116
+ //#endregion
117
+ export { withBackLink as a, setEmailVerificationReturnUrl as i, getBackLinkFromRoute as n, withReturnUrl as o, getValidReturnUrl as r, AppLink_default as s, getAndClearEmailVerificationReturnUrl as t };
118
+ //# sourceMappingURL=useReturnUrl-Da8PpLb9.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useReturnUrl-Da8PpLb9.js","names":["$attrs"],"sources":["../src/components/AppLink.vue","../src/utils/useReturnUrl.ts"],"sourcesContent":["<template>\n <template v-if=\"isExternalLink\">\n <a\n v-bind=\"$attrs\"\n :href=\"to\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n :class=\"[$attrs.class]\"\n >\n <slot />\n </a>\n </template>\n <template v-else>\n <router-link\n v-bind=\"$attrs\"\n :to=\"to\"\n :class=\"[$attrs.class]\"\n :active-class=\"activeClass\"\n :exact-active-class=\"exactActiveClass\"\n >\n <slot />\n </router-link>\n </template>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { RouterLink } from 'vue-router';\n\nconst props = defineProps({\n to: {\n type: String,\n required: true,\n },\n activeClass: {\n type: String,\n default: 'active',\n },\n exactActiveClass: {\n type: String,\n default: 'exact-active',\n },\n});\n\nconst isExternalLink = computed(() => {\n return typeof props.to === 'string' && props.to.startsWith('http');\n});\n</script>\n","import type { RouteLocationNormalizedLoaded } from 'vue-router';\n\n/** Storage key for return URL when awaiting email verification from signup (strict mode). */\nexport const EMAIL_VERIFICATION_RETURN_URL_KEY = 'dragoncore_email_verification_return_url';\n\n/**\n * Store return URL for post-verification redirect. Uses localStorage (not sessionStorage)\n * so the verification link opened in a new tab can access it.\n */\nexport function setEmailVerificationReturnUrl(url: string): void {\n if (!url.startsWith('/') || url.startsWith('/auth/')) return;\n localStorage.setItem(EMAIL_VERIFICATION_RETURN_URL_KEY, url);\n}\n\nexport function getAndClearEmailVerificationReturnUrl(): string | null {\n const url = localStorage.getItem(EMAIL_VERIFICATION_RETURN_URL_KEY);\n localStorage.removeItem(EMAIL_VERIFICATION_RETURN_URL_KEY);\n return url && url.startsWith('/') && !url.startsWith('/auth/') ? url : null;\n}\n\n/**\n * Validates a return URL: must be a relative path starting with / and not /auth/\n * to avoid redirect loops and external URLs.\n */\nexport function getValidReturnUrl(\n route: RouteLocationNormalizedLoaded,\n defaultPath: string,\n): string {\n const returnUrl = route.query.returnUrl as string | undefined;\n if (!returnUrl) return defaultPath;\n if (returnUrl.startsWith('/') && !returnUrl.startsWith('/auth/')) {\n return returnUrl;\n }\n return defaultPath;\n}\n\n/**\n * Builds a path string with returnUrl preserved in query params.\n * Use when linking to login, logout, etc. from a page that has returnUrl.\n */\nexport function withReturnUrl(path: string, returnUrl: string | undefined): string {\n if (!returnUrl || !returnUrl.startsWith('/') || returnUrl.startsWith('/auth/')) {\n return path;\n }\n const sep = path.includes('?') ? '&' : '?';\n return `${path}${sep}returnUrl=${encodeURIComponent(returnUrl)}`;\n}\n\n/** Same validation as returnUrl: relative path, not /auth/ */\nfunction isValidBackLinkPath(path: string): boolean {\n return path.startsWith('/') && !path.startsWith('/auth/');\n}\n\n/**\n * Extracts a valid back link from route query params.\n * Supports backLink (path) and backLinkLabel (optional label).\n */\nexport function getBackLinkFromRoute(\n route: RouteLocationNormalizedLoaded,\n): { to: string; label?: string } | null {\n const path = route.query.backLink;\n const raw =\n typeof path === 'string' ? path : Array.isArray(path) ? path[0] ?? undefined : undefined;\n if (!raw || typeof raw !== 'string' || !isValidBackLinkPath(raw)) return null;\n const label = route.query.backLinkLabel;\n const labelStr =\n typeof label === 'string' ? label : Array.isArray(label) ? label[0] ?? undefined : undefined;\n return { to: raw, label: labelStr };\n}\n\n/**\n * Appends backLink (and optional backLinkLabel) to a path.\n * Use when linking to auth pages so the Auth layout shows a back link.\n */\nexport function withBackLink(\n path: string,\n backLink: string,\n backLinkLabel?: string,\n): string {\n if (!backLink || !isValidBackLinkPath(backLink)) return path;\n const sep = path.includes('?') ? '&' : '?';\n let result = `${path}${sep}backLink=${encodeURIComponent(backLink)}`;\n if (backLinkLabel) {\n result += `&backLinkLabel=${encodeURIComponent(backLinkLabel)}`;\n }\n return result;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;EA6BA,MAAM,QAAQ;EAed,MAAM,iBAAiB,eAAe;AACpC,UAAO,OAAO,MAAM,OAAO,YAAY,MAAM,GAAG,WAAW,OAAO;IAClE;;UA7CgB,eAAA,SAAA,WAAA,EACd,mBAQI,KARJ,WAQI,EAAA,KAAA,GAAA,EAPMA,KAAAA,QAAM;IACb,MAAM,QAAA;IACP,QAAO;IACP,KAAI;IACH,OAAK,CAAGA,KAAAA,OAAO,MAAK;QAErB,WAAQ,KAAA,QAAA,UAAA,CAAA,EAAA,IAAA,WAAA,KAAA,WAAA,EAIV,YAQc,MAAA,WAAA,EARd,WAQc,EAAA,KAAA,GAAA,EAPJA,KAAAA,QAAM;IACb,IAAI,QAAA;IACJ,OAAK,CAAGA,KAAAA,OAAO,MAAK;IACpB,gBAAc,QAAA;IACd,sBAAoB,QAAA;;2BAEb,CAAR,WAAQ,KAAA,QAAA,UAAA,CAAA,CAAA;;;;;;;;;;;;;;;;ACjBd,MAAa,oCAAoC;;;;;AAMjD,SAAgB,8BAA8B,KAAmB;AAC/D,KAAI,CAAC,IAAI,WAAW,IAAI,IAAI,IAAI,WAAW,SAAS,CAAE;AACtD,cAAa,QAAQ,mCAAmC,IAAI;;AAG9D,SAAgB,wCAAuD;CACrE,MAAM,MAAM,aAAa,QAAQ,kCAAkC;AACnE,cAAa,WAAW,kCAAkC;AAC1D,QAAO,OAAO,IAAI,WAAW,IAAI,IAAI,CAAC,IAAI,WAAW,SAAS,GAAG,MAAM;;;;;;AAOzE,SAAgB,kBACd,OACA,aACQ;CACR,MAAM,YAAY,MAAM,MAAM;AAC9B,KAAI,CAAC,UAAW,QAAO;AACvB,KAAI,UAAU,WAAW,IAAI,IAAI,CAAC,UAAU,WAAW,SAAS,CAC9D,QAAO;AAET,QAAO;;;;;;AAOT,SAAgB,cAAc,MAAc,WAAuC;AACjF,KAAI,CAAC,aAAa,CAAC,UAAU,WAAW,IAAI,IAAI,UAAU,WAAW,SAAS,CAC5E,QAAO;AAGT,QAAO,GAAG,OADE,KAAK,SAAS,IAAI,GAAG,MAAM,IAClB,YAAY,mBAAmB,UAAU;;;AAIhE,SAAS,oBAAoB,MAAuB;AAClD,QAAO,KAAK,WAAW,IAAI,IAAI,CAAC,KAAK,WAAW,SAAS;;;;;;AAO3D,SAAgB,qBACd,OACuC;CACvC,MAAM,OAAO,MAAM,MAAM;CACzB,MAAM,MACJ,OAAO,SAAS,WAAW,OAAO,MAAM,QAAQ,KAAK,GAAG,KAAK,MAAM,SAAY;AACjF,KAAI,CAAC,OAAO,OAAO,QAAQ,YAAY,CAAC,oBAAoB,IAAI,CAAE,QAAO;CACzE,MAAM,QAAQ,MAAM,MAAM;AAG1B,QAAO;EAAE,IAAI;EAAK,OADhB,OAAO,UAAU,WAAW,QAAQ,MAAM,QAAQ,MAAM,GAAG,MAAM,MAAM,SAAY;EAClD;;;;;;AAOrC,SAAgB,aACd,MACA,UACA,eACQ;AACR,KAAI,CAAC,YAAY,CAAC,oBAAoB,SAAS,CAAE,QAAO;CAExD,IAAI,SAAS,GAAG,OADJ,KAAK,SAAS,IAAI,GAAG,MAAM,IACZ,WAAW,mBAAmB,SAAS;AAClE,KAAI,cACF,WAAU,kBAAkB,mBAAmB,cAAc;AAE/D,QAAO"}
@@ -602,6 +602,20 @@ function getRouter() {
602
602
  return globalRouter;
603
603
  }
604
604
  /**
605
+ * Push to logout with returnUrl so user can return to their intended destination after re-login.
606
+ * Validates path: must start with / and not /auth/ to avoid loops.
607
+ */
608
+ function pushToLogout() {
609
+ const router = getRouter();
610
+ const currentPath = router.currentRoute.value.fullPath;
611
+ const returnUrl = currentPath.startsWith("/") && !currentPath.startsWith("/auth/") ? currentPath : void 0;
612
+ const query = returnUrl ? { returnUrl } : {};
613
+ return router.push({
614
+ path: "/auth/logout",
615
+ query
616
+ });
617
+ }
618
+ /**
605
619
  * Check if token needs refresh before making a request
606
620
  */
607
621
  function needsRefresh(userStore) {
@@ -613,13 +627,12 @@ function needsRefresh(userStore) {
613
627
  * Attempt to refresh the token using the provided handler
614
628
  */
615
629
  async function attemptRefresh(userStore, refreshTokenHandler) {
616
- const router = getRouter();
617
630
  try {
618
631
  if (!userStore.currentSession && !userStore.accessToken) return false;
619
632
  if (userStore.currentSession) {
620
633
  const { refreshTokenExpired } = userStore.isTokenExpired();
621
634
  if (refreshTokenExpired) {
622
- await router.push("/auth/logout");
635
+ await pushToLogout();
623
636
  return false;
624
637
  }
625
638
  }
@@ -637,7 +650,7 @@ async function attemptRefresh(userStore, refreshTokenHandler) {
637
650
  originalError: error?.originalError
638
651
  });
639
652
  const combinedMessage = `${((error?.originalError || error)?.message || error?.message || "").toUpperCase()} ${(error?.originalError?.message || "").toUpperCase()}`;
640
- if (combinedMessage.includes("NO_REFRESH_TOKEN") || combinedMessage.includes("REFRESH_TOKEN_EXPIRED") || combinedMessage.includes("REFRESH_TOKEN_REVOKED") || combinedMessage.includes("INVALID REFRESH TOKEN") || combinedMessage.includes("NO REFRESH TOKEN FOUND")) await router.push("/auth/logout");
653
+ if (combinedMessage.includes("NO_REFRESH_TOKEN") || combinedMessage.includes("REFRESH_TOKEN_EXPIRED") || combinedMessage.includes("REFRESH_TOKEN_REVOKED") || combinedMessage.includes("INVALID REFRESH TOKEN") || combinedMessage.includes("NO REFRESH TOKEN FOUND")) await pushToLogout();
641
654
  return false;
642
655
  }
643
656
  }
@@ -669,29 +682,28 @@ function createAppBatch(options) {
669
682
  */
670
683
  async function executeWithAuth(fn, options) {
671
684
  const userStore = useUserSessionStore();
672
- const router = getRouter();
673
685
  if (options?.skipAuthCheck) return await fn(createAppBatch(options));
674
686
  if (needsRefresh(userStore)) {
675
687
  if (!await attemptRefresh(userStore, options.refreshTokenHandler)) {
676
688
  if (!userStore.accessToken) {
677
- await router.push("/auth/logout");
689
+ await pushToLogout();
678
690
  throw new Error("Authentication required");
679
691
  }
680
692
  } else if (!userStore.accessToken) {
681
- await router.push("/auth/logout");
693
+ await pushToLogout();
682
694
  throw new Error("Token refresh failed to set access token");
683
695
  }
684
696
  }
685
697
  try {
686
698
  if (!userStore.accessToken) {
687
- await router.push("/auth/logout");
699
+ await pushToLogout();
688
700
  throw new Error("Authentication required");
689
701
  }
690
702
  return await fn(createAppBatch(options));
691
703
  } catch (error) {
692
704
  if (isAuthError(error)) {
693
705
  if (await attemptRefresh(userStore, options.refreshTokenHandler)) return await fn(createAppBatch(options));
694
- await router.push("/auth/logout");
706
+ await pushToLogout();
695
707
  throw error;
696
708
  }
697
709
  throw error;
@@ -729,4 +741,4 @@ function createTrackedSession(request, trackedSegment) {
729
741
 
730
742
  //#endregion
731
743
  export { EnhancedRefreshTokenHandler as a, setRefreshTokenHandler as c, Logger as d, logIfEnabled as f, setRouter as i, useUserSessionStore as l, useEnv as m, createAppBatch as n, createRefreshTokenHandler as o, logger as p, executeWithAuth as r, getRefreshTokenHandler as s, BATCH_MODE as t, LOG_LEVEL as u };
732
- //# sourceMappingURL=useRpcAuth-SgNzCAPa.js.map
744
+ //# sourceMappingURL=useRpcAuth-8Byr6SSI.js.map