@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
@@ -17,6 +17,9 @@ import {
17
17
  listFiles,
18
18
  archiveFile
19
19
  } from '../utils/storage';
20
+ import { createLogger } from '../utils/core/logger';
21
+
22
+ const log = createLogger('useStorage');
20
23
 
21
24
  export interface UseStorageOptions {
22
25
  supabase: SupabaseClient;
@@ -117,7 +120,7 @@ export function useStorage({ supabase, appName, orgId }: UseStorageOptions): Use
117
120
  });
118
121
  return result?.url || null;
119
122
  } catch (error) {
120
- console.error('Failed to get signed URL:', error);
123
+ log.error('Failed to get signed URL:', error);
121
124
  return null;
122
125
  }
123
126
  }, [supabase, appName, orgId]);
package/src/index.ts CHANGED
@@ -21,7 +21,7 @@ export { UnifiedAuthProvider, useUnifiedAuth } from './providers/UnifiedAuthProv
21
21
  export type { UnifiedAuthProviderProps, UnifiedAuthContextType, UserEventAccess } from './providers/UnifiedAuthProvider';
22
22
 
23
23
  // Session tracking utility (for manual use if needed)
24
- export { useSessionTracking } from './utils/sessionTracking';
24
+ export { useSessionTracking } from './utils/context/sessionTracking';
25
25
 
26
26
  // Provider components (using service architecture)
27
27
  export { EventProvider } from './providers/EventProvider';
@@ -79,6 +79,9 @@ export type { LabelProps } from './components/Label/Label';
79
79
  export { Alert, AlertTitle, AlertDescription } from './components/Alert/Alert';
80
80
  export { Avatar, AvatarImage, AvatarFallback } from './components/Avatar/Avatar';
81
81
 
82
+ export { Badge } from './components/Badge/Badge';
83
+ export type { BadgeProps, BadgeVariant } from './components/Badge/Badge';
84
+
82
85
  export { Checkbox } from './components/Checkbox/Checkbox';
83
86
  export { Switch } from './components/Switch/Switch';
84
87
  export type { SwitchProps } from './components/Switch/Switch';
@@ -141,6 +144,7 @@ export {
141
144
  type AggregateConfig,
142
145
  type EmptyStateConfig,
143
146
  type GetRowId,
147
+ type DataTableFeatureConfig,
144
148
  ColumnFactory
145
149
  } from './components/DataTable';
146
150
 
@@ -155,6 +159,15 @@ export {
155
159
  type ExportColumn
156
160
  } from './components/DataTable/utils/exportUtils';
157
161
 
162
+ // Export DataTable aggregation utilities
163
+ export {
164
+ sum,
165
+ average,
166
+ count,
167
+ min,
168
+ max
169
+ } from './components/DataTable/utils/aggregationUtils';
170
+
158
171
  // FORM COMPONENTS
159
172
  export { Form } from './components/Form/Form';
160
173
  export { LoginForm } from './components/LoginForm/LoginForm';
@@ -183,7 +196,8 @@ export type { ProtectedRouteProps } from './components/ProtectedRoute/ProtectedR
183
196
  // UTILITY COMPONENTS
184
197
  export { ErrorBoundary } from './components/ErrorBoundary/ErrorBoundary';
185
198
  export { LoadingSpinner } from './components/LoadingSpinner/LoadingSpinner';
186
- export { SessionRestorationLoader } from './components/SessionRestorationLoader';
199
+ export { SessionRestorationLoader } from './components/SessionRestorationLoader/SessionRestorationLoader';
200
+ export type { SessionRestorationLoaderProps } from './components/SessionRestorationLoader/SessionRestorationLoader';
187
201
 
188
202
  // EVENT MANAGEMENT
189
203
  export { EventSelector } from './components/EventSelector/EventSelector';
@@ -192,20 +206,19 @@ export { EventSelector } from './components/EventSelector/EventSelector';
192
206
  export { OrganisationSelector } from './components/OrganisationSelector/OrganisationSelector';
193
207
  export { useOrganisationPermissions } from './hooks/useOrganisationPermissions';
194
208
  export { useOrganisationSecurity } from './hooks/useOrganisationSecurity';
195
- export { createSecureDataAccess } from './utils/secureDataAccess';
209
+ export { createSecureDataAccess } from './utils/security/secureDataAccess';
196
210
 
197
211
  // TYPES
198
212
  export type { UserProfile } from './types/organisation';
199
213
 
200
214
  // AUTHENTICATION FORMS
201
- export { PasswordResetForm } from './components/PasswordReset/PasswordResetForm';
202
215
  export { PasswordChangeForm } from './components/PasswordReset/PasswordChangeForm';
203
216
 
204
217
  // UTILS & HOOKS
205
218
  export { useAppConfig } from './hooks/useAppConfig';
206
219
  export { useEventTheme } from './hooks/useEventTheme';
207
- export { cn } from './utils/cn';
208
- export { setAppConfig, getAppConfig, getCurrentAppName, getCurrentAppId } from './utils/appConfig';
220
+ export { cn } from './utils/core/cn';
221
+ export { setAppConfig, getAppConfig, getCurrentAppName, getCurrentAppId } from './utils/app/appConfig';
209
222
 
210
223
  // FORMATTING UTILITIES
211
224
  export {
@@ -215,7 +228,7 @@ export {
215
228
  formatPercent,
216
229
  formatCompactNumber,
217
230
  formatFileSize
218
- } from './utils/formatting';
231
+ } from './utils/formatting/formatting';
219
232
 
220
233
  // STORAGE UTILITIES
221
234
  export { FileUpload } from './components/FileUpload';
@@ -12,6 +12,7 @@ import React, { createContext, useContext, useMemo, useEffect, useState } from '
12
12
  import { type SupabaseClient } from '@supabase/supabase-js';
13
13
  import { AuthService } from '../../services/AuthService';
14
14
  import type { SessionRestorationState } from '../../types/auth';
15
+ import { logger } from '../../utils/core/logger';
15
16
 
16
17
  // Context type
17
18
  export interface AuthServiceContextType {
@@ -46,7 +47,7 @@ export function AuthServiceProvider({ children, supabaseClient, appName }: AuthS
46
47
 
47
48
  const isDev = typeof import.meta !== 'undefined' && (import.meta.env.DEV || import.meta.env.MODE === 'development');
48
49
  if (isDev) {
49
- console.debug('[AuthServiceProvider] Session restoration state updated', restorationState);
50
+ logger.debug('AuthServiceProvider', 'Session restoration state updated', restorationState);
50
51
  }
51
52
  });
52
53
 
@@ -58,7 +59,7 @@ export function AuthServiceProvider({ children, supabaseClient, appName }: AuthS
58
59
  // Initialize service on mount
59
60
  useEffect(() => {
60
61
  authService.initialize().catch(error => {
61
- console.error('[AuthServiceProvider] Failed to initialize auth service:', error);
62
+ logger.error('AuthServiceProvider', 'Failed to initialize auth service:', error);
62
63
  });
63
64
 
64
65
  // Cleanup on unmount
@@ -11,6 +11,7 @@
11
11
  import React, { createContext, useContext, useMemo, useEffect, useRef } from 'react';
12
12
  import { type SupabaseClient, type User, type Session } from '@supabase/supabase-js';
13
13
  import { EventService } from '../../services/EventService';
14
+ import { logger } from '../../utils/core/logger';
14
15
 
15
16
  // Context type
16
17
  export interface EventServiceContextType {
@@ -63,7 +64,7 @@ export function EventServiceProvider({
63
64
  // Re-initialize service when dependencies change
64
65
  await eventService.initialize().catch(error => {
65
66
  if (isMounted) {
66
- console.error('[EventServiceProvider] Failed to initialize event service:', error);
67
+ logger.error('EventServiceProvider', 'Failed to initialize event service:', error);
67
68
  }
68
69
  });
69
70
  };
@@ -11,6 +11,7 @@
11
11
  import React, { createContext, useContext, useMemo, useEffect, useRef } from 'react';
12
12
  import { type SupabaseClient, type User, type Session } from '@supabase/supabase-js';
13
13
  import { InactivityService } from '../../services/InactivityService';
14
+ import { logger } from '../../utils/core/logger';
14
15
 
15
16
  // Context type
16
17
  export interface InactivityServiceContextType {
@@ -56,7 +57,7 @@ export function InactivityServiceProvider({
56
57
 
57
58
  inactivityService.initialize().catch(error => {
58
59
  if (isMounted) {
59
- console.error('[InactivityServiceProvider] Failed to initialize inactivity service:', error);
60
+ logger.error('InactivityServiceProvider', 'Failed to initialize inactivity service:', error);
60
61
  }
61
62
  });
62
63
 
@@ -11,6 +11,7 @@
11
11
  import React, { createContext, useContext, useMemo, useEffect, useRef } from 'react';
12
12
  import { type SupabaseClient, type User, type Session } from '@supabase/supabase-js';
13
13
  import { OrganisationService } from '../../services/OrganisationService';
14
+ import { logger } from '../../utils/core/logger';
14
15
 
15
16
  // Context type
16
17
  export interface OrganisationServiceContextType {
@@ -50,7 +51,7 @@ export function OrganisationServiceProvider({
50
51
 
51
52
  organisationService.initialize().catch(error => {
52
53
  if (isMounted) {
53
- console.error('[OrganisationServiceProvider] Failed to initialize organisation service:', error);
54
+ logger.error('OrganisationServiceProvider', 'Failed to initialize organisation service:', error);
54
55
  }
55
56
  });
56
57
 
@@ -23,6 +23,7 @@ import type { Organisation, OrganisationMembership } from '../../types/organisat
23
23
  import type { Event } from '../../types/unified';
24
24
  import type { AuthError } from '@supabase/supabase-js';
25
25
  import type { SessionRestorationState } from '../../types/auth';
26
+ import { logger } from '../../utils/core/logger';
26
27
 
27
28
  // Re-export UserEventAccess type
28
29
  export interface UserEventAccess {
@@ -116,8 +117,8 @@ const UnifiedAuthContext = createContext<UnifiedAuthContextType | undefined>(und
116
117
  export const useUnifiedAuth = () => {
117
118
  const context = useContext(UnifiedAuthContext);
118
119
  if (!context) {
119
- // Provide a helpful console error in addition to throwing for testability and DX
120
- console.error('useUnifiedAuth must be used within a UnifiedAuthProvider');
120
+ // Provide a helpful error log in addition to throwing for testability and DX
121
+ logger.error('useUnifiedAuth', 'useUnifiedAuth must be used within a UnifiedAuthProvider');
121
122
  throw new Error('useUnifiedAuth must be used within a UnifiedAuthProvider');
122
123
  }
123
124
  return context;
@@ -265,7 +266,7 @@ function UnifiedAuthContextProvider({
265
266
  prevState.isAuthenticated !== currentState.isAuthenticated ||
266
267
  prevState.userEmail !== currentState.userEmail ||
267
268
  prevState.totalLoading !== currentState.totalLoading) {
268
- console.log('[UnifiedAuthContext] Auth state changed:', {
269
+ logger.debug('UnifiedAuthContext', 'Auth state changed:', {
269
270
  isAuthenticated: isAuth,
270
271
  user: currentUser?.email,
271
272
  session: currentSession ? 'exists' : 'null',
@@ -13,6 +13,7 @@ import { render, screen, waitFor } from '@testing-library/react';
13
13
  import React from 'react';
14
14
  import { AuthServiceProvider, useAuthService } from '../AuthServiceProvider';
15
15
  import { type SupabaseClient, type User, type Session } from '@supabase/supabase-js';
16
+ import { Logger, LogLevel } from '../../../utils/core/logger';
16
17
 
17
18
  // Mock Supabase client
18
19
  const createMockSupabaseClient = (): SupabaseClient => ({
@@ -76,12 +77,28 @@ function TestComponent() {
76
77
 
77
78
  describe('AuthServiceProvider Integration', () => {
78
79
  let mockSupabase: SupabaseClient;
80
+ let originalMode: string | undefined;
79
81
 
80
82
  beforeEach(() => {
83
+ // Ensure logger is enabled by setting MODE to development
84
+ originalMode = import.meta.env.MODE;
85
+ (import.meta.env as any).MODE = 'development';
86
+
87
+ // Configure logger to ensure it logs in test environment
88
+ Logger.configure({
89
+ level: LogLevel.DEBUG,
90
+ includeTimestamp: false,
91
+ includeComponent: true,
92
+ });
93
+
81
94
  mockSupabase = createMockSupabaseClient();
82
95
  });
83
96
 
84
97
  afterEach(() => {
98
+ // Restore original mode
99
+ if (originalMode !== undefined) {
100
+ (import.meta.env as any).MODE = originalMode;
101
+ }
85
102
  vi.clearAllMocks();
86
103
  });
87
104
 
@@ -201,8 +218,11 @@ describe('AuthServiceProvider Integration', () => {
201
218
 
202
219
  // Error is logged during initialization
203
220
  await waitFor(() => {
204
- expect(consoleSpy).toHaveBeenCalled();
205
- }, { interval: 10 });
221
+ expect(consoleSpy).toHaveBeenCalledWith(
222
+ expect.stringContaining('[ERROR] [AuthServiceProvider] Failed to initialize auth service'),
223
+ expect.any(Error)
224
+ );
225
+ }, { interval: 10, timeout: 2000 });
206
226
 
207
227
  consoleSpy.mockRestore();
208
228
  });
@@ -12,6 +12,7 @@ import { describe, it, expect, beforeEach, vi, afterEach } from 'vitest';
12
12
  import { render, screen, waitFor } from '@testing-library/react';
13
13
  import { UnifiedAuthProvider, useUnifiedAuth } from '../UnifiedAuthProvider';
14
14
  import { type SupabaseClient, type User, type Session } from '@supabase/supabase-js';
15
+ import { Logger, LogLevel } from '../../../utils/core/logger';
15
16
 
16
17
  // Mock Supabase client
17
18
  const createMockSupabaseClient = (): SupabaseClient => ({
@@ -72,12 +73,28 @@ function TestComponent() {
72
73
 
73
74
  describe('UnifiedAuthProvider Integration', () => {
74
75
  let mockSupabase: SupabaseClient;
76
+ let originalMode: string | undefined;
75
77
 
76
78
  beforeEach(() => {
79
+ // Ensure logger is enabled by setting MODE to development
80
+ originalMode = import.meta.env.MODE;
81
+ (import.meta.env as any).MODE = 'development';
82
+
83
+ // Configure logger to ensure it logs in test environment
84
+ Logger.configure({
85
+ level: LogLevel.DEBUG,
86
+ includeTimestamp: false,
87
+ includeComponent: true,
88
+ });
89
+
77
90
  mockSupabase = createMockSupabaseClient();
78
91
  });
79
92
 
80
93
  afterEach(() => {
94
+ // Restore original mode
95
+ if (originalMode !== undefined) {
96
+ (import.meta.env as any).MODE = originalMode;
97
+ }
81
98
  vi.clearAllMocks();
82
99
  });
83
100
 
@@ -162,8 +179,13 @@ describe('UnifiedAuthProvider Integration', () => {
162
179
  );
163
180
 
164
181
  await waitFor(() => {
165
- expect(consoleSpy).toHaveBeenCalled();
166
- });
182
+ // Check that logger.error was called (which uses console.error internally)
183
+ // The error could be from any of the service providers (Auth, Organisation, Event, Inactivity)
184
+ expect(consoleSpy).toHaveBeenCalledWith(
185
+ expect.stringMatching(/\[ERROR\] \[(AuthServiceProvider|OrganisationServiceProvider|EventServiceProvider|InactivityServiceProvider)\]/),
186
+ expect.any(Error)
187
+ );
188
+ }, { timeout: 2000 });
167
189
 
168
190
  consoleSpy.mockRestore();
169
191
  });
@@ -20,6 +20,22 @@ import {
20
20
  import { rbacCache, CACHE_PATTERNS } from '../cache';
21
21
  import { emitAuditEvent } from '../audit';
22
22
 
23
+ // Mock the Logger module
24
+ vi.mock('../../utils/core/logger', () => {
25
+ const mockLoggerInstance = {
26
+ warn: vi.fn(),
27
+ debug: vi.fn(),
28
+ error: vi.fn(),
29
+ };
30
+ return {
31
+ createLogger: vi.fn(() => mockLoggerInstance),
32
+ };
33
+ });
34
+
35
+ // Get the mock instance after mock is set up
36
+ import { createLogger } from '../../utils/core/logger';
37
+ const getMockLogger = () => createLogger('test');
38
+
23
39
  // Mock the cache module
24
40
  vi.mock('../cache', () => ({
25
41
  rbacCache: {
@@ -365,20 +381,18 @@ describe('RBAC Cache Invalidation', () => {
365
381
 
366
382
  describe('Error Handling', () => {
367
383
  it('handles audit event errors gracefully', async () => {
384
+ vi.clearAllMocks();
368
385
  vi.mocked(emitAuditEvent).mockRejectedValue(new Error('Audit error'));
369
386
 
370
- const consoleWarnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
371
-
372
387
  manager.invalidateUser('user-123' as const, 'test');
373
388
 
374
389
  await vi.waitFor(() => {
375
- expect(consoleWarnSpy).toHaveBeenCalledWith(
376
- expect.stringContaining('[RBAC Cache] Failed to log cache invalidation audit event'),
390
+ const logger = getMockLogger();
391
+ expect(vi.mocked(logger.warn)).toHaveBeenCalledWith(
392
+ 'Failed to log cache invalidation audit event:',
377
393
  expect.any(Error)
378
394
  );
379
395
  });
380
-
381
- consoleWarnSpy.mockRestore();
382
396
  });
383
397
  });
384
398
  });
package/src/rbac/api.ts CHANGED
@@ -26,6 +26,9 @@ import { createAuditManager, setGlobalAuditManager } from './audit';
26
26
  import { rbacCache, RBACCache, CACHE_PATTERNS } from './cache';
27
27
  import { createRBACConfig, RBACConfig, getRBACLogger } from './config';
28
28
  import { SecurityContext } from './security';
29
+ import { createLogger } from '../utils/core/logger';
30
+
31
+ const log = createLogger('RBACAPI');
29
32
 
30
33
  // Global engine instance
31
34
  let globalEngine: RBACEngine | null = null;
@@ -292,7 +295,7 @@ export async function isSuperAdmin(userId: UUID): Promise<boolean> {
292
295
  export async function getAppConfig(appId: UUID): Promise<{ requires_event: boolean } | null> {
293
296
  // This function requires a Supabase client to be provided
294
297
  // Callers should pass the client as a parameter
295
- console.warn('[RBAC] getAppConfig called without Supabase client - returning null');
298
+ log.warn('getAppConfig called without Supabase client - returning null');
296
299
  return null;
297
300
  }
298
301
 
@@ -311,7 +314,7 @@ export async function getAppConfigWithClient(client: SupabaseClient, appId: UUID
311
314
 
312
315
  return { requires_event: data.requires_event };
313
316
  } catch (err) {
314
- console.error('[RBAC] Error fetching app config:', err);
317
+ log.error('Error fetching app config:', err);
315
318
  return null;
316
319
  }
317
320
  }
@@ -15,6 +15,7 @@ import {
15
15
  AuditEventSource,
16
16
  RBACAuditEvent
17
17
  } from './types';
18
+ import { logger } from '../utils/core/logger';
18
19
 
19
20
  /**
20
21
  * Enhanced audit event payload for permission checks
@@ -154,7 +155,7 @@ export class EnhancedRBACAuditManager {
154
155
 
155
156
  // Validate required fields before attempting to insert
156
157
  if (!event.userId || !event.organisationId) {
157
- console.warn('[RBAC Audit] Skipping audit event - missing required fields:', {
158
+ logger.warn('RBAC Audit', 'Skipping audit event - missing required fields:', {
158
159
  userId: event.userId,
159
160
  organisationId: event.organisationId,
160
161
  eventType: event.type
@@ -184,7 +185,7 @@ export class EnhancedRBACAuditManager {
184
185
 
185
186
  if (error) {
186
187
  // Log the error for debugging
187
- console.warn('[RBAC Audit] Failed to insert audit event:', {
188
+ logger.warn('RBAC Audit', 'Failed to insert audit event:', {
188
189
  error: error.message,
189
190
  code: error.code,
190
191
  details: error.details,
@@ -199,7 +200,7 @@ export class EnhancedRBACAuditManager {
199
200
  }
200
201
  } catch (error) {
201
202
  // Log unexpected errors
202
- console.error('[RBAC Audit] Unexpected error during audit logging:', error);
203
+ logger.error('RBAC Audit', 'Unexpected error during audit logging:', error);
203
204
 
204
205
  // Use fallback logging if enabled
205
206
  if (this.fallbackEnabled) {
@@ -215,11 +216,10 @@ export class EnhancedRBACAuditManager {
215
216
  * @param error - The error that occurred
216
217
  */
217
218
  private logFallbackEvent(event: EnhancedAuditEventPayload, error: any): void {
218
- console.log('[RBAC Audit Fallback]', {
219
+ logger.debug('RBAC Audit Fallback', 'Database audit logging failed, using console fallback', {
219
220
  timestamp: new Date().toISOString(),
220
221
  event,
221
- error: error?.message || error,
222
- note: 'Database audit logging failed, using console fallback'
222
+ error: error?.message || error
223
223
  });
224
224
  }
225
225
 
@@ -24,6 +24,7 @@ import {
24
24
  } from './audit';
25
25
  import { UUID, AuditEventSource } from './types';
26
26
  import { Database } from '../types/database';
27
+ import { Logger, LogLevel } from '../utils/core/logger';
27
28
 
28
29
  // Mock Supabase client
29
30
  const createMockSupabaseClient = () => {
@@ -350,17 +351,38 @@ describe('RBACAuditManager', () => {
350
351
  });
351
352
 
352
353
  describe('Fallback Logging', () => {
353
- let consoleLogSpy: any;
354
+ let consoleDebugSpy: any;
354
355
  let consoleWarnSpy: any;
356
+ let consoleErrorSpy: any;
357
+ let originalMode: string | undefined;
355
358
 
356
359
  beforeEach(() => {
357
- consoleLogSpy = vi.spyOn(console, 'log').mockImplementation(() => {});
360
+ // Ensure logger is enabled by setting MODE to development
361
+ originalMode = import.meta.env.MODE;
362
+ (import.meta.env as any).MODE = 'development';
363
+
364
+ // Configure logger to ensure it logs in test environment
365
+ Logger.configure({
366
+ level: LogLevel.DEBUG,
367
+ includeTimestamp: false,
368
+ includeComponent: true,
369
+ });
370
+
371
+ // Logger uses console.debug for debug logs, console.warn for warnings, console.error for errors
372
+ consoleDebugSpy = vi.spyOn(console, 'debug').mockImplementation(() => {});
358
373
  consoleWarnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
374
+ consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
359
375
  });
360
376
 
361
377
  afterEach(() => {
362
- consoleLogSpy.mockRestore();
378
+ consoleDebugSpy.mockRestore();
363
379
  consoleWarnSpy.mockRestore();
380
+ consoleErrorSpy.mockRestore();
381
+
382
+ // Restore original mode
383
+ if (originalMode !== undefined) {
384
+ (import.meta.env as any).MODE = originalMode;
385
+ }
364
386
  });
365
387
 
366
388
  it('uses fallback logging when database insert fails', async () => {
@@ -388,9 +410,9 @@ describe('RBACAuditManager', () => {
388
410
 
389
411
  await auditManager.emitPermissionCheck(event);
390
412
 
391
- // Verify fallback logging was called
392
- expect(consoleLogSpy).toHaveBeenCalledWith(
393
- '[RBAC Audit Fallback]',
413
+ // Verify fallback logging was called (logger.debug calls console.debug)
414
+ expect(consoleDebugSpy).toHaveBeenCalledWith(
415
+ expect.stringContaining('[RBAC Audit Fallback]'),
394
416
  expect.objectContaining({
395
417
  timestamp: expect.any(String),
396
418
  event: expect.objectContaining({
@@ -399,8 +421,7 @@ describe('RBACAuditManager', () => {
399
421
  organisationId: 'org-456',
400
422
  permission: 'read:users'
401
423
  }),
402
- error: 'Database connection failed',
403
- note: 'Database audit logging failed, using console fallback'
424
+ error: 'Database connection failed'
404
425
  })
405
426
  );
406
427
  });
@@ -421,9 +442,9 @@ describe('RBACAuditManager', () => {
421
442
 
422
443
  await auditManager.emitPermissionCheck(event);
423
444
 
424
- // Verify fallback logging was called
425
- expect(consoleLogSpy).toHaveBeenCalledWith(
426
- '[RBAC Audit Fallback]',
445
+ // Verify fallback logging was called (logger.debug calls console.debug)
446
+ expect(consoleDebugSpy).toHaveBeenCalledWith(
447
+ expect.stringContaining('[RBAC Audit Fallback]'),
427
448
  expect.objectContaining({
428
449
  timestamp: expect.any(String),
429
450
  event: expect.objectContaining({
@@ -435,8 +456,7 @@ describe('RBACAuditManager', () => {
435
456
  source: 'api',
436
457
  duration_ms: 100
437
458
  }),
438
- error: 'Network error', // Error is converted to string message
439
- note: 'Database audit logging failed, using console fallback'
459
+ error: 'Network error' // Error is converted to string message
440
460
  })
441
461
  );
442
462
  });
@@ -467,9 +487,9 @@ describe('RBACAuditManager', () => {
467
487
  await auditManager.emitPermissionCheck(event);
468
488
 
469
489
  // Verify fallback logging was NOT called
470
- expect(consoleLogSpy).not.toHaveBeenCalled();
490
+ expect(consoleDebugSpy).not.toHaveBeenCalled();
471
491
 
472
- // But warning should still be logged
492
+ // But warning should still be logged (logger.warn calls console.warn)
473
493
  expect(consoleWarnSpy).toHaveBeenCalled();
474
494
  });
475
495
 
@@ -499,8 +519,8 @@ describe('RBACAuditManager', () => {
499
519
 
500
520
  await auditManager.emitPermissionCheck(event);
501
521
 
502
- // Verify fallback logging was called after re-enabling
503
- expect(consoleLogSpy).toHaveBeenCalled();
522
+ // Verify fallback logging was called after re-enabling (logger.debug calls console.debug)
523
+ expect(consoleDebugSpy).toHaveBeenCalled();
504
524
  });
505
525
 
506
526
  it('fallback logging includes correct event data', async () => {
@@ -531,27 +551,29 @@ describe('RBACAuditManager', () => {
531
551
 
532
552
  await auditManager.emitPermissionCheck(event);
533
553
 
534
- const fallbackCall = consoleLogSpy.mock.calls[0];
535
- expect(fallbackCall[0]).toBe('[RBAC Audit Fallback]');
536
- expect(fallbackCall[1]).toMatchObject({
537
- event: {
538
- type: 'permission_check',
539
- userId: 'user-123',
540
- organisationId: 'org-456',
541
- eventId: 'event-789',
542
- appId: 'app-101',
543
- permission: 'read:users',
544
- decision: false,
545
- source: 'ui',
546
- bypass: true,
547
- duration_ms: 250,
548
- cache_hit: true,
549
- cache_source: 'memory',
550
- metadata: { test: 'data' }
551
- },
552
- error: 'Database error',
553
- note: 'Database audit logging failed, using console fallback'
554
- });
554
+ // Logger.debug formats the message, so we check the formatted string and the data object
555
+ expect(consoleDebugSpy).toHaveBeenCalledWith(
556
+ expect.stringContaining('[RBAC Audit Fallback]'),
557
+ expect.objectContaining({
558
+ timestamp: expect.any(String),
559
+ event: expect.objectContaining({
560
+ type: 'permission_check',
561
+ userId: 'user-123',
562
+ organisationId: 'org-456',
563
+ eventId: 'event-789',
564
+ appId: 'app-101',
565
+ permission: 'read:users',
566
+ decision: false,
567
+ source: 'ui',
568
+ bypass: true,
569
+ duration_ms: 250,
570
+ cache_hit: true,
571
+ cache_source: 'memory',
572
+ metadata: { test: 'data' }
573
+ }),
574
+ error: 'Database error'
575
+ })
576
+ );
555
577
  });
556
578
  });
557
579