@nocios/crudify-components 2.0.61 → 2.0.81

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 (363) hide show
  1. package/.scannerwork/.sonar_lock +0 -0
  2. package/.scannerwork/report-task.txt +6 -0
  3. package/coverage/components/CrudiaAutoGenerate.tsx.html +616 -0
  4. package/coverage/components/CrudiaFileField/CrudiaFileField.tsx.html +1312 -0
  5. package/coverage/components/CrudiaFileField/components/DeleteConfirmationDialog.tsx.html +355 -0
  6. package/coverage/components/CrudiaFileField/components/DropZone.tsx.html +523 -0
  7. package/coverage/components/CrudiaFileField/components/FileItemRow.tsx.html +835 -0
  8. package/coverage/components/CrudiaFileField/components/FileThumbnail.tsx.html +1585 -0
  9. package/coverage/components/CrudiaFileField/components/index.html +176 -0
  10. package/coverage/components/CrudiaFileField/components/index.ts.html +115 -0
  11. package/coverage/components/CrudiaFileField/hooks/index.html +146 -0
  12. package/coverage/components/CrudiaFileField/hooks/index.ts.html +112 -0
  13. package/coverage/components/CrudiaFileField/hooks/useDeleteConfirmation.ts.html +433 -0
  14. package/coverage/components/CrudiaFileField/hooks/useDragDrop.ts.html +409 -0
  15. package/coverage/components/CrudiaFileField/index.html +131 -0
  16. package/coverage/components/CrudiaFileField/index.ts.html +112 -0
  17. package/coverage/components/CrudiaFileField/utils/formatters.ts.html +169 -0
  18. package/coverage/components/CrudiaFileField/utils/icons.tsx.html +253 -0
  19. package/coverage/components/CrudiaFileField/utils/index.html +146 -0
  20. package/coverage/components/CrudiaFileField/utils/index.ts.html +103 -0
  21. package/coverage/components/CrudiaMarkdownField.tsx.html +676 -0
  22. package/coverage/components/CrudifyInitializer.tsx.html +712 -0
  23. package/coverage/components/CrudifyLogin/Forms/CheckCodeForm.tsx.html +640 -0
  24. package/coverage/components/CrudifyLogin/Forms/ForgotPasswordForm.tsx.html +730 -0
  25. package/coverage/components/CrudifyLogin/Forms/LoginForm.tsx.html +892 -0
  26. package/coverage/components/CrudifyLogin/Forms/ResetPasswordForm.tsx.html +1219 -0
  27. package/coverage/components/CrudifyLogin/Forms/components/CodeInput.tsx.html +289 -0
  28. package/coverage/components/CrudifyLogin/Forms/components/FormAlert.tsx.html +202 -0
  29. package/coverage/components/CrudifyLogin/Forms/components/PasswordInput.tsx.html +346 -0
  30. package/coverage/components/CrudifyLogin/Forms/components/index.html +161 -0
  31. package/coverage/components/CrudifyLogin/Forms/components/index.ts.html +106 -0
  32. package/coverage/components/CrudifyLogin/Forms/index.html +176 -0
  33. package/coverage/components/CrudifyLogin/Forms/index.ts.html +145 -0
  34. package/coverage/components/CrudifyLogin/Forms/utils/errorTranslation.ts.html +268 -0
  35. package/coverage/components/CrudifyLogin/Forms/utils/index.html +161 -0
  36. package/coverage/components/CrudifyLogin/Forms/utils/index.ts.html +121 -0
  37. package/coverage/components/CrudifyLogin/Forms/utils/paramUtils.ts.html +496 -0
  38. package/coverage/components/CrudifyLogin/Forms/utils/validation.ts.html +307 -0
  39. package/coverage/components/CrudifyLogin/components/CrudifyInitializer.tsx.html +268 -0
  40. package/coverage/components/CrudifyLogin/components/index.html +116 -0
  41. package/coverage/components/CrudifyLogin/context/CrudifyProvider.tsx.html +409 -0
  42. package/coverage/components/CrudifyLogin/context/I18nProvider.tsx.html +430 -0
  43. package/coverage/components/CrudifyLogin/context/LoginStateProvider.tsx.html +1261 -0
  44. package/coverage/components/CrudifyLogin/context/index.html +161 -0
  45. package/coverage/components/CrudifyLogin/context/index.ts.html +91 -0
  46. package/coverage/components/CrudifyLogin/hooks/index.html +131 -0
  47. package/coverage/components/CrudifyLogin/hooks/useCrudifyLogin.ts.html +463 -0
  48. package/coverage/components/CrudifyLogin/hooks/useTranslationsFromUrl.ts.html +391 -0
  49. package/coverage/components/CrudifyLogin/index.html +116 -0
  50. package/coverage/components/CrudifyLogin/index.tsx.html +466 -0
  51. package/coverage/components/CrudifyLogin/utils/index.html +116 -0
  52. package/coverage/components/CrudifyLogin/utils/secureStorage.ts.html +859 -0
  53. package/coverage/components/GlobalNotificationProvider.tsx.html +844 -0
  54. package/coverage/components/LoginComponent.tsx.html +676 -0
  55. package/coverage/components/PasswordRequirements/index.html +116 -0
  56. package/coverage/components/PasswordRequirements/index.tsx.html +232 -0
  57. package/coverage/components/PublicPolicies/FieldSelector/FieldSelector.tsx.html +1078 -0
  58. package/coverage/components/PublicPolicies/FieldSelector/index.html +131 -0
  59. package/coverage/components/PublicPolicies/FieldSelector/index.ts.html +88 -0
  60. package/coverage/components/PublicPolicies/Policies.tsx.html +625 -0
  61. package/coverage/components/PublicPolicies/PolicyItem/PolicyItem.tsx.html +886 -0
  62. package/coverage/components/PublicPolicies/PolicyItem/index.html +131 -0
  63. package/coverage/components/PublicPolicies/PolicyItem/index.ts.html +88 -0
  64. package/coverage/components/PublicPolicies/constants.ts.html +106 -0
  65. package/coverage/components/PublicPolicies/index.html +146 -0
  66. package/coverage/components/PublicPolicies/index.ts.html +88 -0
  67. package/coverage/components/Routing/AuthRoute.tsx.html +382 -0
  68. package/coverage/components/Routing/GuestRoute.tsx.html +352 -0
  69. package/coverage/components/Routing/ProtectedRoute.tsx.html +316 -0
  70. package/coverage/components/Routing/index.html +161 -0
  71. package/coverage/components/Routing/index.ts.html +109 -0
  72. package/coverage/components/SessionLoadingScreen/index.html +116 -0
  73. package/coverage/components/SessionLoadingScreen/index.tsx.html +379 -0
  74. package/coverage/components/SessionTimeIndicator/index.html +116 -0
  75. package/coverage/components/SessionTimeIndicator/index.tsx.html +523 -0
  76. package/coverage/components/UserProfile/UserProfileDisplay.tsx.html +931 -0
  77. package/coverage/components/UserProfile/index.html +131 -0
  78. package/coverage/components/UserProfile/index.ts.html +88 -0
  79. package/coverage/components/index.html +191 -0
  80. package/coverage/components/index.ts.html +178 -0
  81. package/coverage/core/CrossTabSyncManager.ts.html +853 -0
  82. package/coverage/core/CrudifyInitializationManager.ts.html +1279 -0
  83. package/coverage/core/SessionManager.ts.html +3064 -0
  84. package/coverage/core/index.html +146 -0
  85. package/coverage/coverage-final.json +74 -77
  86. package/coverage/hooks/index.html +191 -0
  87. package/coverage/hooks/index.ts.html +136 -0
  88. package/coverage/hooks/useAuth.ts.html +529 -0
  89. package/coverage/hooks/useAutoGenerate.ts.html +571 -0
  90. package/coverage/hooks/useCrudifyWithNotifications/constants.ts.html +247 -0
  91. package/coverage/hooks/useCrudifyWithNotifications/hooks/index.html +116 -0
  92. package/coverage/hooks/useCrudifyWithNotifications/hooks/useCrudOperations.ts.html +820 -0
  93. package/coverage/hooks/useCrudifyWithNotifications/index.html +146 -0
  94. package/coverage/hooks/useCrudifyWithNotifications/index.ts.html +118 -0
  95. package/coverage/hooks/useCrudifyWithNotifications/useCrudifyWithNotifications.ts.html +565 -0
  96. package/coverage/hooks/useCrudifyWithNotifications/utils/errorMessageResolver.ts.html +847 -0
  97. package/coverage/hooks/useCrudifyWithNotifications/utils/index.html +146 -0
  98. package/coverage/hooks/useCrudifyWithNotifications/utils/notificationFilters.ts.html +313 -0
  99. package/coverage/hooks/useCrudifyWithNotifications/utils/successMessageResolver.ts.html +265 -0
  100. package/coverage/hooks/useData.ts.html +829 -0
  101. package/coverage/hooks/useFileUpload/index.html +131 -0
  102. package/coverage/hooks/useFileUpload/index.ts.html +112 -0
  103. package/coverage/hooks/useFileUpload/services/index.html +131 -0
  104. package/coverage/hooks/useFileUpload/services/index.ts.html +106 -0
  105. package/coverage/hooks/useFileUpload/services/uploadService.ts.html +610 -0
  106. package/coverage/hooks/useFileUpload/useFileUpload.ts.html +2092 -0
  107. package/coverage/hooks/useFileUpload/utils/fileUtils.ts.html +271 -0
  108. package/coverage/hooks/useFileUpload/utils/index.html +161 -0
  109. package/coverage/hooks/useFileUpload/utils/index.ts.html +109 -0
  110. package/coverage/hooks/useFileUpload/utils/mimeTypes.ts.html +235 -0
  111. package/coverage/hooks/useFileUpload/utils/validation.ts.html +403 -0
  112. package/coverage/hooks/useSession/constants.ts.html +217 -0
  113. package/coverage/hooks/useSession/hooks/index.html +176 -0
  114. package/coverage/hooks/useSession/hooks/useAuthEventSubscriber.ts.html +331 -0
  115. package/coverage/hooks/useSession/hooks/useCrossTabSync.ts.html +535 -0
  116. package/coverage/hooks/useSession/hooks/useSessionActions.ts.html +664 -0
  117. package/coverage/hooks/useSession/hooks/useSessionState.ts.html +295 -0
  118. package/coverage/hooks/useSession/hooks/useTokenRefreshScheduler.ts.html +535 -0
  119. package/coverage/hooks/useSession/index.html +161 -0
  120. package/coverage/hooks/useSession/index.ts.html +127 -0
  121. package/coverage/hooks/useSession/types.ts.html +427 -0
  122. package/coverage/hooks/useSession/useSession.ts.html +526 -0
  123. package/coverage/hooks/useSession/utils/index.html +131 -0
  124. package/coverage/hooks/useSession/utils/initializeSession.ts.html +424 -0
  125. package/coverage/hooks/useSession/utils/tokenUtils.ts.html +298 -0
  126. package/coverage/hooks/useUserData.ts.html +1210 -0
  127. package/coverage/hooks/useUserProfile.ts.html +820 -0
  128. package/coverage/index.html +205 -235
  129. package/coverage/lcov-report/components/CrudiaAutoGenerate.tsx.html +616 -0
  130. package/coverage/lcov-report/components/CrudiaFileField/CrudiaFileField.tsx.html +1312 -0
  131. package/coverage/lcov-report/components/CrudiaFileField/components/DeleteConfirmationDialog.tsx.html +355 -0
  132. package/coverage/lcov-report/components/CrudiaFileField/components/DropZone.tsx.html +523 -0
  133. package/coverage/lcov-report/components/CrudiaFileField/components/FileItemRow.tsx.html +835 -0
  134. package/coverage/lcov-report/components/CrudiaFileField/components/FileThumbnail.tsx.html +1585 -0
  135. package/coverage/lcov-report/components/CrudiaFileField/components/index.html +176 -0
  136. package/coverage/lcov-report/components/CrudiaFileField/components/index.ts.html +115 -0
  137. package/coverage/lcov-report/components/CrudiaFileField/hooks/index.html +146 -0
  138. package/coverage/lcov-report/components/CrudiaFileField/hooks/index.ts.html +112 -0
  139. package/coverage/lcov-report/components/CrudiaFileField/hooks/useDeleteConfirmation.ts.html +433 -0
  140. package/coverage/lcov-report/components/CrudiaFileField/hooks/useDragDrop.ts.html +409 -0
  141. package/coverage/lcov-report/components/CrudiaFileField/index.html +131 -0
  142. package/coverage/lcov-report/components/CrudiaFileField/index.ts.html +112 -0
  143. package/coverage/lcov-report/components/CrudiaFileField/utils/formatters.ts.html +169 -0
  144. package/coverage/lcov-report/components/CrudiaFileField/utils/icons.tsx.html +253 -0
  145. package/coverage/lcov-report/components/CrudiaFileField/utils/index.html +146 -0
  146. package/coverage/lcov-report/components/CrudiaFileField/utils/index.ts.html +103 -0
  147. package/coverage/lcov-report/components/CrudiaMarkdownField.tsx.html +676 -0
  148. package/coverage/lcov-report/components/CrudifyInitializer.tsx.html +712 -0
  149. package/coverage/lcov-report/components/CrudifyLogin/Forms/CheckCodeForm.tsx.html +640 -0
  150. package/coverage/lcov-report/components/CrudifyLogin/Forms/ForgotPasswordForm.tsx.html +730 -0
  151. package/coverage/lcov-report/components/CrudifyLogin/Forms/LoginForm.tsx.html +892 -0
  152. package/coverage/lcov-report/components/CrudifyLogin/Forms/ResetPasswordForm.tsx.html +1219 -0
  153. package/coverage/lcov-report/components/CrudifyLogin/Forms/components/CodeInput.tsx.html +289 -0
  154. package/coverage/lcov-report/components/CrudifyLogin/Forms/components/FormAlert.tsx.html +202 -0
  155. package/coverage/lcov-report/components/CrudifyLogin/Forms/components/PasswordInput.tsx.html +346 -0
  156. package/coverage/lcov-report/components/CrudifyLogin/Forms/components/index.html +161 -0
  157. package/coverage/lcov-report/components/CrudifyLogin/Forms/components/index.ts.html +106 -0
  158. package/coverage/lcov-report/components/CrudifyLogin/Forms/index.html +176 -0
  159. package/coverage/lcov-report/components/CrudifyLogin/Forms/index.ts.html +145 -0
  160. package/coverage/lcov-report/components/CrudifyLogin/Forms/utils/errorTranslation.ts.html +268 -0
  161. package/coverage/lcov-report/components/CrudifyLogin/Forms/utils/index.html +161 -0
  162. package/coverage/lcov-report/components/CrudifyLogin/Forms/utils/index.ts.html +121 -0
  163. package/coverage/lcov-report/components/CrudifyLogin/Forms/utils/paramUtils.ts.html +496 -0
  164. package/coverage/lcov-report/components/CrudifyLogin/Forms/utils/validation.ts.html +307 -0
  165. package/coverage/lcov-report/components/CrudifyLogin/components/CrudifyInitializer.tsx.html +268 -0
  166. package/coverage/lcov-report/components/CrudifyLogin/components/index.html +116 -0
  167. package/coverage/lcov-report/components/CrudifyLogin/context/CrudifyProvider.tsx.html +409 -0
  168. package/coverage/lcov-report/components/CrudifyLogin/context/I18nProvider.tsx.html +430 -0
  169. package/coverage/lcov-report/components/CrudifyLogin/context/LoginStateProvider.tsx.html +1261 -0
  170. package/coverage/lcov-report/components/CrudifyLogin/context/index.html +161 -0
  171. package/coverage/lcov-report/components/CrudifyLogin/context/index.ts.html +91 -0
  172. package/coverage/lcov-report/components/CrudifyLogin/hooks/index.html +131 -0
  173. package/coverage/lcov-report/components/CrudifyLogin/hooks/useCrudifyLogin.ts.html +463 -0
  174. package/coverage/lcov-report/components/CrudifyLogin/hooks/useTranslationsFromUrl.ts.html +391 -0
  175. package/coverage/lcov-report/components/CrudifyLogin/index.html +116 -0
  176. package/coverage/lcov-report/components/CrudifyLogin/index.tsx.html +466 -0
  177. package/coverage/lcov-report/components/CrudifyLogin/utils/index.html +116 -0
  178. package/coverage/lcov-report/components/CrudifyLogin/utils/secureStorage.ts.html +859 -0
  179. package/coverage/lcov-report/components/GlobalNotificationProvider.tsx.html +844 -0
  180. package/coverage/lcov-report/components/LoginComponent.tsx.html +676 -0
  181. package/coverage/lcov-report/components/PasswordRequirements/index.html +116 -0
  182. package/coverage/lcov-report/components/PasswordRequirements/index.tsx.html +232 -0
  183. package/coverage/lcov-report/components/PublicPolicies/FieldSelector/FieldSelector.tsx.html +1078 -0
  184. package/coverage/lcov-report/components/PublicPolicies/FieldSelector/index.html +131 -0
  185. package/coverage/lcov-report/components/PublicPolicies/FieldSelector/index.ts.html +88 -0
  186. package/coverage/lcov-report/components/PublicPolicies/Policies.tsx.html +625 -0
  187. package/coverage/lcov-report/components/PublicPolicies/PolicyItem/PolicyItem.tsx.html +886 -0
  188. package/coverage/lcov-report/components/PublicPolicies/PolicyItem/index.html +131 -0
  189. package/coverage/lcov-report/components/PublicPolicies/PolicyItem/index.ts.html +88 -0
  190. package/coverage/lcov-report/components/PublicPolicies/constants.ts.html +106 -0
  191. package/coverage/lcov-report/components/PublicPolicies/index.html +146 -0
  192. package/coverage/lcov-report/components/PublicPolicies/index.ts.html +88 -0
  193. package/coverage/lcov-report/components/Routing/AuthRoute.tsx.html +382 -0
  194. package/coverage/lcov-report/components/Routing/GuestRoute.tsx.html +352 -0
  195. package/coverage/lcov-report/components/Routing/ProtectedRoute.tsx.html +316 -0
  196. package/coverage/lcov-report/components/Routing/index.html +161 -0
  197. package/coverage/lcov-report/components/Routing/index.ts.html +109 -0
  198. package/coverage/lcov-report/components/SessionLoadingScreen/index.html +116 -0
  199. package/coverage/lcov-report/components/SessionLoadingScreen/index.tsx.html +379 -0
  200. package/coverage/lcov-report/components/SessionTimeIndicator/index.html +116 -0
  201. package/coverage/lcov-report/components/SessionTimeIndicator/index.tsx.html +523 -0
  202. package/coverage/lcov-report/components/UserProfile/UserProfileDisplay.tsx.html +931 -0
  203. package/coverage/lcov-report/components/UserProfile/index.html +131 -0
  204. package/coverage/lcov-report/components/UserProfile/index.ts.html +88 -0
  205. package/coverage/lcov-report/components/index.html +191 -0
  206. package/coverage/lcov-report/components/index.ts.html +178 -0
  207. package/coverage/lcov-report/core/CrossTabSyncManager.ts.html +853 -0
  208. package/coverage/lcov-report/core/CrudifyInitializationManager.ts.html +1279 -0
  209. package/coverage/lcov-report/core/SessionManager.ts.html +3064 -0
  210. package/coverage/lcov-report/core/index.html +146 -0
  211. package/coverage/lcov-report/hooks/index.html +191 -0
  212. package/coverage/lcov-report/hooks/index.ts.html +136 -0
  213. package/coverage/lcov-report/hooks/useAuth.ts.html +529 -0
  214. package/coverage/lcov-report/hooks/useAutoGenerate.ts.html +571 -0
  215. package/coverage/lcov-report/hooks/useCrudifyWithNotifications/constants.ts.html +247 -0
  216. package/coverage/lcov-report/hooks/useCrudifyWithNotifications/hooks/index.html +116 -0
  217. package/coverage/lcov-report/hooks/useCrudifyWithNotifications/hooks/useCrudOperations.ts.html +820 -0
  218. package/coverage/lcov-report/hooks/useCrudifyWithNotifications/index.html +146 -0
  219. package/coverage/lcov-report/hooks/useCrudifyWithNotifications/index.ts.html +118 -0
  220. package/coverage/lcov-report/hooks/useCrudifyWithNotifications/useCrudifyWithNotifications.ts.html +565 -0
  221. package/coverage/lcov-report/hooks/useCrudifyWithNotifications/utils/errorMessageResolver.ts.html +847 -0
  222. package/coverage/lcov-report/hooks/useCrudifyWithNotifications/utils/index.html +146 -0
  223. package/coverage/lcov-report/hooks/useCrudifyWithNotifications/utils/notificationFilters.ts.html +313 -0
  224. package/coverage/lcov-report/hooks/useCrudifyWithNotifications/utils/successMessageResolver.ts.html +265 -0
  225. package/coverage/lcov-report/hooks/useData.ts.html +829 -0
  226. package/coverage/lcov-report/hooks/useFileUpload/index.html +131 -0
  227. package/coverage/lcov-report/hooks/useFileUpload/index.ts.html +112 -0
  228. package/coverage/lcov-report/hooks/useFileUpload/services/index.html +131 -0
  229. package/coverage/lcov-report/hooks/useFileUpload/services/index.ts.html +106 -0
  230. package/coverage/lcov-report/hooks/useFileUpload/services/uploadService.ts.html +610 -0
  231. package/coverage/lcov-report/hooks/useFileUpload/useFileUpload.ts.html +2092 -0
  232. package/coverage/lcov-report/hooks/useFileUpload/utils/fileUtils.ts.html +271 -0
  233. package/coverage/lcov-report/hooks/useFileUpload/utils/index.html +161 -0
  234. package/coverage/lcov-report/hooks/useFileUpload/utils/index.ts.html +109 -0
  235. package/coverage/lcov-report/hooks/useFileUpload/utils/mimeTypes.ts.html +235 -0
  236. package/coverage/lcov-report/hooks/useFileUpload/utils/validation.ts.html +403 -0
  237. package/coverage/lcov-report/hooks/useSession/constants.ts.html +217 -0
  238. package/coverage/lcov-report/hooks/useSession/hooks/index.html +176 -0
  239. package/coverage/lcov-report/hooks/useSession/hooks/useAuthEventSubscriber.ts.html +331 -0
  240. package/coverage/lcov-report/hooks/useSession/hooks/useCrossTabSync.ts.html +535 -0
  241. package/coverage/lcov-report/hooks/useSession/hooks/useSessionActions.ts.html +664 -0
  242. package/coverage/lcov-report/hooks/useSession/hooks/useSessionState.ts.html +295 -0
  243. package/coverage/lcov-report/hooks/useSession/hooks/useTokenRefreshScheduler.ts.html +535 -0
  244. package/coverage/lcov-report/hooks/useSession/index.html +161 -0
  245. package/coverage/lcov-report/hooks/useSession/index.ts.html +127 -0
  246. package/coverage/lcov-report/hooks/useSession/types.ts.html +427 -0
  247. package/coverage/lcov-report/hooks/useSession/useSession.ts.html +526 -0
  248. package/coverage/lcov-report/hooks/useSession/utils/index.html +131 -0
  249. package/coverage/lcov-report/hooks/useSession/utils/initializeSession.ts.html +424 -0
  250. package/coverage/lcov-report/hooks/useSession/utils/tokenUtils.ts.html +298 -0
  251. package/coverage/lcov-report/hooks/useUserData.ts.html +1210 -0
  252. package/coverage/lcov-report/hooks/useUserProfile.ts.html +820 -0
  253. package/coverage/lcov-report/index.html +205 -235
  254. package/coverage/lcov-report/providers/CrudifyThemeProvider.tsx.html +316 -0
  255. package/coverage/lcov-report/providers/SessionProvider.tsx.html +1120 -0
  256. package/coverage/lcov-report/providers/TranslationsProvider.tsx.html +1756 -0
  257. package/coverage/lcov-report/providers/index.html +146 -0
  258. package/coverage/lcov-report/services/credentialsEventBus.ts.html +319 -0
  259. package/coverage/lcov-report/services/crudifyAdminWrapper.ts.html +754 -0
  260. package/coverage/lcov-report/services/index.html +146 -0
  261. package/coverage/lcov-report/services/translationService.ts.html +1558 -0
  262. package/coverage/lcov-report/translations/critical.ts.html +1216 -0
  263. package/coverage/lcov-report/translations/index.html +116 -0
  264. package/coverage/lcov-report/types/index.html +116 -0
  265. package/coverage/lcov-report/types/password.ts.html +178 -0
  266. package/coverage/lcov-report/utils/authErrorDetector.ts.html +793 -0
  267. package/coverage/lcov-report/utils/authEventBus.ts.html +454 -0
  268. package/coverage/lcov-report/utils/configResolver.ts.html +460 -0
  269. package/coverage/lcov-report/utils/cookieSync.ts.html +595 -0
  270. package/coverage/lcov-report/utils/errorHandler.ts.html +1480 -0
  271. package/coverage/lcov-report/utils/errorTranslation.ts.html +868 -0
  272. package/coverage/lcov-report/utils/index.html +341 -0
  273. package/coverage/lcov-report/utils/index.ts.html +193 -0
  274. package/coverage/lcov-report/utils/jwtUtils.ts.html +325 -0
  275. package/coverage/lcov-report/utils/logger.ts.html +952 -0
  276. package/coverage/lcov-report/utils/navigationTracker.ts.html +562 -0
  277. package/coverage/lcov-report/utils/passwordValidation.ts.html +259 -0
  278. package/coverage/lcov-report/utils/preAuthCheck.ts.html +442 -0
  279. package/coverage/lcov-report/utils/redirectSecurity.ts.html +733 -0
  280. package/coverage/lcov-report/utils/tenantConfig.ts.html +712 -0
  281. package/coverage/lcov-report/utils/tokenStorage.ts.html +1825 -0
  282. package/coverage/lcov-report/utils/webCrypto.ts.html +490 -0
  283. package/coverage/lcov.info +14988 -14009
  284. package/coverage/providers/CrudifyThemeProvider.tsx.html +316 -0
  285. package/coverage/providers/SessionProvider.tsx.html +1120 -0
  286. package/coverage/providers/TranslationsProvider.tsx.html +1756 -0
  287. package/coverage/providers/index.html +146 -0
  288. package/coverage/services/credentialsEventBus.ts.html +319 -0
  289. package/coverage/services/crudifyAdminWrapper.ts.html +754 -0
  290. package/coverage/services/index.html +146 -0
  291. package/coverage/services/translationService.ts.html +1558 -0
  292. package/coverage/translations/critical.ts.html +1216 -0
  293. package/coverage/translations/index.html +116 -0
  294. package/coverage/types/index.html +116 -0
  295. package/coverage/types/password.ts.html +178 -0
  296. package/coverage/utils/authErrorDetector.ts.html +793 -0
  297. package/coverage/utils/authEventBus.ts.html +454 -0
  298. package/coverage/utils/configResolver.ts.html +460 -0
  299. package/coverage/utils/cookieSync.ts.html +595 -0
  300. package/coverage/utils/errorHandler.ts.html +1480 -0
  301. package/coverage/utils/errorTranslation.ts.html +868 -0
  302. package/coverage/utils/index.html +341 -0
  303. package/coverage/utils/index.ts.html +193 -0
  304. package/coverage/utils/jwtUtils.ts.html +325 -0
  305. package/coverage/utils/logger.ts.html +952 -0
  306. package/coverage/utils/navigationTracker.ts.html +562 -0
  307. package/coverage/utils/passwordValidation.ts.html +259 -0
  308. package/coverage/utils/preAuthCheck.ts.html +442 -0
  309. package/coverage/utils/redirectSecurity.ts.html +733 -0
  310. package/coverage/utils/tenantConfig.ts.html +712 -0
  311. package/coverage/utils/tokenStorage.ts.html +1825 -0
  312. package/coverage/utils/webCrypto.ts.html +490 -0
  313. package/dist/{CrudiaMarkdownField-CkiBwG-U.d.ts → CrudiaMarkdownField-DM6NR8zw.d.mts} +22 -22
  314. package/dist/{CrudiaMarkdownField-D-DqiXMQ.d.mts → CrudiaMarkdownField-UJaiSq9_.d.ts} +22 -22
  315. package/dist/{GlobalNotificationProvider-CdwdNv_8.d.mts → GlobalNotificationProvider-Cx540WKg.d.mts} +15 -15
  316. package/dist/{GlobalNotificationProvider-CdwdNv_8.d.ts → GlobalNotificationProvider-Cx540WKg.d.ts} +15 -15
  317. package/dist/chunk-2DXLCBOT.mjs +1 -0
  318. package/dist/chunk-DYRZIARH.js +1 -0
  319. package/dist/chunk-GCSJXEGT.mjs +1 -0
  320. package/dist/chunk-GJUZD5ZN.js +1 -0
  321. package/dist/chunk-K47I475N.js +1 -0
  322. package/dist/chunk-OCYZGEM5.mjs +1 -0
  323. package/dist/chunk-PI7HPRDB.js +1 -0
  324. package/dist/chunk-QVEUGJBY.mjs +1 -0
  325. package/dist/chunk-UROR7G7N.mjs +1 -0
  326. package/dist/chunk-XFT47DEL.js +1 -0
  327. package/dist/components.d.mts +8 -8
  328. package/dist/components.d.ts +8 -8
  329. package/dist/components.js +1 -1
  330. package/dist/components.mjs +1 -1
  331. package/dist/{errorTranslation-CF-5JClP.d.ts → errorTranslation-BEWwDbCH.d.ts} +1 -1
  332. package/dist/{errorTranslation-BcX8AaK7.d.mts → errorTranslation-DsGZon0M.d.mts} +1 -1
  333. package/dist/hooks.d.mts +3 -3
  334. package/dist/hooks.d.ts +3 -3
  335. package/dist/hooks.js +1 -1
  336. package/dist/hooks.mjs +1 -1
  337. package/dist/{index-DEDnmsdO.d.ts → index-Dnmttf62.d.ts} +131 -114
  338. package/dist/{index-D06kTP0C.d.mts → index-ZcF6nJt4.d.mts} +131 -114
  339. package/dist/index.d.mts +153 -106
  340. package/dist/index.d.ts +153 -106
  341. package/dist/index.js +2 -2
  342. package/dist/index.mjs +2 -2
  343. package/dist/{tenantConfig-CYnS9TPV.d.mts → tenantConfig-DxpfrAof.d.mts} +1 -1
  344. package/dist/{tenantConfig-CYnS9TPV.d.ts → tenantConfig-DxpfrAof.d.ts} +1 -1
  345. package/dist/utils.d.mts +25 -25
  346. package/dist/utils.d.ts +25 -25
  347. package/dist/utils.js +1 -1
  348. package/dist/utils.mjs +1 -1
  349. package/eslint.config.mjs +2 -2
  350. package/package.json +1 -1
  351. package/tests/helpers/mockFactories.ts +218 -0
  352. package/tests/helpers/testUtils.tsx +66 -1
  353. package/vitest.config.ts +1 -0
  354. package/dist/chunk-2WAUZ6KI.js +0 -1
  355. package/dist/chunk-3IGZNZCT.mjs +0 -1
  356. package/dist/chunk-43L2PP77.mjs +0 -1
  357. package/dist/chunk-6VS5OT3A.mjs +0 -1
  358. package/dist/chunk-BWJTTMKS.js +0 -1
  359. package/dist/chunk-EMPPCCVU.js +0 -1
  360. package/dist/chunk-J43UPGBE.js +0 -1
  361. package/dist/chunk-K6ZRXOJ7.mjs +0 -1
  362. package/dist/chunk-RYQQZTEP.js +0 -1
  363. package/dist/chunk-VTMSOK4V.mjs +0 -1
@@ -0,0 +1,853 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for core/CrossTabSyncManager.ts</title>
7
+ <meta charset="utf-8" />
8
+ <link rel="stylesheet" href="../prettify.css" />
9
+ <link rel="stylesheet" href="../base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <style type='text/css'>
13
+ .coverage-summary .sorter {
14
+ background-image: url(../sort-arrow-sprite.png);
15
+ }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <div class='wrapper'>
21
+ <div class='pad1'>
22
+ <h1><a href="../index.html">All files</a> / <a href="index.html">core</a> CrossTabSyncManager.ts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">64.06% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>164/256</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">66.66% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>6/9</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">31.25% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>5/16</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">64.06% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>164/256</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ <template id="filterTemplate">
58
+ <div class="quiet">
59
+ Filter:
60
+ <input type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line medium'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</a>
96
+ <a name='L31'></a><a href='#L31'>31</a>
97
+ <a name='L32'></a><a href='#L32'>32</a>
98
+ <a name='L33'></a><a href='#L33'>33</a>
99
+ <a name='L34'></a><a href='#L34'>34</a>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a>
105
+ <a name='L40'></a><a href='#L40'>40</a>
106
+ <a name='L41'></a><a href='#L41'>41</a>
107
+ <a name='L42'></a><a href='#L42'>42</a>
108
+ <a name='L43'></a><a href='#L43'>43</a>
109
+ <a name='L44'></a><a href='#L44'>44</a>
110
+ <a name='L45'></a><a href='#L45'>45</a>
111
+ <a name='L46'></a><a href='#L46'>46</a>
112
+ <a name='L47'></a><a href='#L47'>47</a>
113
+ <a name='L48'></a><a href='#L48'>48</a>
114
+ <a name='L49'></a><a href='#L49'>49</a>
115
+ <a name='L50'></a><a href='#L50'>50</a>
116
+ <a name='L51'></a><a href='#L51'>51</a>
117
+ <a name='L52'></a><a href='#L52'>52</a>
118
+ <a name='L53'></a><a href='#L53'>53</a>
119
+ <a name='L54'></a><a href='#L54'>54</a>
120
+ <a name='L55'></a><a href='#L55'>55</a>
121
+ <a name='L56'></a><a href='#L56'>56</a>
122
+ <a name='L57'></a><a href='#L57'>57</a>
123
+ <a name='L58'></a><a href='#L58'>58</a>
124
+ <a name='L59'></a><a href='#L59'>59</a>
125
+ <a name='L60'></a><a href='#L60'>60</a>
126
+ <a name='L61'></a><a href='#L61'>61</a>
127
+ <a name='L62'></a><a href='#L62'>62</a>
128
+ <a name='L63'></a><a href='#L63'>63</a>
129
+ <a name='L64'></a><a href='#L64'>64</a>
130
+ <a name='L65'></a><a href='#L65'>65</a>
131
+ <a name='L66'></a><a href='#L66'>66</a>
132
+ <a name='L67'></a><a href='#L67'>67</a>
133
+ <a name='L68'></a><a href='#L68'>68</a>
134
+ <a name='L69'></a><a href='#L69'>69</a>
135
+ <a name='L70'></a><a href='#L70'>70</a>
136
+ <a name='L71'></a><a href='#L71'>71</a>
137
+ <a name='L72'></a><a href='#L72'>72</a>
138
+ <a name='L73'></a><a href='#L73'>73</a>
139
+ <a name='L74'></a><a href='#L74'>74</a>
140
+ <a name='L75'></a><a href='#L75'>75</a>
141
+ <a name='L76'></a><a href='#L76'>76</a>
142
+ <a name='L77'></a><a href='#L77'>77</a>
143
+ <a name='L78'></a><a href='#L78'>78</a>
144
+ <a name='L79'></a><a href='#L79'>79</a>
145
+ <a name='L80'></a><a href='#L80'>80</a>
146
+ <a name='L81'></a><a href='#L81'>81</a>
147
+ <a name='L82'></a><a href='#L82'>82</a>
148
+ <a name='L83'></a><a href='#L83'>83</a>
149
+ <a name='L84'></a><a href='#L84'>84</a>
150
+ <a name='L85'></a><a href='#L85'>85</a>
151
+ <a name='L86'></a><a href='#L86'>86</a>
152
+ <a name='L87'></a><a href='#L87'>87</a>
153
+ <a name='L88'></a><a href='#L88'>88</a>
154
+ <a name='L89'></a><a href='#L89'>89</a>
155
+ <a name='L90'></a><a href='#L90'>90</a>
156
+ <a name='L91'></a><a href='#L91'>91</a>
157
+ <a name='L92'></a><a href='#L92'>92</a>
158
+ <a name='L93'></a><a href='#L93'>93</a>
159
+ <a name='L94'></a><a href='#L94'>94</a>
160
+ <a name='L95'></a><a href='#L95'>95</a>
161
+ <a name='L96'></a><a href='#L96'>96</a>
162
+ <a name='L97'></a><a href='#L97'>97</a>
163
+ <a name='L98'></a><a href='#L98'>98</a>
164
+ <a name='L99'></a><a href='#L99'>99</a>
165
+ <a name='L100'></a><a href='#L100'>100</a>
166
+ <a name='L101'></a><a href='#L101'>101</a>
167
+ <a name='L102'></a><a href='#L102'>102</a>
168
+ <a name='L103'></a><a href='#L103'>103</a>
169
+ <a name='L104'></a><a href='#L104'>104</a>
170
+ <a name='L105'></a><a href='#L105'>105</a>
171
+ <a name='L106'></a><a href='#L106'>106</a>
172
+ <a name='L107'></a><a href='#L107'>107</a>
173
+ <a name='L108'></a><a href='#L108'>108</a>
174
+ <a name='L109'></a><a href='#L109'>109</a>
175
+ <a name='L110'></a><a href='#L110'>110</a>
176
+ <a name='L111'></a><a href='#L111'>111</a>
177
+ <a name='L112'></a><a href='#L112'>112</a>
178
+ <a name='L113'></a><a href='#L113'>113</a>
179
+ <a name='L114'></a><a href='#L114'>114</a>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</a>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a>
192
+ <a name='L127'></a><a href='#L127'>127</a>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a>
198
+ <a name='L133'></a><a href='#L133'>133</a>
199
+ <a name='L134'></a><a href='#L134'>134</a>
200
+ <a name='L135'></a><a href='#L135'>135</a>
201
+ <a name='L136'></a><a href='#L136'>136</a>
202
+ <a name='L137'></a><a href='#L137'>137</a>
203
+ <a name='L138'></a><a href='#L138'>138</a>
204
+ <a name='L139'></a><a href='#L139'>139</a>
205
+ <a name='L140'></a><a href='#L140'>140</a>
206
+ <a name='L141'></a><a href='#L141'>141</a>
207
+ <a name='L142'></a><a href='#L142'>142</a>
208
+ <a name='L143'></a><a href='#L143'>143</a>
209
+ <a name='L144'></a><a href='#L144'>144</a>
210
+ <a name='L145'></a><a href='#L145'>145</a>
211
+ <a name='L146'></a><a href='#L146'>146</a>
212
+ <a name='L147'></a><a href='#L147'>147</a>
213
+ <a name='L148'></a><a href='#L148'>148</a>
214
+ <a name='L149'></a><a href='#L149'>149</a>
215
+ <a name='L150'></a><a href='#L150'>150</a>
216
+ <a name='L151'></a><a href='#L151'>151</a>
217
+ <a name='L152'></a><a href='#L152'>152</a>
218
+ <a name='L153'></a><a href='#L153'>153</a>
219
+ <a name='L154'></a><a href='#L154'>154</a>
220
+ <a name='L155'></a><a href='#L155'>155</a>
221
+ <a name='L156'></a><a href='#L156'>156</a>
222
+ <a name='L157'></a><a href='#L157'>157</a>
223
+ <a name='L158'></a><a href='#L158'>158</a>
224
+ <a name='L159'></a><a href='#L159'>159</a>
225
+ <a name='L160'></a><a href='#L160'>160</a>
226
+ <a name='L161'></a><a href='#L161'>161</a>
227
+ <a name='L162'></a><a href='#L162'>162</a>
228
+ <a name='L163'></a><a href='#L163'>163</a>
229
+ <a name='L164'></a><a href='#L164'>164</a>
230
+ <a name='L165'></a><a href='#L165'>165</a>
231
+ <a name='L166'></a><a href='#L166'>166</a>
232
+ <a name='L167'></a><a href='#L167'>167</a>
233
+ <a name='L168'></a><a href='#L168'>168</a>
234
+ <a name='L169'></a><a href='#L169'>169</a>
235
+ <a name='L170'></a><a href='#L170'>170</a>
236
+ <a name='L171'></a><a href='#L171'>171</a>
237
+ <a name='L172'></a><a href='#L172'>172</a>
238
+ <a name='L173'></a><a href='#L173'>173</a>
239
+ <a name='L174'></a><a href='#L174'>174</a>
240
+ <a name='L175'></a><a href='#L175'>175</a>
241
+ <a name='L176'></a><a href='#L176'>176</a>
242
+ <a name='L177'></a><a href='#L177'>177</a>
243
+ <a name='L178'></a><a href='#L178'>178</a>
244
+ <a name='L179'></a><a href='#L179'>179</a>
245
+ <a name='L180'></a><a href='#L180'>180</a>
246
+ <a name='L181'></a><a href='#L181'>181</a>
247
+ <a name='L182'></a><a href='#L182'>182</a>
248
+ <a name='L183'></a><a href='#L183'>183</a>
249
+ <a name='L184'></a><a href='#L184'>184</a>
250
+ <a name='L185'></a><a href='#L185'>185</a>
251
+ <a name='L186'></a><a href='#L186'>186</a>
252
+ <a name='L187'></a><a href='#L187'>187</a>
253
+ <a name='L188'></a><a href='#L188'>188</a>
254
+ <a name='L189'></a><a href='#L189'>189</a>
255
+ <a name='L190'></a><a href='#L190'>190</a>
256
+ <a name='L191'></a><a href='#L191'>191</a>
257
+ <a name='L192'></a><a href='#L192'>192</a>
258
+ <a name='L193'></a><a href='#L193'>193</a>
259
+ <a name='L194'></a><a href='#L194'>194</a>
260
+ <a name='L195'></a><a href='#L195'>195</a>
261
+ <a name='L196'></a><a href='#L196'>196</a>
262
+ <a name='L197'></a><a href='#L197'>197</a>
263
+ <a name='L198'></a><a href='#L198'>198</a>
264
+ <a name='L199'></a><a href='#L199'>199</a>
265
+ <a name='L200'></a><a href='#L200'>200</a>
266
+ <a name='L201'></a><a href='#L201'>201</a>
267
+ <a name='L202'></a><a href='#L202'>202</a>
268
+ <a name='L203'></a><a href='#L203'>203</a>
269
+ <a name='L204'></a><a href='#L204'>204</a>
270
+ <a name='L205'></a><a href='#L205'>205</a>
271
+ <a name='L206'></a><a href='#L206'>206</a>
272
+ <a name='L207'></a><a href='#L207'>207</a>
273
+ <a name='L208'></a><a href='#L208'>208</a>
274
+ <a name='L209'></a><a href='#L209'>209</a>
275
+ <a name='L210'></a><a href='#L210'>210</a>
276
+ <a name='L211'></a><a href='#L211'>211</a>
277
+ <a name='L212'></a><a href='#L212'>212</a>
278
+ <a name='L213'></a><a href='#L213'>213</a>
279
+ <a name='L214'></a><a href='#L214'>214</a>
280
+ <a name='L215'></a><a href='#L215'>215</a>
281
+ <a name='L216'></a><a href='#L216'>216</a>
282
+ <a name='L217'></a><a href='#L217'>217</a>
283
+ <a name='L218'></a><a href='#L218'>218</a>
284
+ <a name='L219'></a><a href='#L219'>219</a>
285
+ <a name='L220'></a><a href='#L220'>220</a>
286
+ <a name='L221'></a><a href='#L221'>221</a>
287
+ <a name='L222'></a><a href='#L222'>222</a>
288
+ <a name='L223'></a><a href='#L223'>223</a>
289
+ <a name='L224'></a><a href='#L224'>224</a>
290
+ <a name='L225'></a><a href='#L225'>225</a>
291
+ <a name='L226'></a><a href='#L226'>226</a>
292
+ <a name='L227'></a><a href='#L227'>227</a>
293
+ <a name='L228'></a><a href='#L228'>228</a>
294
+ <a name='L229'></a><a href='#L229'>229</a>
295
+ <a name='L230'></a><a href='#L230'>230</a>
296
+ <a name='L231'></a><a href='#L231'>231</a>
297
+ <a name='L232'></a><a href='#L232'>232</a>
298
+ <a name='L233'></a><a href='#L233'>233</a>
299
+ <a name='L234'></a><a href='#L234'>234</a>
300
+ <a name='L235'></a><a href='#L235'>235</a>
301
+ <a name='L236'></a><a href='#L236'>236</a>
302
+ <a name='L237'></a><a href='#L237'>237</a>
303
+ <a name='L238'></a><a href='#L238'>238</a>
304
+ <a name='L239'></a><a href='#L239'>239</a>
305
+ <a name='L240'></a><a href='#L240'>240</a>
306
+ <a name='L241'></a><a href='#L241'>241</a>
307
+ <a name='L242'></a><a href='#L242'>242</a>
308
+ <a name='L243'></a><a href='#L243'>243</a>
309
+ <a name='L244'></a><a href='#L244'>244</a>
310
+ <a name='L245'></a><a href='#L245'>245</a>
311
+ <a name='L246'></a><a href='#L246'>246</a>
312
+ <a name='L247'></a><a href='#L247'>247</a>
313
+ <a name='L248'></a><a href='#L248'>248</a>
314
+ <a name='L249'></a><a href='#L249'>249</a>
315
+ <a name='L250'></a><a href='#L250'>250</a>
316
+ <a name='L251'></a><a href='#L251'>251</a>
317
+ <a name='L252'></a><a href='#L252'>252</a>
318
+ <a name='L253'></a><a href='#L253'>253</a>
319
+ <a name='L254'></a><a href='#L254'>254</a>
320
+ <a name='L255'></a><a href='#L255'>255</a>
321
+ <a name='L256'></a><a href='#L256'>256</a>
322
+ <a name='L257'></a><a href='#L257'>257</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
323
+ <span class="cline-any cline-yes">1x</span>
324
+ <span class="cline-any cline-yes">1x</span>
325
+ <span class="cline-any cline-yes">1x</span>
326
+ <span class="cline-any cline-yes">1x</span>
327
+ <span class="cline-any cline-yes">1x</span>
328
+ <span class="cline-any cline-yes">1x</span>
329
+ <span class="cline-any cline-yes">1x</span>
330
+ <span class="cline-any cline-yes">1x</span>
331
+ <span class="cline-any cline-yes">1x</span>
332
+ <span class="cline-any cline-yes">1x</span>
333
+ <span class="cline-any cline-yes">1x</span>
334
+ <span class="cline-any cline-yes">1x</span>
335
+ <span class="cline-any cline-yes">1x</span>
336
+ <span class="cline-any cline-yes">1x</span>
337
+ <span class="cline-any cline-yes">1x</span>
338
+ <span class="cline-any cline-yes">1x</span>
339
+ <span class="cline-any cline-yes">1x</span>
340
+ <span class="cline-any cline-yes">1x</span>
341
+ <span class="cline-any cline-yes">1x</span>
342
+ <span class="cline-any cline-yes">1x</span>
343
+ <span class="cline-any cline-yes">1x</span>
344
+ <span class="cline-any cline-yes">1x</span>
345
+ <span class="cline-any cline-yes">1x</span>
346
+ <span class="cline-any cline-yes">1x</span>
347
+ <span class="cline-any cline-yes">1x</span>
348
+ <span class="cline-any cline-yes">1x</span>
349
+ <span class="cline-any cline-yes">1x</span>
350
+ <span class="cline-any cline-yes">1x</span>
351
+ <span class="cline-any cline-yes">1x</span>
352
+ <span class="cline-any cline-yes">1x</span>
353
+ <span class="cline-any cline-yes">1x</span>
354
+ <span class="cline-any cline-yes">1x</span>
355
+ <span class="cline-any cline-yes">1x</span>
356
+ <span class="cline-any cline-yes">1x</span>
357
+ <span class="cline-any cline-yes">1x</span>
358
+ <span class="cline-any cline-yes">1x</span>
359
+ <span class="cline-any cline-yes">1x</span>
360
+ <span class="cline-any cline-yes">1x</span>
361
+ <span class="cline-any cline-yes">1x</span>
362
+ <span class="cline-any cline-yes">1x</span>
363
+ <span class="cline-any cline-yes">1x</span>
364
+ <span class="cline-any cline-yes">1x</span>
365
+ <span class="cline-any cline-yes">1x</span>
366
+ <span class="cline-any cline-yes">1x</span>
367
+ <span class="cline-any cline-yes">1x</span>
368
+ <span class="cline-any cline-yes">1x</span>
369
+ <span class="cline-any cline-yes">1x</span>
370
+ <span class="cline-any cline-yes">1x</span>
371
+ <span class="cline-any cline-yes">1x</span>
372
+ <span class="cline-any cline-yes">1x</span>
373
+ <span class="cline-any cline-yes">1x</span>
374
+ <span class="cline-any cline-yes">1x</span>
375
+ <span class="cline-any cline-yes">1x</span>
376
+ <span class="cline-any cline-yes">1x</span>
377
+ <span class="cline-any cline-yes">1x</span>
378
+ <span class="cline-any cline-yes">1x</span>
379
+ <span class="cline-any cline-yes">1x</span>
380
+ <span class="cline-any cline-yes">1x</span>
381
+ <span class="cline-any cline-yes">1x</span>
382
+ <span class="cline-any cline-yes">3x</span>
383
+ <span class="cline-any cline-yes">3x</span>
384
+ <span class="cline-any cline-yes">3x</span>
385
+ <span class="cline-any cline-yes">1x</span>
386
+ <span class="cline-any cline-yes">1x</span>
387
+ <span class="cline-any cline-yes">1x</span>
388
+ <span class="cline-any cline-yes">1x</span>
389
+ <span class="cline-any cline-yes">1x</span>
390
+ <span class="cline-any cline-yes">3x</span>
391
+ <span class="cline-any cline-yes">3x</span>
392
+ <span class="cline-any cline-yes">3x</span>
393
+ <span class="cline-any cline-yes">3x</span>
394
+ <span class="cline-any cline-yes">3x</span>
395
+ <span class="cline-any cline-yes">3x</span>
396
+ <span class="cline-any cline-yes">1x</span>
397
+ <span class="cline-any cline-yes">1x</span>
398
+ <span class="cline-any cline-yes">1x</span>
399
+ <span class="cline-any cline-yes">1x</span>
400
+ <span class="cline-any cline-yes">1x</span>
401
+ <span class="cline-any cline-yes">3x</span>
402
+ <span class="cline-any cline-yes">3x</span>
403
+ <span class="cline-any cline-yes">3x</span>
404
+ <span class="cline-any cline-yes">1x</span>
405
+ <span class="cline-any cline-yes">1x</span>
406
+ <span class="cline-any cline-yes">1x</span>
407
+ <span class="cline-any cline-yes">1x</span>
408
+ <span class="cline-any cline-yes">1x</span>
409
+ <span class="cline-any cline-no">&nbsp;</span>
410
+ <span class="cline-any cline-no">&nbsp;</span>
411
+ <span class="cline-any cline-no">&nbsp;</span>
412
+ <span class="cline-any cline-no">&nbsp;</span>
413
+ <span class="cline-any cline-no">&nbsp;</span>
414
+ <span class="cline-any cline-yes">1x</span>
415
+ <span class="cline-any cline-yes">1x</span>
416
+ <span class="cline-any cline-yes">1x</span>
417
+ <span class="cline-any cline-yes">1x</span>
418
+ <span class="cline-any cline-yes">1x</span>
419
+ <span class="cline-any cline-yes">3x</span>
420
+ <span class="cline-any cline-no">&nbsp;</span>
421
+ <span class="cline-any cline-no">&nbsp;</span>
422
+ <span class="cline-any cline-yes">3x</span>
423
+ <span class="cline-any cline-yes">3x</span>
424
+ <span class="cline-any cline-yes">3x</span>
425
+ <span class="cline-any cline-yes">3x</span>
426
+ <span class="cline-any cline-no">&nbsp;</span>
427
+ <span class="cline-any cline-yes">3x</span>
428
+ <span class="cline-any cline-yes">3x</span>
429
+ <span class="cline-any cline-yes">3x</span>
430
+ <span class="cline-any cline-no">&nbsp;</span>
431
+ <span class="cline-any cline-no">&nbsp;</span>
432
+ <span class="cline-any cline-yes">3x</span>
433
+ <span class="cline-any cline-no">&nbsp;</span>
434
+ <span class="cline-any cline-no">&nbsp;</span>
435
+ <span class="cline-any cline-yes">3x</span>
436
+ <span class="cline-any cline-yes">3x</span>
437
+ <span class="cline-any cline-yes">3x</span>
438
+ <span class="cline-any cline-yes">3x</span>
439
+ <span class="cline-any cline-yes">3x</span>
440
+ <span class="cline-any cline-no">&nbsp;</span>
441
+ <span class="cline-any cline-no">&nbsp;</span>
442
+ <span class="cline-any cline-no">&nbsp;</span>
443
+ <span class="cline-any cline-no">&nbsp;</span>
444
+ <span class="cline-any cline-yes">3x</span>
445
+ <span class="cline-any cline-yes">1x</span>
446
+ <span class="cline-any cline-yes">1x</span>
447
+ <span class="cline-any cline-yes">1x</span>
448
+ <span class="cline-any cline-yes">1x</span>
449
+ <span class="cline-any cline-yes">1x</span>
450
+ <span class="cline-any cline-no">&nbsp;</span>
451
+ <span class="cline-any cline-no">&nbsp;</span>
452
+ <span class="cline-any cline-no">&nbsp;</span>
453
+ <span class="cline-any cline-no">&nbsp;</span>
454
+ <span class="cline-any cline-no">&nbsp;</span>
455
+ <span class="cline-any cline-no">&nbsp;</span>
456
+ <span class="cline-any cline-no">&nbsp;</span>
457
+ <span class="cline-any cline-yes">1x</span>
458
+ <span class="cline-any cline-yes">1x</span>
459
+ <span class="cline-any cline-yes">1x</span>
460
+ <span class="cline-any cline-yes">1x</span>
461
+ <span class="cline-any cline-yes">1x</span>
462
+ <span class="cline-any cline-no">&nbsp;</span>
463
+ <span class="cline-any cline-no">&nbsp;</span>
464
+ <span class="cline-any cline-yes">1x</span>
465
+ <span class="cline-any cline-yes">1x</span>
466
+ <span class="cline-any cline-yes">1x</span>
467
+ <span class="cline-any cline-yes">1x</span>
468
+ <span class="cline-any cline-yes">1x</span>
469
+ <span class="cline-any cline-yes">1x</span>
470
+ <span class="cline-any cline-yes">85x</span>
471
+ <span class="cline-any cline-yes">85x</span>
472
+ <span class="cline-any cline-yes">85x</span>
473
+ <span class="cline-any cline-yes">85x</span>
474
+ <span class="cline-any cline-yes">85x</span>
475
+ <span class="cline-any cline-yes">1x</span>
476
+ <span class="cline-any cline-yes">1x</span>
477
+ <span class="cline-any cline-yes">1x</span>
478
+ <span class="cline-any cline-yes">1x</span>
479
+ <span class="cline-any cline-yes">1x</span>
480
+ <span class="cline-any cline-no">&nbsp;</span>
481
+ <span class="cline-any cline-no">&nbsp;</span>
482
+ <span class="cline-any cline-no">&nbsp;</span>
483
+ <span class="cline-any cline-no">&nbsp;</span>
484
+ <span class="cline-any cline-no">&nbsp;</span>
485
+ <span class="cline-any cline-no">&nbsp;</span>
486
+ <span class="cline-any cline-yes">1x</span>
487
+ <span class="cline-any cline-yes">1x</span>
488
+ <span class="cline-any cline-yes">1x</span>
489
+ <span class="cline-any cline-yes">1x</span>
490
+ <span class="cline-any cline-yes">1x</span>
491
+ <span class="cline-any cline-no">&nbsp;</span>
492
+ <span class="cline-any cline-no">&nbsp;</span>
493
+ <span class="cline-any cline-no">&nbsp;</span>
494
+ <span class="cline-any cline-no">&nbsp;</span>
495
+ <span class="cline-any cline-no">&nbsp;</span>
496
+ <span class="cline-any cline-no">&nbsp;</span>
497
+ <span class="cline-any cline-yes">1x</span>
498
+ <span class="cline-any cline-yes">1x</span>
499
+ <span class="cline-any cline-yes">1x</span>
500
+ <span class="cline-any cline-yes">1x</span>
501
+ <span class="cline-any cline-yes">1x</span>
502
+ <span class="cline-any cline-no">&nbsp;</span>
503
+ <span class="cline-any cline-no">&nbsp;</span>
504
+ <span class="cline-any cline-no">&nbsp;</span>
505
+ <span class="cline-any cline-no">&nbsp;</span>
506
+ <span class="cline-any cline-no">&nbsp;</span>
507
+ <span class="cline-any cline-no">&nbsp;</span>
508
+ <span class="cline-any cline-yes">1x</span>
509
+ <span class="cline-any cline-yes">1x</span>
510
+ <span class="cline-any cline-yes">1x</span>
511
+ <span class="cline-any cline-yes">1x</span>
512
+ <span class="cline-any cline-yes">1x</span>
513
+ <span class="cline-any cline-no">&nbsp;</span>
514
+ <span class="cline-any cline-no">&nbsp;</span>
515
+ <span class="cline-any cline-no">&nbsp;</span>
516
+ <span class="cline-any cline-no">&nbsp;</span>
517
+ <span class="cline-any cline-no">&nbsp;</span>
518
+ <span class="cline-any cline-no">&nbsp;</span>
519
+ <span class="cline-any cline-yes">1x</span>
520
+ <span class="cline-any cline-yes">1x</span>
521
+ <span class="cline-any cline-yes">1x</span>
522
+ <span class="cline-any cline-yes">1x</span>
523
+ <span class="cline-any cline-yes">1x</span>
524
+ <span class="cline-any cline-no">&nbsp;</span>
525
+ <span class="cline-any cline-no">&nbsp;</span>
526
+ <span class="cline-any cline-no">&nbsp;</span>
527
+ <span class="cline-any cline-no">&nbsp;</span>
528
+ <span class="cline-any cline-no">&nbsp;</span>
529
+ <span class="cline-any cline-no">&nbsp;</span>
530
+ <span class="cline-any cline-no">&nbsp;</span>
531
+ <span class="cline-any cline-no">&nbsp;</span>
532
+ <span class="cline-any cline-no">&nbsp;</span>
533
+ <span class="cline-any cline-no">&nbsp;</span>
534
+ <span class="cline-any cline-no">&nbsp;</span>
535
+ <span class="cline-any cline-no">&nbsp;</span>
536
+ <span class="cline-any cline-no">&nbsp;</span>
537
+ <span class="cline-any cline-no">&nbsp;</span>
538
+ <span class="cline-any cline-no">&nbsp;</span>
539
+ <span class="cline-any cline-yes">1x</span>
540
+ <span class="cline-any cline-yes">1x</span>
541
+ <span class="cline-any cline-yes">1x</span>
542
+ <span class="cline-any cline-yes">1x</span>
543
+ <span class="cline-any cline-yes">1x</span>
544
+ <span class="cline-any cline-no">&nbsp;</span>
545
+ <span class="cline-any cline-no">&nbsp;</span>
546
+ <span class="cline-any cline-no">&nbsp;</span>
547
+ <span class="cline-any cline-no">&nbsp;</span>
548
+ <span class="cline-any cline-no">&nbsp;</span>
549
+ <span class="cline-any cline-no">&nbsp;</span>
550
+ <span class="cline-any cline-no">&nbsp;</span>
551
+ <span class="cline-any cline-no">&nbsp;</span>
552
+ <span class="cline-any cline-no">&nbsp;</span>
553
+ <span class="cline-any cline-no">&nbsp;</span>
554
+ <span class="cline-any cline-no">&nbsp;</span>
555
+ <span class="cline-any cline-no">&nbsp;</span>
556
+ <span class="cline-any cline-no">&nbsp;</span>
557
+ <span class="cline-any cline-no">&nbsp;</span>
558
+ <span class="cline-any cline-no">&nbsp;</span>
559
+ <span class="cline-any cline-no">&nbsp;</span>
560
+ <span class="cline-any cline-no">&nbsp;</span>
561
+ <span class="cline-any cline-no">&nbsp;</span>
562
+ <span class="cline-any cline-no">&nbsp;</span>
563
+ <span class="cline-any cline-no">&nbsp;</span>
564
+ <span class="cline-any cline-no">&nbsp;</span>
565
+ <span class="cline-any cline-no">&nbsp;</span>
566
+ <span class="cline-any cline-no">&nbsp;</span>
567
+ <span class="cline-any cline-no">&nbsp;</span>
568
+ <span class="cline-any cline-no">&nbsp;</span>
569
+ <span class="cline-any cline-no">&nbsp;</span>
570
+ <span class="cline-any cline-no">&nbsp;</span>
571
+ <span class="cline-any cline-no">&nbsp;</span>
572
+ <span class="cline-any cline-yes">1x</span>
573
+ <span class="cline-any cline-yes">1x</span>
574
+ <span class="cline-any cline-yes">1x</span>
575
+ <span class="cline-any cline-yes">1x</span>
576
+ <span class="cline-any cline-yes">1x</span>
577
+ <span class="cline-any cline-yes">1x</span>
578
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">// =============================
579
+ // CROSS-TAB SYNC MANAGER
580
+ // =============================
581
+ &nbsp;
582
+ /**
583
+ * Manager for session synchronization across browser tabs
584
+ *
585
+ * Uses BroadcastChannel API (with fallback to localStorage events) for
586
+ * direct communication between tabs without going through the server.
587
+ *
588
+ * Advantages over StorageEvent alone:
589
+ * - Faster and more direct communication
590
+ * - Does not depend on localStorage changes
591
+ * - Typed messages with metadata
592
+ * - Each tab has a unique ID for debugging
593
+ */
594
+ &nbsp;
595
+ import { logger } from '../utils/logger';
596
+ &nbsp;
597
+ /**
598
+ * Types of messages that can be sent between tabs
599
+ */
600
+ export type CrossTabMessageType =
601
+ | 'SESSION_STARTED'
602
+ | 'SESSION_ENDED'
603
+ | 'TOKEN_REFRESHED'
604
+ | 'SESSION_PING'
605
+ | 'SESSION_PONG';
606
+ &nbsp;
607
+ /**
608
+ * Cross-tab message structure
609
+ */
610
+ export interface CrossTabMessage {
611
+ type: CrossTabMessageType;
612
+ tabId: string;
613
+ timestamp: number;
614
+ payload?: Record&lt;string, unknown&gt;;
615
+ }
616
+ &nbsp;
617
+ /**
618
+ * Callback type for subscribers
619
+ */
620
+ export type CrossTabListener = (message: CrossTabMessage) =&gt; void;
621
+ &nbsp;
622
+ /**
623
+ * Singleton manager for cross-tab synchronization
624
+ */
625
+ export class CrossTabSyncManager {
626
+ private static instance: CrossTabSyncManager | null = null;
627
+ &nbsp;
628
+ private broadcastChannel: BroadcastChannel | null = null;
629
+ private readonly CHANNEL_NAME = 'crudify-session-sync';
630
+ private readonly tabId: string;
631
+ private readonly listeners: Set&lt;CrossTabListener&gt; = new Set();
632
+ private isInitialized = false;
633
+ &nbsp;
634
+ /**
635
+ * Private constructor - use getInstance()
636
+ */
637
+ private constructor() {
638
+ this.tabId = CrossTabSyncManager.generateTabId();
639
+ this.initialize();
640
+ }
641
+ &nbsp;
642
+ /**
643
+ * Generate a unique ID for this tab
644
+ */
645
+ private static generateTabId(): string {
646
+ const timestamp = Date.now().toString(36);
647
+ const array = new Uint32Array(1);
648
+ globalThis.crypto.getRandomValues(array);
649
+ const random = array[0].toString(36);
650
+ return `tab_${timestamp}_${random}`;
651
+ }
652
+ &nbsp;
653
+ /**
654
+ * Get the singleton instance
655
+ */
656
+ static getInstance(): CrossTabSyncManager {
657
+ CrossTabSyncManager.instance ??= new CrossTabSyncManager();
658
+ return CrossTabSyncManager.instance;
659
+ }
660
+ &nbsp;
661
+ /**
662
+ * Reset the instance (useful for tests)
663
+ */
664
+ static <span class="fstat-no" title="function not covered" >resetInstance(): void {</span>
665
+ <span class="cstat-no" title="statement not covered" > if (CrossTabSyncManager.instance) {</span>
666
+ <span class="cstat-no" title="statement not covered" > CrossTabSyncManager.instance.destroy();</span>
667
+ <span class="cstat-no" title="statement not covered" > CrossTabSyncManager.instance = null;</span>
668
+ <span class="cstat-no" title="statement not covered" > }</span>
669
+ <span class="cstat-no" title="statement not covered" > }</span>
670
+ &nbsp;
671
+ /**
672
+ * Initialize the communication channel
673
+ */
674
+ private initialize(): void {
675
+ if (this.isInitialized) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
676
+ <span class="cstat-no" title="statement not covered" > return;</span>
677
+ <span class="cstat-no" title="statement not covered" > }</span>
678
+ &nbsp;
679
+ try {
680
+ // Use BroadcastChannel if available (modern browsers)
681
+ if (typeof BroadcastChannel === 'undefined') <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
682
+ <span class="cstat-no" title="statement not covered" > logger.debug('Crudify: BroadcastChannel not available, using localStorage fallback');</span>
683
+ } else {
684
+ this.broadcastChannel = new BroadcastChannel(this.CHANNEL_NAME);
685
+ this.broadcastChannel.onmessage = <span class="fstat-no" title="function not covered" >(event: MessageEvent&lt;CrossTabMessage&gt;) =&gt; {</span>
686
+ <span class="cstat-no" title="statement not covered" > this.handleMessage(event.data);</span>
687
+ <span class="cstat-no" title="statement not covered" > };</span>
688
+ this.broadcastChannel.onmessageerror = <span class="fstat-no" title="function not covered" >() =&gt; {</span>
689
+ <span class="cstat-no" title="statement not covered" > logger.warn('Crudify: CrossTabSync message error');</span>
690
+ <span class="cstat-no" title="statement not covered" > };</span>
691
+ logger.debug('Crudify: CrossTabSync initialized with BroadcastChannel');
692
+ }
693
+ &nbsp;
694
+ this.isInitialized = true;
695
+ <span class="branch-0 cbranch-no" title="branch not covered" > } catch (error) {</span>
696
+ <span class="cstat-no" title="statement not covered" > logger.warn('Crudify: Failed to initialize CrossTabSync', {</span>
697
+ <span class="cstat-no" title="statement not covered" > message: error instanceof Error ? error.message : String(error),</span>
698
+ <span class="cstat-no" title="statement not covered" > });</span>
699
+ <span class="cstat-no" title="statement not covered" > }</span>
700
+ }
701
+ &nbsp;
702
+ /**
703
+ * Destroy the manager and clean up resources
704
+ */
705
+ <span class="fstat-no" title="function not covered" > destroy(): void {</span>
706
+ <span class="cstat-no" title="statement not covered" > if (this.broadcastChannel) {</span>
707
+ <span class="cstat-no" title="statement not covered" > this.broadcastChannel.close();</span>
708
+ <span class="cstat-no" title="statement not covered" > this.broadcastChannel = null;</span>
709
+ <span class="cstat-no" title="statement not covered" > }</span>
710
+ <span class="cstat-no" title="statement not covered" > this.listeners.clear();</span>
711
+ <span class="cstat-no" title="statement not covered" > this.isInitialized = false;</span>
712
+ <span class="cstat-no" title="statement not covered" > }</span>
713
+ &nbsp;
714
+ /**
715
+ * Get the ID of this tab
716
+ */
717
+ <span class="fstat-no" title="function not covered" > getTabId(): string {</span>
718
+ <span class="cstat-no" title="statement not covered" > return this.tabId;</span>
719
+ <span class="cstat-no" title="statement not covered" > }</span>
720
+ &nbsp;
721
+ /**
722
+ * Subscribe to messages from other tabs
723
+ * @returns Unsubscribe function
724
+ */
725
+ subscribe(listener: CrossTabListener): () =&gt; void {
726
+ this.listeners.add(listener);
727
+ return () =&gt; {
728
+ this.listeners.delete(listener);
729
+ };
730
+ }
731
+ &nbsp;
732
+ /**
733
+ * Notify that a session was started in this tab
734
+ */
735
+ <span class="fstat-no" title="function not covered" > notifyLogin(): void {</span>
736
+ <span class="cstat-no" title="statement not covered" > this.broadcast({</span>
737
+ <span class="cstat-no" title="statement not covered" > type: 'SESSION_STARTED',</span>
738
+ <span class="cstat-no" title="statement not covered" > tabId: this.tabId,</span>
739
+ <span class="cstat-no" title="statement not covered" > timestamp: Date.now(),</span>
740
+ <span class="cstat-no" title="statement not covered" > });</span>
741
+ <span class="cstat-no" title="statement not covered" > }</span>
742
+ &nbsp;
743
+ /**
744
+ * Notify that the session was ended in this tab
745
+ */
746
+ <span class="fstat-no" title="function not covered" > notifyLogout(): void {</span>
747
+ <span class="cstat-no" title="statement not covered" > this.broadcast({</span>
748
+ <span class="cstat-no" title="statement not covered" > type: 'SESSION_ENDED',</span>
749
+ <span class="cstat-no" title="statement not covered" > tabId: this.tabId,</span>
750
+ <span class="cstat-no" title="statement not covered" > timestamp: Date.now(),</span>
751
+ <span class="cstat-no" title="statement not covered" > });</span>
752
+ <span class="cstat-no" title="statement not covered" > }</span>
753
+ &nbsp;
754
+ /**
755
+ * Notify that tokens were refreshed
756
+ */
757
+ <span class="fstat-no" title="function not covered" > notifyTokenRefreshed(): void {</span>
758
+ <span class="cstat-no" title="statement not covered" > this.broadcast({</span>
759
+ <span class="cstat-no" title="statement not covered" > type: 'TOKEN_REFRESHED',</span>
760
+ <span class="cstat-no" title="statement not covered" > tabId: this.tabId,</span>
761
+ <span class="cstat-no" title="statement not covered" > timestamp: Date.now(),</span>
762
+ <span class="cstat-no" title="statement not covered" > });</span>
763
+ <span class="cstat-no" title="statement not covered" > }</span>
764
+ &nbsp;
765
+ /**
766
+ * Send a ping to check for other active tabs
767
+ */
768
+ <span class="fstat-no" title="function not covered" > ping(): void {</span>
769
+ <span class="cstat-no" title="statement not covered" > this.broadcast({</span>
770
+ <span class="cstat-no" title="statement not covered" > type: 'SESSION_PING',</span>
771
+ <span class="cstat-no" title="statement not covered" > tabId: this.tabId,</span>
772
+ <span class="cstat-no" title="statement not covered" > timestamp: Date.now(),</span>
773
+ <span class="cstat-no" title="statement not covered" > });</span>
774
+ <span class="cstat-no" title="statement not covered" > }</span>
775
+ &nbsp;
776
+ /**
777
+ * Send message to all other tabs
778
+ */
779
+ private <span class="fstat-no" title="function not covered" >broadcast(message: CrossTabMessage): void {</span>
780
+ <span class="cstat-no" title="statement not covered" > if (!this.isInitialized) {</span>
781
+ <span class="cstat-no" title="statement not covered" > this.initialize();</span>
782
+ <span class="cstat-no" title="statement not covered" > }</span>
783
+ <span class="cstat-no" title="statement not covered" ></span>
784
+ <span class="cstat-no" title="statement not covered" > try {</span>
785
+ <span class="cstat-no" title="statement not covered" > if (this.broadcastChannel) {</span>
786
+ <span class="cstat-no" title="statement not covered" > this.broadcastChannel.postMessage(message);</span>
787
+ <span class="cstat-no" title="statement not covered" > logger.debug(`Crudify: CrossTab broadcast ${message.type}`);</span>
788
+ <span class="cstat-no" title="statement not covered" > }</span>
789
+ <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
790
+ <span class="cstat-no" title="statement not covered" > logger.warn('Crudify: Failed to broadcast cross-tab message', {</span>
791
+ <span class="cstat-no" title="statement not covered" > message: error instanceof Error ? error.message : String(error),</span>
792
+ <span class="cstat-no" title="statement not covered" > });</span>
793
+ <span class="cstat-no" title="statement not covered" > }</span>
794
+ <span class="cstat-no" title="statement not covered" > }</span>
795
+ &nbsp;
796
+ /**
797
+ * Process message received from another tab
798
+ */
799
+ private <span class="fstat-no" title="function not covered" >handleMessage(message: CrossTabMessage): void {</span>
800
+ <span class="cstat-no" title="statement not covered" > // Ignore messages from this same tab</span>
801
+ <span class="cstat-no" title="statement not covered" > if (message.tabId === this.tabId) {</span>
802
+ <span class="cstat-no" title="statement not covered" > return;</span>
803
+ <span class="cstat-no" title="statement not covered" > }</span>
804
+ <span class="cstat-no" title="statement not covered" ></span>
805
+ <span class="cstat-no" title="statement not covered" > logger.debug(`Crudify: CrossTab received ${message.type} from ${message.tabId}`);</span>
806
+ <span class="cstat-no" title="statement not covered" ></span>
807
+ <span class="cstat-no" title="statement not covered" > // Respond to pings with pong</span>
808
+ <span class="cstat-no" title="statement not covered" > if (message.type === 'SESSION_PING') {</span>
809
+ <span class="cstat-no" title="statement not covered" > this.broadcast({</span>
810
+ <span class="cstat-no" title="statement not covered" > type: 'SESSION_PONG',</span>
811
+ <span class="cstat-no" title="statement not covered" > tabId: this.tabId,</span>
812
+ <span class="cstat-no" title="statement not covered" > timestamp: Date.now(),</span>
813
+ <span class="cstat-no" title="statement not covered" > payload: { respondingTo: message.tabId },</span>
814
+ <span class="cstat-no" title="statement not covered" > });</span>
815
+ <span class="cstat-no" title="statement not covered" > }</span>
816
+ <span class="cstat-no" title="statement not covered" ></span>
817
+ <span class="cstat-no" title="statement not covered" > // Notify all listeners</span>
818
+ <span class="cstat-no" title="statement not covered" > this.listeners.forEach((listener) =&gt; {</span>
819
+ <span class="cstat-no" title="statement not covered" > try {</span>
820
+ <span class="cstat-no" title="statement not covered" > listener(message);</span>
821
+ <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
822
+ <span class="cstat-no" title="statement not covered" > logger.error('Crudify: CrossTab listener error', {</span>
823
+ <span class="cstat-no" title="statement not covered" > message: error instanceof Error ? error.message : String(error),</span>
824
+ <span class="cstat-no" title="statement not covered" > });</span>
825
+ <span class="cstat-no" title="statement not covered" > }</span>
826
+ <span class="cstat-no" title="statement not covered" > });</span>
827
+ <span class="cstat-no" title="statement not covered" > }</span>
828
+ }
829
+ &nbsp;
830
+ /**
831
+ * Exported singleton instance for direct use
832
+ */
833
+ export const crossTabSync = CrossTabSyncManager.getInstance();
834
+ &nbsp;</pre></td></tr></table></pre>
835
+
836
+ <div class='push'></div><!-- for sticky footer -->
837
+ </div><!-- /wrapper -->
838
+ <div class='footer quiet pad2 space-top1 center small'>
839
+ Code coverage generated by
840
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
841
+ at 2026-02-07T06:55:20.810Z
842
+ </div>
843
+ <script src="../prettify.js"></script>
844
+ <script>
845
+ window.onload = function () {
846
+ prettyPrint();
847
+ };
848
+ </script>
849
+ <script src="../sorter.js"></script>
850
+ <script src="../block-navigation.js"></script>
851
+ </body>
852
+ </html>
853
+