@jmruthers/pace-core 0.5.135 → 0.5.137

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 (544) hide show
  1. package/dist/{DataTable-A36PJG6N.js → DataTable-6M4L6BI2.js} +26 -13
  2. package/dist/{DataTable-C7GaRZye.d.ts → DataTable-CWAZZcXC.d.ts} +1 -1
  3. package/dist/{PublicLoadingSpinner-CUAnTvcg.d.ts → EventLogo-rFL_kRjk.d.ts} +123 -135
  4. package/dist/{UnifiedAuthProvider-BVKmQd9u.d.ts → UnifiedAuthProvider-DJxGTftH.d.ts} +1 -1
  5. package/dist/{UnifiedAuthProvider-CQDZRJIS.js → UnifiedAuthProvider-XIQQ7LVU.js} +5 -5
  6. package/dist/{api-TNIBJWLM.js → api-45XYYO2A.js} +4 -3
  7. package/dist/{audit-T36HM7IM.js → audit-64X3VJXB.js} +3 -2
  8. package/dist/{chunk-F64FFPOZ.js → chunk-22WKWKRX.js} +26 -20
  9. package/dist/chunk-22WKWKRX.js.map +1 -0
  10. package/dist/{chunk-VZ5OR6HD.js → chunk-4C7EXCAR.js} +62 -150
  11. package/dist/chunk-4C7EXCAR.js.map +1 -0
  12. package/dist/{chunk-PYUXFQJ3.js → chunk-56XJ3TU6.js} +2 -2
  13. package/dist/chunk-56XJ3TU6.js.map +1 -0
  14. package/dist/{chunk-CTJRBUX2.js → chunk-6LAAY47Q.js} +2 -2
  15. package/dist/{chunk-UJI6WSMD.js → chunk-7QCC6MCP.js} +90 -3
  16. package/dist/chunk-7QCC6MCP.js.map +1 -0
  17. package/dist/{chunk-66C4BSAY.js → chunk-ANBQRTPX.js} +9 -2
  18. package/dist/chunk-ANBQRTPX.js.map +1 -0
  19. package/dist/{chunk-CQZU6TFE.js → chunk-BCIBECNB.js} +100 -62
  20. package/dist/chunk-BCIBECNB.js.map +1 -0
  21. package/dist/{chunk-GKHF54DI.js → chunk-BESYRHQM.js} +10 -4
  22. package/dist/chunk-BESYRHQM.js.map +1 -0
  23. package/dist/chunk-BJPBT3CU.js +21 -0
  24. package/dist/chunk-BJPBT3CU.js.map +1 -0
  25. package/dist/{chunk-BYXRHAIF.js → chunk-BLCXZEYF.js} +23 -14
  26. package/dist/chunk-BLCXZEYF.js.map +1 -0
  27. package/dist/{chunk-WP5I5GLN.js → chunk-BVYWGZVV.js} +112 -97
  28. package/dist/chunk-BVYWGZVV.js.map +1 -0
  29. package/dist/{chunk-GEVIB2UB.js → chunk-ERISIBYU.js} +14 -5
  30. package/dist/chunk-ERISIBYU.js.map +1 -0
  31. package/dist/{chunk-O3NWNXDY.js → chunk-FMUCXFII.js} +2 -2
  32. package/dist/chunk-FMUCXFII.js.map +1 -0
  33. package/dist/{chunk-GVDR7WNV.js → chunk-HAWZXGR2.js} +334 -614
  34. package/dist/chunk-HAWZXGR2.js.map +1 -0
  35. package/dist/{chunk-ZV77RZMU.js → chunk-INQLMHPF.js} +2 -2
  36. package/dist/chunk-JISYG63F.js +70 -0
  37. package/dist/chunk-JISYG63F.js.map +1 -0
  38. package/dist/{chunk-HMNOSGVA.js → chunk-KYRHUBIU.js} +576 -767
  39. package/dist/chunk-KYRHUBIU.js.map +1 -0
  40. package/dist/{chunk-M6DDYFUD.js → chunk-LS353YLY.js} +19 -16
  41. package/dist/chunk-LS353YLY.js.map +1 -0
  42. package/dist/{chunk-TGIY2AR2.js → chunk-MA6EPSGZ.js} +4 -3
  43. package/dist/{chunk-TGIY2AR2.js.map → chunk-MA6EPSGZ.js.map} +1 -1
  44. package/dist/chunk-OWAG3GSU.js +58 -0
  45. package/dist/chunk-OWAG3GSU.js.map +1 -0
  46. package/dist/{chunk-JCQZ6LA7.js → chunk-Q5QRDWKI.js} +9 -3
  47. package/dist/chunk-Q5QRDWKI.js.map +1 -0
  48. package/dist/chunk-S5OFRT4M.js +94 -0
  49. package/dist/chunk-S5OFRT4M.js.map +1 -0
  50. package/dist/{chunk-3DBFLLLU.js → chunk-SBVILCCA.js} +14 -9
  51. package/dist/chunk-SBVILCCA.js.map +1 -0
  52. package/dist/{chunk-ZYZCRSBD.js → chunk-T6JN6LH6.js} +16 -11
  53. package/dist/chunk-T6JN6LH6.js.map +1 -0
  54. package/dist/chunk-XDNLUEXI.js +138 -0
  55. package/dist/chunk-XDNLUEXI.js.map +1 -0
  56. package/dist/{chunk-3CG5L6RN.js → chunk-YCWDTTUK.js} +90 -75
  57. package/dist/chunk-YCWDTTUK.js.map +1 -0
  58. package/dist/{chunk-5F3NDPJV.js → chunk-ZZ2SS7NI.js} +10 -5
  59. package/dist/chunk-ZZ2SS7NI.js.map +1 -0
  60. package/dist/components.d.ts +7 -287
  61. package/dist/components.js +27 -157
  62. package/dist/components.js.map +1 -1
  63. package/dist/{file-reference-C9isKNPn.d.ts → file-reference-C6Gkn77H.d.ts} +1 -1
  64. package/dist/{formatting-DFcCxUEk.d.ts → formatting-CvUXy2mF.d.ts} +1 -1
  65. package/dist/hooks.d.ts +3 -3
  66. package/dist/hooks.js +21 -16
  67. package/dist/hooks.js.map +1 -1
  68. package/dist/index.d.ts +101 -9
  69. package/dist/index.js +44 -31
  70. package/dist/index.js.map +1 -1
  71. package/dist/providers.d.ts +1 -1
  72. package/dist/providers.js +4 -4
  73. package/dist/rbac/index.js +12 -12
  74. package/dist/schema-DTDZQe2u.d.ts +28 -0
  75. package/dist/styles/index.js +2 -1
  76. package/dist/theming/runtime.d.ts +2 -19
  77. package/dist/theming/runtime.js +2 -1
  78. package/dist/{types-D5rqZQXk.d.ts → types-Dfz9dmVH.d.ts} +12 -1
  79. package/dist/types.d.ts +153 -4
  80. package/dist/types.js +51 -16
  81. package/dist/types.js.map +1 -1
  82. package/dist/{useInactivityTracker-MRUU55XI.js → useInactivityTracker-TO6ZOF35.js} +3 -2
  83. package/dist/{usePublicRouteParams-Dyt1tzI9.d.ts → usePublicRouteParams-B7PabvuH.d.ts} +1 -1
  84. package/dist/utils.d.ts +221 -173
  85. package/dist/utils.js +185 -225
  86. package/dist/utils.js.map +1 -1
  87. package/dist/validation.d.ts +24 -115
  88. package/dist/validation.js +19 -474
  89. package/dist/validation.js.map +1 -1
  90. package/docs/api/classes/ColumnFactory.md +1 -1
  91. package/docs/api/classes/ErrorBoundary.md +6 -6
  92. package/docs/api/classes/InvalidScopeError.md +1 -1
  93. package/docs/api/classes/MissingUserContextError.md +1 -1
  94. package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
  95. package/docs/api/classes/PermissionDeniedError.md +1 -1
  96. package/docs/api/classes/PublicErrorBoundary.md +1 -1
  97. package/docs/api/classes/RBACAuditManager.md +6 -6
  98. package/docs/api/classes/RBACCache.md +1 -1
  99. package/docs/api/classes/RBACEngine.md +7 -7
  100. package/docs/api/classes/RBACError.md +1 -1
  101. package/docs/api/classes/RBACNotInitializedError.md +1 -1
  102. package/docs/api/classes/SecureSupabaseClient.md +1 -1
  103. package/docs/api/classes/StorageUtils.md +1 -1
  104. package/docs/api/enums/FileCategory.md +1 -1
  105. package/docs/api/interfaces/AggregateConfig.md +4 -4
  106. package/docs/api/interfaces/BadgeProps.md +27 -0
  107. package/docs/api/interfaces/ButtonProps.md +1 -1
  108. package/docs/api/interfaces/CardProps.md +1 -1
  109. package/docs/api/interfaces/ColorPalette.md +1 -1
  110. package/docs/api/interfaces/ColorShade.md +29 -4
  111. package/docs/api/interfaces/DataAccessRecord.md +9 -9
  112. package/docs/api/interfaces/DataRecord.md +1 -1
  113. package/docs/api/interfaces/DataTableAction.md +18 -18
  114. package/docs/api/interfaces/DataTableColumn.md +61 -1
  115. package/docs/api/interfaces/DataTableProps.md +1 -1
  116. package/docs/api/interfaces/DataTableToolbarButton.md +7 -7
  117. package/docs/api/interfaces/EmptyStateConfig.md +5 -5
  118. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +14 -14
  119. package/docs/api/interfaces/EventAppRoleData.md +1 -1
  120. package/docs/api/interfaces/EventLogoProps.md +152 -0
  121. package/docs/api/interfaces/ExportColumn.md +1 -1
  122. package/docs/api/interfaces/ExportOptions.md +8 -8
  123. package/docs/api/interfaces/FileDisplayProps.md +15 -15
  124. package/docs/api/interfaces/FileMetadata.md +1 -1
  125. package/docs/api/interfaces/FileReference.md +1 -1
  126. package/docs/api/interfaces/FileSizeLimits.md +1 -1
  127. package/docs/api/interfaces/FileUploadOptions.md +1 -1
  128. package/docs/api/interfaces/FileUploadProps.md +1 -1
  129. package/docs/api/interfaces/FooterProps.md +1 -1
  130. package/docs/api/interfaces/GrantEventAppRoleParams.md +1 -1
  131. package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
  132. package/docs/api/interfaces/InputProps.md +1 -1
  133. package/docs/api/interfaces/LabelProps.md +1 -1
  134. package/docs/api/interfaces/LoginFormProps.md +1 -1
  135. package/docs/api/interfaces/NavigationAccessRecord.md +10 -10
  136. package/docs/api/interfaces/NavigationContextType.md +9 -9
  137. package/docs/api/interfaces/NavigationGuardProps.md +10 -10
  138. package/docs/api/interfaces/NavigationItem.md +1 -1
  139. package/docs/api/interfaces/NavigationMenuProps.md +1 -1
  140. package/docs/api/interfaces/NavigationProviderProps.md +7 -7
  141. package/docs/api/interfaces/Organisation.md +1 -1
  142. package/docs/api/interfaces/OrganisationContextType.md +1 -1
  143. package/docs/api/interfaces/OrganisationMembership.md +1 -1
  144. package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
  145. package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
  146. package/docs/api/interfaces/PaceAppLayoutProps.md +27 -27
  147. package/docs/api/interfaces/PaceLoginPageProps.md +4 -4
  148. package/docs/api/interfaces/PageAccessRecord.md +8 -8
  149. package/docs/api/interfaces/PagePermissionContextType.md +8 -8
  150. package/docs/api/interfaces/PagePermissionGuardProps.md +11 -11
  151. package/docs/api/interfaces/PagePermissionProviderProps.md +7 -7
  152. package/docs/api/interfaces/PaletteData.md +4 -4
  153. package/docs/api/interfaces/PermissionEnforcerProps.md +11 -11
  154. package/docs/api/interfaces/ProtectedRouteProps.md +6 -6
  155. package/docs/api/interfaces/PublicErrorBoundaryProps.md +1 -1
  156. package/docs/api/interfaces/PublicErrorBoundaryState.md +1 -1
  157. package/docs/api/interfaces/PublicLoadingSpinnerProps.md +1 -1
  158. package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
  159. package/docs/api/interfaces/PublicPageHeaderProps.md +1 -1
  160. package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
  161. package/docs/api/interfaces/RBACConfig.md +1 -1
  162. package/docs/api/interfaces/RBACLogger.md +1 -1
  163. package/docs/api/interfaces/RevokeEventAppRoleParams.md +1 -1
  164. package/docs/api/interfaces/RoleBasedRouterContextType.md +8 -8
  165. package/docs/api/interfaces/RoleBasedRouterProps.md +10 -10
  166. package/docs/api/interfaces/RoleManagementResult.md +1 -1
  167. package/docs/api/interfaces/RouteAccessRecord.md +10 -10
  168. package/docs/api/interfaces/RouteConfig.md +10 -10
  169. package/docs/api/interfaces/SecureDataContextType.md +9 -9
  170. package/docs/api/interfaces/SecureDataProviderProps.md +8 -8
  171. package/docs/api/interfaces/SessionRestorationLoaderProps.md +21 -0
  172. package/docs/api/interfaces/StorageConfig.md +1 -1
  173. package/docs/api/interfaces/StorageFileInfo.md +1 -1
  174. package/docs/api/interfaces/StorageFileMetadata.md +1 -1
  175. package/docs/api/interfaces/StorageListOptions.md +1 -1
  176. package/docs/api/interfaces/StorageListResult.md +1 -1
  177. package/docs/api/interfaces/StorageUploadOptions.md +1 -1
  178. package/docs/api/interfaces/StorageUploadResult.md +1 -1
  179. package/docs/api/interfaces/StorageUrlOptions.md +1 -1
  180. package/docs/api/interfaces/StyleImport.md +1 -1
  181. package/docs/api/interfaces/SwitchProps.md +1 -1
  182. package/docs/api/interfaces/ToastActionElement.md +1 -1
  183. package/docs/api/interfaces/ToastProps.md +1 -1
  184. package/docs/api/interfaces/UnifiedAuthContextType.md +53 -53
  185. package/docs/api/interfaces/UnifiedAuthProviderProps.md +13 -13
  186. package/docs/api/interfaces/UseInactivityTrackerOptions.md +9 -9
  187. package/docs/api/interfaces/UseInactivityTrackerReturn.md +8 -8
  188. package/docs/api/interfaces/UsePublicEventOptions.md +3 -3
  189. package/docs/api/interfaces/UsePublicEventReturn.md +5 -5
  190. package/docs/api/interfaces/UsePublicFileDisplayOptions.md +4 -4
  191. package/docs/api/interfaces/UsePublicFileDisplayReturn.md +9 -9
  192. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
  193. package/docs/api/interfaces/UseResolvedScopeOptions.md +4 -4
  194. package/docs/api/interfaces/UseResolvedScopeReturn.md +4 -4
  195. package/docs/api/interfaces/UserEventAccess.md +11 -11
  196. package/docs/api/interfaces/UserMenuProps.md +1 -1
  197. package/docs/api/interfaces/UserProfile.md +1 -1
  198. package/docs/api/modules.md +591 -220
  199. package/docs/api-reference/components.md +106 -26
  200. package/docs/architecture/README.md +0 -3
  201. package/docs/implementation-guides/data-tables.md +277 -13
  202. package/docs/implementation-guides/forms.md +1 -16
  203. package/docs/implementation-guides/permission-enforcement.md +8 -2
  204. package/docs/styles/README.md +0 -2
  205. package/examples/README.md +30 -14
  206. package/examples/STRUCTURE.md +125 -0
  207. package/examples/components 2/DataTable/HierarchicalActionsExample.tsx +421 -0
  208. package/examples/components 2/DataTable/HierarchicalExample.tsx +475 -0
  209. package/examples/components 2/DataTable/InitialPageSizeExample.tsx +177 -0
  210. package/examples/components 2/DataTable/PerformanceExample.tsx +506 -0
  211. package/examples/components 2/DataTable/index.ts +13 -0
  212. package/examples/components 2/Dialog/BasicHtmlTest.tsx +55 -0
  213. package/examples/components 2/Dialog/DebugHtmlExample.tsx +68 -0
  214. package/examples/components 2/Dialog/HtmlDialogExample.tsx +202 -0
  215. package/examples/components 2/Dialog/ScrollableDialogExample.tsx +290 -0
  216. package/examples/components 2/Dialog/SimpleHtmlTest.tsx +61 -0
  217. package/examples/components 2/Dialog/SmartDialogExample.tsx +322 -0
  218. package/examples/components 2/Dialog/index.ts +15 -0
  219. package/examples/components 2/index.ts +11 -0
  220. package/examples/features/index.ts +12 -0
  221. package/{src/examples → examples/features/public-pages}/CorrectPublicPageImplementation.tsx +14 -17
  222. package/{src/examples → examples/features/public-pages}/PublicEventPage.tsx +14 -27
  223. package/{src/examples → examples/features/public-pages}/PublicPageApp.tsx +15 -28
  224. package/{src/examples → examples/features/public-pages}/PublicPageUsageExample.tsx +8 -10
  225. package/examples/features/public-pages/index.ts +14 -0
  226. package/examples/features/rbac/CompleteRBACExample.tsx +324 -0
  227. package/examples/features/rbac/EventBasedApp.tsx +239 -0
  228. package/examples/features/rbac/PermissionExample.tsx +151 -0
  229. package/examples/features/rbac/index.ts +13 -0
  230. package/examples/index.ts +11 -3
  231. package/package.json +30 -19
  232. package/src/__tests__/TEST_STANDARD.md +92 -0
  233. package/src/components/Alert/Alert.tsx +1 -1
  234. package/src/components/Avatar/Avatar.tsx +1 -1
  235. package/src/components/Badge/Badge.test.tsx +314 -0
  236. package/src/components/Badge/Badge.tsx +304 -0
  237. package/src/components/Badge/index.ts +3 -0
  238. package/src/components/Button/Button.tsx +1 -1
  239. package/src/components/Card/Card.tsx +1 -1
  240. package/src/components/Checkbox/Checkbox.tsx +1 -1
  241. package/src/components/DataTable/DataTable.test.tsx +1 -1
  242. package/src/components/DataTable/DataTable.tsx +1 -30
  243. package/src/components/DataTable/__tests__/DataTable.grouping-aggregation.test.tsx +562 -0
  244. package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +217 -0
  245. package/src/components/DataTable/__tests__/styles.test.ts +3 -3
  246. package/src/components/DataTable/components/ActionButtons.tsx +0 -15
  247. package/src/components/DataTable/components/ColumnFilter.tsx +8 -4
  248. package/src/components/DataTable/components/DataTableBody.tsx +461 -0
  249. package/src/components/DataTable/components/DataTableCore.tsx +4 -185
  250. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +1 -1
  251. package/src/components/DataTable/components/DataTableModals.tsx +1 -27
  252. package/src/components/DataTable/components/DraggableColumnHeader.tsx +144 -0
  253. package/src/components/DataTable/components/EditableRow.tsx +1 -1
  254. package/src/components/DataTable/components/FilterRow.tsx +9 -3
  255. package/src/components/DataTable/components/ImportModal.tsx +2 -14
  256. package/src/components/DataTable/components/PaginationControls.tsx +2 -1
  257. package/src/components/DataTable/components/UnifiedTableBody.tsx +109 -82
  258. package/src/components/DataTable/components/VirtualizedDataTable.tsx +513 -0
  259. package/src/components/DataTable/components/__tests__/AccessDeniedPage.test.tsx +14 -68
  260. package/src/components/DataTable/components/__tests__/ActionButtons.test.tsx +1 -1
  261. package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +62 -0
  262. package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +1 -1
  263. package/src/components/DataTable/components/__tests__/DataTableModals.test.tsx +1 -1
  264. package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +43 -0
  265. package/src/components/DataTable/components/__tests__/ImportModal.test.tsx +1 -1
  266. package/src/components/DataTable/core/ActionManager.ts +235 -0
  267. package/src/components/DataTable/core/ColumnManager.ts +205 -0
  268. package/src/components/DataTable/core/DataManager.ts +188 -0
  269. package/src/components/DataTable/core/DataTableContext.tsx +181 -0
  270. package/src/components/DataTable/core/LocalDataAdapter.ts +273 -0
  271. package/src/components/DataTable/core/PluginRegistry.ts +229 -0
  272. package/src/components/DataTable/core/StateManager.ts +311 -0
  273. package/src/components/DataTable/core/interfaces.ts +338 -0
  274. package/src/components/DataTable/examples/GroupingAggregationExample.tsx +273 -0
  275. package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +1 -1
  276. package/src/components/DataTable/examples/__tests__/HierarchicalActionsExample.test.tsx +1 -1
  277. package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +1 -1
  278. package/src/components/DataTable/hooks/useColumnVisibilityPersistence.ts +1 -1
  279. package/src/components/DataTable/hooks/useDataTablePermissions.ts +2 -23
  280. package/src/components/DataTable/index.ts +4 -0
  281. package/src/components/DataTable/styles.ts +28 -7
  282. package/src/components/DataTable/types.ts +13 -0
  283. package/src/components/DataTable/utils/__tests__/columnUtils.test.ts +94 -0
  284. package/src/components/DataTable/utils/__tests__/exportUtils.test.ts +1 -1
  285. package/src/components/DataTable/utils/aggregationUtils.ts +161 -0
  286. package/src/components/DataTable/utils/columnUtils.ts +40 -0
  287. package/src/components/DataTable/utils/debugTools.ts +609 -0
  288. package/src/components/DataTable/utils/exportUtils.ts +1 -1
  289. package/src/components/DataTable/utils/flexibleImport.ts +1 -11
  290. package/src/components/DataTable/utils/index.ts +2 -0
  291. package/src/components/DataTable/utils/paginationUtils.ts +1 -1
  292. package/src/components/Dialog/Dialog.tsx +2 -2
  293. package/src/components/Dialog/utils/__tests__/safeHtml.unit.test.ts +8 -1
  294. package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +35 -7
  295. package/src/components/ErrorBoundary/ErrorBoundary.tsx +5 -4
  296. package/src/components/EventSelector/EventSelector.tsx +3 -2
  297. package/src/components/FileDisplay/FileDisplay.tsx +2 -36
  298. package/src/components/FileUpload/FileUpload.test.tsx +2 -2
  299. package/src/components/FileUpload/FileUpload.tsx +2 -2
  300. package/src/components/Footer/Footer.test.tsx +1 -1
  301. package/src/components/Footer/Footer.tsx +1 -1
  302. package/src/components/Form/Form.test.tsx +5 -510
  303. package/src/components/Form/Form.tsx +1 -1
  304. package/src/components/Form/FormField.tsx +1 -1
  305. package/src/components/Form/index.ts +0 -12
  306. package/src/components/Header/Header.tsx +1 -1
  307. package/src/components/Input/Input.tsx +1 -1
  308. package/src/components/Label/Label.tsx +1 -1
  309. package/src/components/LoginForm/LoginForm.test.tsx +1 -1
  310. package/src/components/LoginForm/LoginForm.tsx +1 -1
  311. package/src/components/NavigationMenu/NavigationMenu.test.tsx +19 -3
  312. package/src/components/NavigationMenu/NavigationMenu.tsx +9 -8
  313. package/src/components/OrganisationSelector/OrganisationSelector.tsx +4 -3
  314. package/src/components/PaceAppLayout/PaceAppLayout.tsx +14 -12
  315. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.integration.test.tsx +0 -16
  316. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.performance.test.tsx +76 -10
  317. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.security.test.tsx +0 -1
  318. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.unit.test.tsx +0 -9
  319. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +35 -3
  320. package/src/components/PaceLoginPage/PaceLoginPage.tsx +14 -13
  321. package/src/components/PasswordReset/PasswordChangeForm.tsx +1 -1
  322. package/src/components/PasswordReset/index.ts +0 -2
  323. package/src/components/Progress/Progress.tsx +1 -1
  324. package/src/components/ProtectedRoute/ProtectedRoute.test.tsx +35 -8
  325. package/src/components/ProtectedRoute/ProtectedRoute.tsx +3 -2
  326. package/src/components/PublicLayout/PublicErrorBoundary.tsx +1 -1
  327. package/src/components/PublicLayout/PublicLoadingSpinner.tsx +1 -1
  328. package/src/components/PublicLayout/PublicPageContextChecker.tsx +44 -43
  329. package/src/components/PublicLayout/PublicPageFooter.tsx +1 -1
  330. package/src/components/PublicLayout/PublicPageHeader.tsx +1 -15
  331. package/src/components/PublicLayout/PublicPageProvider.tsx +3 -2
  332. package/src/components/PublicLayout/__tests__/PublicPageContextChecker.test.tsx +2 -0
  333. package/src/components/PublicLayout/__tests__/PublicPageFooter.test.tsx +1 -1
  334. package/src/components/PublicLayout/index.ts +4 -2
  335. package/src/components/Select/Select.test.tsx +1 -1
  336. package/src/components/Select/Select.tsx +21 -9
  337. package/src/components/{SessionRestorationLoader.tsx → SessionRestorationLoader/SessionRestorationLoader.tsx} +3 -2
  338. package/src/components/SessionRestorationLoader/index.ts +3 -0
  339. package/src/components/Switch/Switch.tsx +1 -1
  340. package/src/components/Table/Table.tsx +1 -1
  341. package/src/components/Table/__tests__/Table.test.tsx +1 -1
  342. package/src/components/Toast/Toast.tsx +1 -1
  343. package/src/components/Tooltip/Tooltip.tsx +1 -1
  344. package/src/components/index.ts +7 -10
  345. package/src/hooks/__tests__/hooks.integration.test.tsx +37 -22
  346. package/src/hooks/__tests__/useComponentPerformance.unit.test.tsx +33 -17
  347. package/src/hooks/__tests__/useDataTablePerformance.unit.test.ts +28 -3
  348. package/src/hooks/__tests__/useFileDisplay.unit.test.ts +36 -9
  349. package/src/hooks/__tests__/useFileUrl.unit.test.ts +83 -85
  350. package/src/hooks/__tests__/useInactivityTracker.unit.test.ts +26 -2
  351. package/src/hooks/__tests__/usePerformanceMonitor.unit.test.ts +19 -6
  352. package/src/hooks/__tests__/usePermissionCache.simple.test.ts +17 -4
  353. package/src/hooks/__tests__/usePermissionCache.unit.test.ts +17 -4
  354. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +26 -6
  355. package/src/hooks/__tests__/usePublicFileDisplay.test.ts +16 -6
  356. package/src/hooks/__tests__/useSecureDataAccess.unit.test.tsx +3 -3
  357. package/src/hooks/__tests__/useSessionRestoration.unit.test.tsx +17 -3
  358. package/src/hooks/public/usePublicEvent.ts +7 -6
  359. package/src/hooks/public/usePublicEventLogo.ts +7 -4
  360. package/src/hooks/public/usePublicFileDisplay.ts +6 -150
  361. package/src/hooks/useComponentPerformance.ts +4 -1
  362. package/src/hooks/useDataTablePerformance.ts +4 -3
  363. package/src/hooks/useEventTheme.test.ts +18 -5
  364. package/src/hooks/useEventTheme.ts +4 -1
  365. package/src/hooks/useEvents.ts +2 -0
  366. package/src/hooks/useFileDisplay.ts +9 -8
  367. package/src/hooks/useFileReference.ts +4 -1
  368. package/src/hooks/useFileUrl.ts +4 -1
  369. package/src/hooks/useInactivityTracker.ts +5 -4
  370. package/src/hooks/useOrganisationSecurity.test.ts +33 -12
  371. package/src/hooks/useOrganisationSecurity.ts +8 -7
  372. package/src/hooks/usePerformanceMonitor.ts +6 -3
  373. package/src/hooks/usePermissionCache.ts +13 -6
  374. package/src/hooks/useSecureDataAccess.test.ts +2 -2
  375. package/src/hooks/useSecureDataAccess.ts +9 -8
  376. package/src/hooks/useSessionRestoration.ts +4 -1
  377. package/src/hooks/useStorage.ts +4 -1
  378. package/src/index.ts +20 -7
  379. package/src/providers/services/AuthServiceProvider.tsx +3 -2
  380. package/src/providers/services/EventServiceProvider.tsx +2 -1
  381. package/src/providers/services/InactivityServiceProvider.tsx +2 -1
  382. package/src/providers/services/OrganisationServiceProvider.tsx +2 -1
  383. package/src/providers/services/UnifiedAuthProvider.tsx +4 -3
  384. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +22 -2
  385. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +24 -2
  386. package/src/rbac/__tests__/cache-invalidation.test.ts +20 -6
  387. package/src/rbac/api.ts +5 -2
  388. package/src/rbac/audit-enhanced.ts +6 -6
  389. package/src/rbac/audit.test.ts +60 -38
  390. package/src/rbac/audit.ts +8 -8
  391. package/src/rbac/cache-invalidation.ts +7 -4
  392. package/src/rbac/components/EnhancedNavigationMenu.tsx +11 -5
  393. package/src/rbac/components/NavigationGuard.tsx +7 -3
  394. package/src/rbac/components/NavigationProvider.tsx +6 -3
  395. package/src/rbac/components/PagePermissionGuard.tsx +28 -16
  396. package/src/rbac/components/PagePermissionProvider.tsx +4 -1
  397. package/src/rbac/components/PermissionEnforcer.tsx +9 -3
  398. package/src/rbac/components/RoleBasedRouter.tsx +3 -1
  399. package/src/rbac/components/SecureDataProvider.tsx +7 -3
  400. package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +87 -61
  401. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +83 -33
  402. package/src/rbac/components/__tests__/NavigationProvider.test.tsx +36 -13
  403. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +2 -2
  404. package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +22 -8
  405. package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +19 -6
  406. package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +43 -17
  407. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +42 -17
  408. package/src/rbac/engine.ts +15 -7
  409. package/src/rbac/hooks/usePermissions.ts +7 -3
  410. package/src/rbac/hooks/useResolvedScope.test.ts +2 -2
  411. package/src/rbac/hooks/useResolvedScope.ts +10 -7
  412. package/src/rbac/permissions.ts +5 -2
  413. package/src/rbac/security.test.ts +27 -16
  414. package/src/rbac/security.ts +5 -4
  415. package/src/services/AuthService.ts +22 -21
  416. package/src/services/EventService.ts +12 -12
  417. package/src/services/InactivityService.ts +5 -4
  418. package/src/services/OrganisationService.ts +26 -25
  419. package/src/services/__tests__/AuthService.test.ts +51 -19
  420. package/src/services/__tests__/EventService.test.ts +37 -5
  421. package/src/services/__tests__/InactivityService.test.ts +38 -4
  422. package/src/services/__tests__/OrganisationService.test.ts +3 -8
  423. package/src/services/base/BaseService.ts +3 -1
  424. package/src/styles/core.css +3 -0
  425. package/src/theming/__tests__/runtime.test.ts +21 -12
  426. package/src/theming/parseEventColours.ts +5 -19
  427. package/src/theming/runtime.ts +8 -4
  428. package/src/types/validation.ts +2 -29
  429. package/src/utils/__tests__/appConfig.unit.test.ts +1 -1
  430. package/src/utils/__tests__/audit.unit.test.ts +1 -1
  431. package/src/utils/__tests__/auth-utils.unit.test.ts +1 -1
  432. package/src/utils/__tests__/bundleAnalysis.unit.test.ts +19 -19
  433. package/src/utils/__tests__/cn.unit.test.ts +1 -1
  434. package/src/utils/__tests__/debugLogger.test.ts +1 -1
  435. package/src/utils/__tests__/deviceFingerprint.unit.test.ts +1 -1
  436. package/src/utils/__tests__/dynamicUtils.unit.test.ts +1 -1
  437. package/src/utils/__tests__/formatting.unit.test.ts +1 -1
  438. package/src/utils/__tests__/lazyLoad.unit.test.tsx +1 -1
  439. package/src/utils/__tests__/logger.unit.test.ts +1 -1
  440. package/src/utils/__tests__/organisationContext.unit.test.ts +1 -1
  441. package/src/utils/__tests__/performanceBenchmark.test.ts +1 -1
  442. package/src/utils/__tests__/performanceBudgets.unit.test.ts +1 -1
  443. package/src/utils/__tests__/permissionTypes.unit.test.ts +1 -1
  444. package/src/utils/__tests__/permissionUtils.unit.test.ts +1 -1
  445. package/src/utils/__tests__/sanitization.unit.test.ts +1 -1
  446. package/src/utils/__tests__/schemaUtils.unit.test.ts +1 -1
  447. package/src/utils/__tests__/secureDataAccess.unit.test.ts +1 -1
  448. package/src/utils/__tests__/secureErrors.unit.test.ts +33 -15
  449. package/src/utils/__tests__/secureStorage.unit.test.ts +1 -1
  450. package/src/utils/__tests__/security.unit.test.ts +40 -18
  451. package/src/utils/__tests__/securityMonitor.unit.test.ts +1 -1
  452. package/src/utils/__tests__/sessionTracking.unit.test.ts +40 -29
  453. package/src/utils/__tests__/validationUtils.unit.test.ts +19 -6
  454. package/src/utils/app/appConfig.ts +47 -0
  455. package/src/utils/app/appIdResolver.test.ts +497 -0
  456. package/src/utils/app/appIdResolver.ts +133 -0
  457. package/src/utils/app/appNameResolver.simple.test.ts +212 -0
  458. package/src/utils/app/appNameResolver.test.ts +121 -0
  459. package/src/utils/app/appNameResolver.ts +195 -0
  460. package/src/utils/audit/audit.ts +127 -0
  461. package/src/utils/context/organisationContext.test.ts +322 -0
  462. package/src/utils/context/organisationContext.ts +156 -0
  463. package/src/utils/context/sessionTracking.ts +125 -0
  464. package/src/utils/core/cn.ts +7 -0
  465. package/src/utils/core/debugLogger.ts +67 -0
  466. package/src/utils/core/logger.ts +181 -0
  467. package/src/utils/device/deviceFingerprint.ts +215 -0
  468. package/src/utils/dynamic/dynamicUtils.ts +105 -0
  469. package/src/utils/dynamic/lazyLoad.tsx +44 -0
  470. package/src/utils/file-reference/__tests__/file-reference.test.ts +788 -0
  471. package/src/utils/file-reference/index.ts +501 -0
  472. package/src/utils/formatting/formatDate.test.ts +237 -0
  473. package/src/utils/formatting/formatting.ts +133 -0
  474. package/src/utils/index.ts +39 -54
  475. package/src/utils/performance/bundleAnalysis.ts +129 -0
  476. package/src/utils/performance/performanceBenchmark.ts +64 -0
  477. package/src/utils/performance/performanceBudgets.ts +110 -0
  478. package/src/utils/permissions/permissionTypes.ts +37 -0
  479. package/src/utils/permissions/permissionUtils.test.ts +393 -0
  480. package/src/utils/permissions/permissionUtils.ts +34 -0
  481. package/src/utils/security/auth-utils.ts +96 -0
  482. package/src/utils/security/secureDataAccess.test.ts +711 -0
  483. package/src/utils/security/secureDataAccess.ts +377 -0
  484. package/src/utils/security/secureErrors.ts +82 -0
  485. package/src/utils/security/secureStorage.ts +244 -0
  486. package/src/utils/security/security.ts +159 -0
  487. package/src/utils/security/securityMonitor.ts +45 -0
  488. package/src/utils/storage/__tests__/helpers.unit.test.ts +1 -4
  489. package/src/utils/storage/helpers.ts +15 -8
  490. package/src/utils/validation/__tests__/htmlSanitization.unit.test.ts +598 -0
  491. package/src/{validation → utils/validation}/csrf.ts +1 -1
  492. package/src/utils/validation/htmlSanitization.ts +184 -0
  493. package/src/utils/validation/index.ts +79 -0
  494. package/src/utils/validation/sanitization.ts +333 -0
  495. package/src/{validation/schemaUtils.ts → utils/validation/schema.ts} +11 -6
  496. package/src/{validation → utils/validation}/sqlInjectionProtection.ts +2 -0
  497. package/src/utils/validation/validation.ts +111 -0
  498. package/src/utils/validation/validationUtils.ts +123 -0
  499. package/src/validation/index.ts +3 -34
  500. package/dist/chunk-24MKLB7U.js +0 -81
  501. package/dist/chunk-24MKLB7U.js.map +0 -1
  502. package/dist/chunk-3CG5L6RN.js.map +0 -1
  503. package/dist/chunk-3DBFLLLU.js.map +0 -1
  504. package/dist/chunk-5F3NDPJV.js.map +0 -1
  505. package/dist/chunk-66C4BSAY.js.map +0 -1
  506. package/dist/chunk-BDZUMRBD.js +0 -87
  507. package/dist/chunk-BDZUMRBD.js.map +0 -1
  508. package/dist/chunk-BYXRHAIF.js.map +0 -1
  509. package/dist/chunk-CDQ3PX7L.js +0 -18
  510. package/dist/chunk-CDQ3PX7L.js.map +0 -1
  511. package/dist/chunk-CQZU6TFE.js.map +0 -1
  512. package/dist/chunk-F64FFPOZ.js.map +0 -1
  513. package/dist/chunk-GEVIB2UB.js.map +0 -1
  514. package/dist/chunk-GKHF54DI.js.map +0 -1
  515. package/dist/chunk-GVDR7WNV.js.map +0 -1
  516. package/dist/chunk-HMNOSGVA.js.map +0 -1
  517. package/dist/chunk-JCQZ6LA7.js.map +0 -1
  518. package/dist/chunk-M6DDYFUD.js.map +0 -1
  519. package/dist/chunk-O3NWNXDY.js.map +0 -1
  520. package/dist/chunk-PYUXFQJ3.js.map +0 -1
  521. package/dist/chunk-UJI6WSMD.js.map +0 -1
  522. package/dist/chunk-VZ5OR6HD.js.map +0 -1
  523. package/dist/chunk-WP5I5GLN.js.map +0 -1
  524. package/dist/chunk-ZYZCRSBD.js.map +0 -1
  525. package/dist/validation-DnhrNMju.d.ts +0 -159
  526. package/src/components/PublicLayout/__tests__/PublicPageDebugger.test.tsx +0 -185
  527. package/src/validation/__tests__/common.unit.test.ts +0 -101
  528. package/src/validation/__tests__/csrf.unit.test.ts +0 -365
  529. package/src/validation/__tests__/passwordSchema.unit.test.ts +0 -203
  530. package/src/validation/__tests__/sanitization.unit.test.ts +0 -250
  531. package/src/validation/__tests__/schemaUtils.unit.test.ts +0 -451
  532. package/src/validation/__tests__/sqlInjectionProtection.unit.test.ts +0 -462
  533. package/src/validation/__tests__/user.unit.test.ts +0 -440
  534. package/src/validation/sanitization.ts +0 -96
  535. /package/dist/{DataTable-A36PJG6N.js.map → DataTable-6M4L6BI2.js.map} +0 -0
  536. /package/dist/{UnifiedAuthProvider-CQDZRJIS.js.map → UnifiedAuthProvider-XIQQ7LVU.js.map} +0 -0
  537. /package/dist/{api-TNIBJWLM.js.map → api-45XYYO2A.js.map} +0 -0
  538. /package/dist/{audit-T36HM7IM.js.map → audit-64X3VJXB.js.map} +0 -0
  539. /package/dist/{chunk-CTJRBUX2.js.map → chunk-6LAAY47Q.js.map} +0 -0
  540. /package/dist/{chunk-ZV77RZMU.js.map → chunk-INQLMHPF.js.map} +0 -0
  541. /package/dist/{useInactivityTracker-MRUU55XI.js.map → useInactivityTracker-TO6ZOF35.js.map} +0 -0
  542. /package/src/{validation → utils/validation}/common.ts +0 -0
  543. /package/src/{validation → utils/validation}/passwordSchema.ts +0 -0
  544. /package/src/{validation → utils/validation}/user.ts +0 -0
@@ -12,6 +12,7 @@ import { type SupabaseClient, type User, type Session, AuthError } from '@supaba
12
12
  import type { SessionRestorationState } from '../types/auth';
13
13
  import { BaseService } from './base/BaseService';
14
14
  import { IAuthService, AuthResult } from './interfaces/IAuthService';
15
+ import { logger } from '../utils/core/logger';
15
16
 
16
17
  export class AuthService extends BaseService implements IAuthService {
17
18
  private user: User | null = null;
@@ -327,11 +328,11 @@ export class AuthService extends BaseService implements IAuthService {
327
328
  };
328
329
  this.authLoading = true;
329
330
  this.restorationStartTime = Date.now();
330
- console.debug('[AuthService] Starting session restoration at', this.restorationStartTime);
331
+ logger.debug('AuthService', 'Starting session restoration at', this.restorationStartTime);
331
332
  this.notify();
332
333
 
333
334
  this.restorationTimeoutId = setTimeout(() => {
334
- console.warn('[AuthService] Session restoration timed out after', this.restorationTimeoutMs, 'ms');
335
+ logger.warn('AuthService', 'Session restoration timed out after', this.restorationTimeoutMs, 'ms');
335
336
  const timeoutError = new Error(`Session restoration timed out after ${this.restorationTimeoutMs}ms`);
336
337
  timeoutError.name = 'SessionRestorationTimeoutError';
337
338
  this.finishSessionRestoration(timeoutError);
@@ -356,9 +357,9 @@ export class AuthService extends BaseService implements IAuthService {
356
357
  this.authLoading = false;
357
358
 
358
359
  if (error) {
359
- console.warn('[AuthService] Session restoration finished with error:', error, 'duration(ms):', duration ?? 'unknown');
360
+ logger.warn('AuthService', 'Session restoration finished with error:', error, 'duration(ms):', duration ?? 'unknown');
360
361
  } else {
361
- console.debug('[AuthService] Session restoration completed successfully in', duration ?? 'unknown', 'ms');
362
+ logger.debug('AuthService', 'Session restoration completed successfully in', duration ?? 'unknown', 'ms');
362
363
  }
363
364
 
364
365
  this.notify();
@@ -382,7 +383,7 @@ export class AuthService extends BaseService implements IAuthService {
382
383
  this.authStateSubscription = this.supabaseClient.auth.onAuthStateChange(
383
384
  (event, session) => {
384
385
  try {
385
- console.debug('[AuthService] Auth state change event received:', event);
386
+ logger.debug('AuthService', 'Auth state change event received:', event);
386
387
  // Handle different auth events
387
388
  if (event === 'SIGNED_OUT') {
388
389
  this.session = null;
@@ -392,7 +393,7 @@ export class AuthService extends BaseService implements IAuthService {
392
393
  // Automatic session tracking (non-blocking)
393
394
  if (session?.user) {
394
395
  this.trackSession('logout', session).catch(err => {
395
- console.warn('[AuthService] Failed to track logout session:', err);
396
+ logger.warn('AuthService', 'Failed to track logout session:', err);
396
397
  });
397
398
  }
398
399
  } else if (event === 'SIGNED_IN' || event === 'TOKEN_REFRESHED') {
@@ -408,7 +409,7 @@ export class AuthService extends BaseService implements IAuthService {
408
409
  // Only track on SIGNED_IN, not TOKEN_REFRESHED (to avoid duplicate login records)
409
410
  if (event === 'SIGNED_IN' && session?.user) {
410
411
  this.trackSession('login', session).catch(err => {
411
- console.warn('[AuthService] Failed to track login session:', err);
412
+ logger.warn('AuthService', 'Failed to track login session:', err);
412
413
  });
413
414
  }
414
415
  } else if (event === 'INITIAL_SESSION') {
@@ -438,14 +439,14 @@ export class AuthService extends BaseService implements IAuthService {
438
439
  this.authLoading = false;
439
440
  this.notify();
440
441
  } catch (error) {
441
- console.warn('[AuthService] Error in auth state change handler:', error);
442
+ logger.warn('AuthService', 'Error in auth state change handler:', error);
442
443
  this.authLoading = false;
443
444
  this.notify();
444
445
  }
445
446
  }
446
447
  );
447
448
  } catch (error) {
448
- console.error('[AuthService] Failed to setup auth state listener:', error);
449
+ logger.error('AuthService', 'Failed to setup auth state listener:', error);
449
450
  throw error; // Re-throw to propagate to the provider
450
451
  }
451
452
  }
@@ -453,7 +454,7 @@ export class AuthService extends BaseService implements IAuthService {
453
454
  private async restoreSession(): Promise<void> {
454
455
  if (!this.supabaseClient) {
455
456
  const error = new Error('Supabase client not available during session restoration');
456
- console.error('[AuthService] Unable to restore session:', error);
457
+ logger.error('AuthService', 'Unable to restore session:', error);
457
458
  this.finishSessionRestoration(error);
458
459
  return;
459
460
  }
@@ -461,7 +462,7 @@ export class AuthService extends BaseService implements IAuthService {
461
462
  this.startSessionRestoration();
462
463
 
463
464
  try {
464
- console.debug('[AuthService] Fetching existing session from Supabase');
465
+ logger.debug('AuthService', 'Fetching existing session from Supabase');
465
466
  let currentSession: Session | null = null;
466
467
  let sessionError: AuthError | null = null;
467
468
 
@@ -471,14 +472,14 @@ export class AuthService extends BaseService implements IAuthService {
471
472
  sessionError = error ?? null;
472
473
  } catch (error) {
473
474
  // Handle cases where getSession might not exist (mocked/test clients)
474
- console.debug('[AuthService] getSession unavailable, treating as no active session');
475
+ logger.debug('AuthService', 'getSession unavailable, treating as no active session');
475
476
  currentSession = null;
476
477
  sessionError = null;
477
478
  }
478
479
 
479
480
  if (sessionError) {
480
481
  // Record error but continue to attempt getUser to satisfy edge cases
481
- console.debug('[AuthService] getSession returned error, attempting to fetch user anyway');
482
+ logger.debug('AuthService', 'getSession returned error, attempting to fetch user anyway');
482
483
  this.authError = sessionError;
483
484
 
484
485
  // Attempt getUser as fallback when getSession fails
@@ -497,7 +498,7 @@ export class AuthService extends BaseService implements IAuthService {
497
498
  }
498
499
  } catch (getUserError) {
499
500
  // If getUser also fails, we've already recorded the sessionError
500
- console.debug('[AuthService] getUser also failed:', getUserError);
501
+ logger.debug('AuthService', 'getUser also failed:', getUserError);
501
502
  }
502
503
  }
503
504
 
@@ -509,7 +510,7 @@ export class AuthService extends BaseService implements IAuthService {
509
510
  // Only skip getUser if we didn't already attempt it due to a sessionError
510
511
  // Treat missing session as a normal cold-start state on public pages (e.g., login)
511
512
  // Do not call getUser() which can raise AuthSessionMissingError and surface a noisy banner
512
- console.debug('[AuthService] No active session found; treating as normal unauthenticated state');
513
+ logger.debug('AuthService', 'No active session found; treating as normal unauthenticated state');
513
514
  this.session = null;
514
515
  this.user = null;
515
516
  this.authError = null;
@@ -521,7 +522,7 @@ export class AuthService extends BaseService implements IAuthService {
521
522
  const restorationError = error instanceof Error
522
523
  ? error
523
524
  : new Error('Unknown error during auth initialization');
524
- console.error('[AuthService] Error during auth initialization:', restorationError);
525
+ logger.error('AuthService', 'Error during auth initialization:', restorationError);
525
526
  if (restorationError instanceof AuthError) {
526
527
  this.authError = restorationError;
527
528
  }
@@ -580,13 +581,13 @@ export class AuthService extends BaseService implements IAuthService {
580
581
  });
581
582
 
582
583
  if (error) {
583
- console.warn(`[AuthService] Failed to track ${sessionType} session:`, error);
584
+ logger.warn('AuthService', `Failed to track ${sessionType} session:`, error);
584
585
  } else {
585
- console.debug(`[AuthService] Successfully tracked ${sessionType} session`);
586
+ logger.debug('AuthService', `Successfully tracked ${sessionType} session`);
586
587
  }
587
588
  } catch (error) {
588
589
  // Log error but don't throw (non-blocking)
589
- console.warn(`[AuthService] Error tracking ${sessionType} session:`, error);
590
+ logger.warn('AuthService', `Error tracking ${sessionType} session:`, error);
590
591
  }
591
592
  }
592
593
 
@@ -596,7 +597,7 @@ export class AuthService extends BaseService implements IAuthService {
596
597
  const handleError = (event: ErrorEvent) => {
597
598
  if (event.error?.message?.includes('AuthSessionMissingError') ||
598
599
  event.error?.message?.includes('Auth session missing')) {
599
- console.warn('[AuthService] Suppressing AuthSessionMissingError during logout');
600
+ logger.warn('AuthService', 'Suppressing AuthSessionMissingError during logout');
600
601
  event.preventDefault();
601
602
  return false;
602
603
  }
@@ -605,7 +606,7 @@ export class AuthService extends BaseService implements IAuthService {
605
606
  const handleUnhandledRejection = (event: PromiseRejectionEvent) => {
606
607
  if (event.reason?.message?.includes('AuthSessionMissingError') ||
607
608
  event.reason?.message?.includes('Auth session missing')) {
608
- console.warn('[AuthService] Suppressing unhandled AuthSessionMissingError');
609
+ logger.warn('AuthService', 'Suppressing unhandled AuthSessionMissingError');
609
610
  event.preventDefault();
610
611
  return false;
611
612
  }
@@ -13,8 +13,8 @@ import { BaseService } from './base/BaseService';
13
13
  import { IEventService } from './interfaces/IEventService';
14
14
  import { Event } from '../types/unified';
15
15
  import { Organisation } from '../types/organisation';
16
- import { DebugLogger } from '../utils/debugLogger';
17
- import { secureStorage } from '../utils/secureStorage';
16
+ import { logger } from '../utils/core/logger';
17
+ import { secureStorage } from '../utils/security/secureStorage';
18
18
 
19
19
  export class EventService extends BaseService implements IEventService {
20
20
  private events: Event[] = [];
@@ -134,7 +134,7 @@ export class EventService extends BaseService implements IEventService {
134
134
  // SECURITY: Validate event belongs to current organisation
135
135
  try {
136
136
  if (this.selectedOrganisation && event.organisation_id !== this.selectedOrganisation.id) {
137
- console.error('[EventService] Event organisation_id does not match selected organisation', {
137
+ logger.error('EventService', 'Event organisation_id does not match selected organisation', {
138
138
  eventOrganisationId: event.organisation_id,
139
139
  selectedOrganisationId: this.selectedOrganisation.id,
140
140
  eventName: event.event_name
@@ -142,14 +142,14 @@ export class EventService extends BaseService implements IEventService {
142
142
  return;
143
143
  }
144
144
  } catch (error) {
145
- console.error('[EventService] Error during event validation:', error);
145
+ logger.error('EventService', 'Error during event validation:', error);
146
146
  }
147
147
 
148
148
  this.selectedEvent = event;
149
149
  this.setSelectedEventId?.(event.event_id);
150
150
  // Persist asynchronously (don't await to avoid blocking)
151
151
  this.persistEventSelection(event.event_id).catch(error => {
152
- console.warn('[EventService] Failed to persist event selection:', error);
152
+ logger.warn('EventService', 'Failed to persist event selection:', error);
153
153
  });
154
154
  // Reset the user cleared flag when selecting an event
155
155
  this.userClearedEventRef = false;
@@ -158,7 +158,7 @@ export class EventService extends BaseService implements IEventService {
158
158
  this.setSelectedEventId?.(null);
159
159
  // Clear from secure storage (don't await to avoid blocking)
160
160
  this.clearEventSelection().catch(error => {
161
- console.warn('[EventService] Failed to clear event selection:', error);
161
+ logger.warn('EventService', 'Failed to clear event selection:', error);
162
162
  });
163
163
  // Reset the auto-selection flag when clearing the event
164
164
  this.hasAutoSelectedRef = false;
@@ -205,7 +205,7 @@ export class EventService extends BaseService implements IEventService {
205
205
  }
206
206
  }
207
207
  } catch (error) {
208
- console.warn('[EventService] Failed to load persisted event:', error);
208
+ logger.warn('EventService', 'Failed to load persisted event:', error);
209
209
  }
210
210
  return false;
211
211
  }
@@ -232,7 +232,7 @@ export class EventService extends BaseService implements IEventService {
232
232
  // Store with encryption using secureStorage
233
233
  await secureStorage.setItem(storageKey, eventId, { encrypt: true });
234
234
  } catch (error) {
235
- console.warn('[EventService] Failed to persist event selection:', error);
235
+ logger.warn('EventService', 'Failed to persist event selection:', error);
236
236
  }
237
237
  }
238
238
 
@@ -248,7 +248,7 @@ export class EventService extends BaseService implements IEventService {
248
248
  this.selectedEvent = null;
249
249
  this.setSelectedEventId?.(null);
250
250
  } catch (error) {
251
- console.warn('[EventService] Failed to clear event selection:', error);
251
+ logger.warn('EventService', 'Failed to clear event selection:', error);
252
252
  }
253
253
  }
254
254
 
@@ -262,7 +262,7 @@ export class EventService extends BaseService implements IEventService {
262
262
  const storageKey = this.getStorageKey(userId);
263
263
  await secureStorage.removeItem(storageKey);
264
264
  } catch (error) {
265
- console.warn('[EventService] Failed to clear event selection for user:', error);
265
+ logger.warn('EventService', 'Failed to clear event selection for user:', error);
266
266
  }
267
267
  }
268
268
 
@@ -292,7 +292,7 @@ export class EventService extends BaseService implements IEventService {
292
292
  localStorage.removeItem('_sec_pace-core-selected-event');
293
293
  }
294
294
  } catch (error) {
295
- console.warn('[EventService] Failed to clean up old storage keys:', error);
295
+ logger.warn('EventService', 'Failed to clean up old storage keys:', error);
296
296
  }
297
297
 
298
298
  // Load persisted event during initialization (don't skip)
@@ -399,7 +399,7 @@ export class EventService extends BaseService implements IEventService {
399
399
  }
400
400
  }
401
401
  } catch (err) {
402
- console.error('[EventService] Error fetching events:', err);
402
+ logger.error('EventService', 'Error fetching events:', err);
403
403
  const _error = err instanceof Error ? err : new Error('Unknown error occurred');
404
404
 
405
405
  if (isMounted) {
@@ -10,6 +10,7 @@
10
10
 
11
11
  import { BaseService } from './base/BaseService';
12
12
  import { IInactivityService } from './interfaces/IInactivityService';
13
+ import { logger } from '../utils/core/logger';
13
14
 
14
15
  export class InactivityService extends BaseService implements IInactivityService {
15
16
  private _showInactivityWarning = false;
@@ -169,7 +170,7 @@ export class InactivityService extends BaseService implements IInactivityService
169
170
  await this.supabaseClient.auth.signOut();
170
171
  }
171
172
  } catch (error: any) {
172
- console.error('[InactivityService] Error during idle logout:', error);
173
+ logger.error('InactivityService', 'Error during idle logout:', error);
173
174
  }
174
175
 
175
176
  // Call app callback for navigation/redirect
@@ -195,7 +196,7 @@ export class InactivityService extends BaseService implements IInactivityService
195
196
  await this.supabaseClient.auth.signOut();
196
197
  }
197
198
  } catch (error: any) {
198
- console.error('[InactivityService] Error during manual sign out:', error);
199
+ logger.error('InactivityService', 'Error during manual sign out:', error);
199
200
  }
200
201
 
201
202
  // Call app callback for navigation/redirect
@@ -229,7 +230,7 @@ export class InactivityService extends BaseService implements IInactivityService
229
230
  const isProduction = import.meta.env.MODE === 'production';
230
231
 
231
232
  if (isProduction) {
232
- console.warn('[InactivityService] Inactivity feature enabled in production');
233
+ logger.warn('InactivityService', 'Inactivity feature enabled in production');
233
234
  }
234
235
  }
235
236
  }
@@ -284,7 +285,7 @@ export class InactivityService extends BaseService implements IInactivityService
284
285
  // Set up event handlers
285
286
  this.setupEventHandlers();
286
287
  } catch (error) {
287
- console.error('[InactivityService] Failed to setup inactivity tracker:', error);
288
+ logger.error('InactivityService', 'Failed to setup inactivity tracker:', error);
288
289
  }
289
290
  }
290
291
 
@@ -17,7 +17,8 @@ import type {
17
17
  OrganisationSecurityError,
18
18
  OrganisationHierarchy
19
19
  } from '../types/organisation';
20
- import { setOrganisationContext } from '../utils/organisationContext';
20
+ import { setOrganisationContext } from '../utils/context/organisationContext';
21
+ import { logger } from '../utils/core/logger';
21
22
 
22
23
  export class OrganisationService extends BaseService implements IOrganisationService {
23
24
  private _selectedOrganisation: Organisation | null = null;
@@ -254,14 +255,14 @@ export class OrganisationService extends BaseService implements IOrganisationSer
254
255
 
255
256
  private async setDatabaseOrganisationContext(organisation: Organisation): Promise<void> {
256
257
  if (!this.supabaseClient || !this.session) {
257
- console.warn('[OrganisationService] No Supabase client or session available for setting organisation context');
258
+ logger.warn('OrganisationService', 'No Supabase client or session available for setting organisation context');
258
259
  this._isContextReady = false;
259
260
  this.notify();
260
261
  return;
261
262
  }
262
263
 
263
264
  try {
264
- console.log('[OrganisationService] Setting database organisation context for:', organisation.id);
265
+ logger.debug('OrganisationService', 'Setting database organisation context for:', organisation.id);
265
266
 
266
267
  // Add timeout to prevent hanging
267
268
  const timeoutPromise = new Promise((_, reject) => {
@@ -272,11 +273,11 @@ export class OrganisationService extends BaseService implements IOrganisationSer
272
273
 
273
274
  await Promise.race([contextPromise, timeoutPromise]);
274
275
 
275
- console.log('[OrganisationService] Database organisation context set successfully');
276
+ logger.debug('OrganisationService', 'Database organisation context set successfully');
276
277
  this._isContextReady = true;
277
278
  this.notify();
278
279
  } catch (error) {
279
- console.error('[OrganisationService] Failed to set database organisation context:', error);
280
+ logger.error('OrganisationService', 'Failed to set database organisation context:', error);
280
281
  // Set context ready to true anyway - this is a non-critical operation
281
282
  // The app should still work without database context
282
283
  this._isContextReady = true;
@@ -288,7 +289,7 @@ export class OrganisationService extends BaseService implements IOrganisationSer
288
289
  private async loadUserOrganisations(): Promise<void> {
289
290
  // Add call tracking to detect race conditions
290
291
  const callId = Math.random().toString(36).substr(2, 9);
291
- console.log(`[OrganisationService] Starting loadUserOrganisations call ${callId}`);
292
+ logger.debug('OrganisationService', `Starting loadUserOrganisations call ${callId}`);
292
293
 
293
294
  if (!this.user || !this.session || !this.supabaseClient) {
294
295
  // Clear state when no user, session, or supabase client
@@ -303,7 +304,7 @@ export class OrganisationService extends BaseService implements IOrganisationSer
303
304
 
304
305
  // Additional check to prevent loading during auth state changes
305
306
  if (this.isLoadingRef) {
306
- console.log("OrganisationService", "Already loading, skipping duplicate load");
307
+ logger.debug("OrganisationService", "Already loading, skipping duplicate load");
307
308
  // Ensure loading state is correct
308
309
  this._isLoading = true;
309
310
  this.notify();
@@ -313,7 +314,7 @@ export class OrganisationService extends BaseService implements IOrganisationSer
313
314
  // Prevent rapid retries - minimum 2 seconds between attempts
314
315
  const now = Date.now();
315
316
  if (now - this.lastLoadTimeRef < 2000) {
316
- console.log("OrganisationService", "Too soon since last load, skipping");
317
+ logger.debug("OrganisationService", "Too soon since last load, skipping");
317
318
  // Ensure loading state is correct
318
319
  if (this._organisations.length > 0 || this._selectedOrganisation) {
319
320
  this._isLoading = false;
@@ -340,7 +341,7 @@ export class OrganisationService extends BaseService implements IOrganisationSer
340
341
  this.notify();
341
342
 
342
343
  try {
343
- console.log("[OrganisationService] Supabase client ready:", {
344
+ logger.debug("OrganisationService", "Supabase client ready:", {
344
345
  isConnected: !!this.supabaseClient,
345
346
  hasAuth: !!this.supabaseClient.auth,
346
347
  hasRpc: !!this.supabaseClient.rpc
@@ -350,7 +351,7 @@ export class OrganisationService extends BaseService implements IOrganisationSer
350
351
  // Only get actual members (org_admin, leader, member) - exclude supporters
351
352
  let memberships, membershipError;
352
353
  try {
353
- console.log("[OrganisationService] Making RPC call to data_user_organisation_roles_get...");
354
+ logger.debug("OrganisationService", "Making RPC call to data_user_organisation_roles_get...");
354
355
 
355
356
  // Add timeout and abort signal to prevent hanging RPC calls
356
357
  const timeoutPromise = new Promise((_, reject) => {
@@ -373,7 +374,7 @@ export class OrganisationService extends BaseService implements IOrganisationSer
373
374
 
374
375
  const result = await Promise.race([rpcPromise, timeoutPromise]) as any;
375
376
 
376
- console.log("[OrganisationService] RPC call completed:", {
377
+ logger.debug("OrganisationService", "RPC call completed:", {
377
378
  hasData: !!result.data,
378
379
  hasError: !!result.error,
379
380
  dataLength: result.data?.length || 0,
@@ -390,11 +391,11 @@ export class OrganisationService extends BaseService implements IOrganisationSer
390
391
  }
391
392
 
392
393
  if (membershipError) {
393
- console.error("[OrganisationService] Error loading memberships:", membershipError);
394
+ logger.error("OrganisationService", "Error loading memberships:", membershipError);
394
395
 
395
396
  // If RPC fails with timeout, try direct database query as fallback
396
397
  if (membershipError.message?.includes('timeout')) {
397
- console.log("[OrganisationService] RPC timed out, trying direct database query as fallback...");
398
+ logger.debug("OrganisationService", "RPC timed out, trying direct database query as fallback...");
398
399
  try {
399
400
  // Check if request was aborted before making fallback query
400
401
  if (abortSignal.aborted) {
@@ -434,15 +435,15 @@ export class OrganisationService extends BaseService implements IOrganisationSer
434
435
  .in('role', ['org_admin', 'leader', 'member']);
435
436
 
436
437
  if (fallbackError) {
437
- console.error("[OrganisationService] Fallback query also failed:", fallbackError);
438
+ logger.error("OrganisationService", "Fallback query also failed:", fallbackError);
438
439
  throw membershipError; // Throw original error
439
440
  }
440
441
 
441
- console.log("[OrganisationService] Fallback query successful, got", fallbackData?.length || 0, "memberships");
442
+ logger.debug("OrganisationService", "Fallback query successful, got", fallbackData?.length || 0, "memberships");
442
443
  memberships = fallbackData || [];
443
444
  membershipError = null;
444
445
  } catch (fallbackErr) {
445
- console.error("[OrganisationService] Fallback query failed:", fallbackErr);
446
+ logger.error("OrganisationService", "Fallback query failed:", fallbackErr);
446
447
  throw membershipError; // Throw original error
447
448
  }
448
449
  } else {
@@ -460,24 +461,24 @@ export class OrganisationService extends BaseService implements IOrganisationSer
460
461
  .filter((id: string) => {
461
462
  // Better validation to prevent empty string UUID errors
462
463
  if (!id || typeof id !== 'string') {
463
- console.warn("[OrganisationService] Invalid organisation ID (not string):", id);
464
+ logger.warn("OrganisationService", "Invalid organisation ID (not string):", id);
464
465
  return false;
465
466
  }
466
467
  const trimmedId = id.trim();
467
468
  if (trimmedId === '') {
468
- console.warn("[OrganisationService] Empty organisation ID found");
469
+ logger.warn("OrganisationService", "Empty organisation ID found");
469
470
  return false;
470
471
  }
471
472
  // Validate UUID format
472
473
  const isValidUuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(trimmedId);
473
474
  if (!isValidUuid) {
474
- console.warn("[OrganisationService] Invalid UUID format:", trimmedId);
475
+ logger.warn("OrganisationService", "Invalid UUID format:", trimmedId);
475
476
  }
476
477
  return isValidUuid;
477
478
  });
478
479
 
479
480
  if (organisationIds.length === 0) {
480
- console.warn("[OrganisationService] No valid organisation IDs found in memberships:", memberships);
481
+ logger.warn("OrganisationService", "No valid organisation IDs found in memberships:", memberships);
481
482
  throw new Error('No valid organisation IDs found in memberships') as OrganisationSecurityError;
482
483
  }
483
484
 
@@ -491,7 +492,7 @@ export class OrganisationService extends BaseService implements IOrganisationSer
491
492
  .select('id, name, display_name, subscription_tier, settings, is_active, parent_id, created_at, updated_at');
492
493
 
493
494
  if (orgError) {
494
- console.error("[OrganisationService] Error loading organisations:", orgError);
495
+ logger.error("OrganisationService", "Error loading organisations:", orgError);
495
496
  throw orgError;
496
497
  }
497
498
 
@@ -534,16 +535,16 @@ export class OrganisationService extends BaseService implements IOrganisationSer
534
535
  if (validPersistedOrg) {
535
536
  initialOrg = validPersistedOrg;
536
537
  } else {
537
- console.warn("[OrganisationService] Persisted organisation not found in active orgs, clearing cache");
538
+ logger.warn("OrganisationService", "Persisted organisation not found in active orgs, clearing cache");
538
539
  localStorage.removeItem('pace-core-selected-organisation');
539
540
  }
540
541
  } else {
541
- console.warn("[OrganisationService] Invalid persisted organisation ID, clearing cache");
542
+ logger.warn("OrganisationService", "Invalid persisted organisation ID, clearing cache");
542
543
  localStorage.removeItem('pace-core-selected-organisation');
543
544
  }
544
545
  }
545
546
  } catch (storageError) {
546
- console.warn("[OrganisationService] Failed to restore persisted organisation:", storageError);
547
+ logger.warn("OrganisationService", "Failed to restore persisted organisation:", storageError);
547
548
  // Clear potentially corrupted cache
548
549
  localStorage.removeItem('pace-core-selected-organisation');
549
550
  }
@@ -581,7 +582,7 @@ export class OrganisationService extends BaseService implements IOrganisationSer
581
582
  this.hasFailedRef = false;
582
583
 
583
584
  } catch (err) {
584
- console.error("[OrganisationService] Failed to load organisations:", err);
585
+ logger.error("OrganisationService", "Failed to load organisations:", err);
585
586
  this._error = err as Error;
586
587
  // Increment retry count on error
587
588
  this.retryCount = this.retryCount + 1;
@@ -12,6 +12,17 @@ import { describe, it, expect, beforeEach, vi, afterEach } from 'vitest';
12
12
  import { AuthService } from '../AuthService';
13
13
  import { AuthError } from '@supabase/supabase-js';
14
14
 
15
+ // Don't mock the logger - it now works in test mode
16
+ // We'll spy on the Logger class methods in beforeEach to verify calls
17
+ import { Logger } from '../../utils/core/logger';
18
+
19
+ let mockLoggerFunctions: {
20
+ debug: ReturnType<typeof vi.spyOn>;
21
+ error: ReturnType<typeof vi.spyOn>;
22
+ warn: ReturnType<typeof vi.spyOn>;
23
+ info: ReturnType<typeof vi.spyOn>;
24
+ };
25
+
15
26
  // Mock Supabase client
16
27
  const createMockSupabaseClient = () => ({
17
28
  auth: {
@@ -32,12 +43,25 @@ describe('AuthService', () => {
32
43
  let authService: AuthService;
33
44
 
34
45
  beforeEach(() => {
46
+ // Spy on Logger methods to verify calls (logger now works in test mode)
47
+ mockLoggerFunctions = {
48
+ debug: vi.spyOn(Logger, 'debug'),
49
+ error: vi.spyOn(Logger, 'error'),
50
+ warn: vi.spyOn(Logger, 'warn'),
51
+ info: vi.spyOn(Logger, 'info'),
52
+ };
53
+
35
54
  mockSupabase = createMockSupabaseClient();
36
55
  authService = new AuthService(mockSupabase as any);
37
56
  });
38
57
 
39
58
  afterEach(() => {
40
59
  authService.cleanup();
60
+ // Restore spies
61
+ mockLoggerFunctions.debug.mockRestore();
62
+ mockLoggerFunctions.error.mockRestore();
63
+ mockLoggerFunctions.warn.mockRestore();
64
+ mockLoggerFunctions.info.mockRestore();
41
65
  vi.clearAllMocks();
42
66
  });
43
67
 
@@ -760,9 +784,9 @@ describe('AuthService', () => {
760
784
  it('should handle tracking errors gracefully without breaking authentication', async () => {
761
785
  const mockUser = { id: 'user-123', email: 'test@example.com' };
762
786
  const mockSession = { access_token: 'token', user: mockUser };
763
- const consoleWarnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
764
787
 
765
- (mockSupabase as any).rpc.mockRejectedValue(new Error('Tracking failed'));
788
+ // Mock rpc to reject (this will trigger the catch block in trackSession)
789
+ (mockSupabase as any).rpc = vi.fn().mockRejectedValue(new Error('Tracking failed'));
766
790
 
767
791
  let authStateCallback: any;
768
792
  mockSupabase.auth.onAuthStateChange.mockImplementation((callback) => {
@@ -777,19 +801,29 @@ describe('AuthService', () => {
777
801
  if (authStateCallback) {
778
802
  authStateCallback('SIGNED_IN', mockSession);
779
803
 
780
- // Wait a bit for async tracking to complete
781
- await new Promise(resolve => setTimeout(resolve, 100));
804
+ // Wait for async tracking to complete (trackSession is async)
805
+ // The catch block in trackSession will log the error
806
+ // Note: The logger may be called in the .catch() handler with "Failed to track"
807
+ // or in the catch block with "Error tracking"
808
+ await new Promise(resolve => setTimeout(resolve, 500));
782
809
 
783
- // Verify error was logged but authentication still succeeded
784
- // When rpc throws an exception, it goes to catch block which logs "Error tracking"
785
- expect(consoleWarnSpy).toHaveBeenCalledWith(
786
- expect.stringContaining('Error tracking login session'),
787
- expect.anything()
810
+ // Check for either error message pattern
811
+ const warnCalls = mockLoggerFunctions.warn.mock.calls;
812
+ const hasErrorTracking = warnCalls.some(call =>
813
+ call[0] === 'AuthService' &&
814
+ typeof call[1] === 'string' &&
815
+ call[1].includes('Error tracking')
788
816
  );
817
+ const hasFailedToTrack = warnCalls.some(call =>
818
+ call[0] === 'AuthService' &&
819
+ typeof call[1] === 'string' &&
820
+ call[1].includes('Failed to track')
821
+ );
822
+
823
+ expect(hasErrorTracking || hasFailedToTrack).toBe(true);
824
+ expect(mockLoggerFunctions.warn).toHaveBeenCalled();
789
825
  expect(authServiceWithApp.isAuthenticated()).toBe(true);
790
826
  }
791
-
792
- consoleWarnSpy.mockRestore();
793
827
  authServiceWithApp.cleanup();
794
828
  });
795
829
 
@@ -1115,7 +1149,7 @@ describe('AuthService', () => {
1115
1149
  });
1116
1150
 
1117
1151
  it('should handle tracking when RPC fails', async () => {
1118
- const consoleWarnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
1152
+ vi.clearAllMocks();
1119
1153
  (mockSupabase as any).rpc = vi.fn().mockResolvedValue({
1120
1154
  error: { message: 'RPC failed' }
1121
1155
  });
@@ -1147,16 +1181,14 @@ describe('AuthService', () => {
1147
1181
  if (authStateCallback) {
1148
1182
  authStateCallback('SIGNED_IN', mockSession);
1149
1183
 
1150
- await new Promise(resolve => setTimeout(resolve, 100));
1151
-
1152
- // Should log warning but not break authentication
1153
- expect(consoleWarnSpy).toHaveBeenCalledWith(
1154
- expect.stringContaining('Failed to track login session'),
1184
+ // Wait for async tracking to complete
1185
+ await new Promise(resolve => setTimeout(resolve, 200));
1186
+ expect(mockLoggerFunctions.warn).toHaveBeenCalledWith(
1187
+ 'AuthService',
1188
+ expect.stringContaining('Failed to track'),
1155
1189
  expect.anything()
1156
1190
  );
1157
1191
  }
1158
-
1159
- consoleWarnSpy.mockRestore();
1160
1192
  authServiceWithApp.cleanup();
1161
1193
  });
1162
1194