@jmruthers/pace-core 0.5.134 → 0.5.136

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 (522) hide show
  1. package/dist/{DataTable-C7GaRZye.d.ts → DataTable-CWAZZcXC.d.ts} +1 -1
  2. package/dist/{DataTable-A36PJG6N.js → DataTable-CYOHOX3O.js} +25 -13
  3. package/dist/{PublicLoadingSpinner-CUAnTvcg.d.ts → EventLogo-801uofbR.d.ts} +51 -135
  4. package/dist/UnifiedAuthProvider-5E5TUNMS.js +17 -0
  5. package/dist/{UnifiedAuthProvider-BVKmQd9u.d.ts → UnifiedAuthProvider-DJxGTftH.d.ts} +1 -1
  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-CTJRBUX2.js → chunk-2TWNJ46Y.js} +2 -2
  9. package/dist/{chunk-UJI6WSMD.js → chunk-444EZN6N.js} +3 -3
  10. package/dist/chunk-444EZN6N.js.map +1 -0
  11. package/dist/{chunk-3CG5L6RN.js → chunk-4MT5BGGL.js} +90 -73
  12. package/dist/chunk-4MT5BGGL.js.map +1 -0
  13. package/dist/{chunk-PYUXFQJ3.js → chunk-56XJ3TU6.js} +2 -2
  14. package/dist/chunk-56XJ3TU6.js.map +1 -0
  15. package/dist/chunk-5DPZ5EAT.js +60 -0
  16. package/dist/chunk-5DPZ5EAT.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-APIBCTL2.js +670 -0
  20. package/dist/chunk-APIBCTL2.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-WP5I5GLN.js → chunk-BVYWGZVV.js} +112 -97
  24. package/dist/chunk-BVYWGZVV.js.map +1 -0
  25. package/dist/{chunk-GEVIB2UB.js → chunk-ERISIBYU.js} +14 -5
  26. package/dist/chunk-ERISIBYU.js.map +1 -0
  27. package/dist/{chunk-CQZU6TFE.js → chunk-FHWWBIHA.js} +100 -62
  28. package/dist/chunk-FHWWBIHA.js.map +1 -0
  29. package/dist/{chunk-O3NWNXDY.js → chunk-FMUCXFII.js} +2 -2
  30. package/dist/chunk-FMUCXFII.js.map +1 -0
  31. package/dist/{chunk-GVDR7WNV.js → chunk-HJGGOMQ6.js} +194 -518
  32. package/dist/chunk-HJGGOMQ6.js.map +1 -0
  33. package/dist/{chunk-BDZUMRBD.js → chunk-K2WWTH7O.js} +13 -6
  34. package/dist/chunk-K2WWTH7O.js.map +1 -0
  35. package/dist/{chunk-BYXRHAIF.js → chunk-L6PGMCMD.js} +23 -14
  36. package/dist/chunk-L6PGMCMD.js.map +1 -0
  37. package/dist/chunk-LMC26NLJ.js +84 -0
  38. package/dist/chunk-LMC26NLJ.js.map +1 -0
  39. package/dist/{chunk-M6DDYFUD.js → chunk-LS353YLY.js} +19 -16
  40. package/dist/chunk-LS353YLY.js.map +1 -0
  41. package/dist/{chunk-ZYZCRSBD.js → chunk-LTV3XIJJ.js} +16 -11
  42. package/dist/chunk-LTV3XIJJ.js.map +1 -0
  43. package/dist/{chunk-HMNOSGVA.js → chunk-NOHEVYVX.js} +377 -666
  44. package/dist/chunk-NOHEVYVX.js.map +1 -0
  45. package/dist/{chunk-JCQZ6LA7.js → chunk-Q5QRDWKI.js} +9 -3
  46. package/dist/chunk-Q5QRDWKI.js.map +1 -0
  47. package/dist/chunk-S5OFRT4M.js +94 -0
  48. package/dist/chunk-S5OFRT4M.js.map +1 -0
  49. package/dist/{chunk-3DBFLLLU.js → chunk-SBVILCCA.js} +14 -9
  50. package/dist/chunk-SBVILCCA.js.map +1 -0
  51. package/dist/{chunk-TGIY2AR2.js → chunk-SL2YQDR6.js} +4 -3
  52. package/dist/{chunk-TGIY2AR2.js.map → chunk-SL2YQDR6.js.map} +1 -1
  53. package/dist/{chunk-VZ5OR6HD.js → chunk-TVYPTYOY.js} +55 -179
  54. package/dist/chunk-TVYPTYOY.js.map +1 -0
  55. package/dist/{chunk-ZV77RZMU.js → chunk-XARJS7CD.js} +2 -2
  56. package/dist/chunk-XDNLUEXI.js +138 -0
  57. package/dist/chunk-XDNLUEXI.js.map +1 -0
  58. package/dist/{chunk-F64FFPOZ.js → chunk-YLKIDTUK.js} +26 -20
  59. package/dist/chunk-YLKIDTUK.js.map +1 -0
  60. package/dist/{chunk-5F3NDPJV.js → chunk-ZZ2SS7NI.js} +10 -5
  61. package/dist/chunk-ZZ2SS7NI.js.map +1 -0
  62. package/dist/components.d.ts +7 -287
  63. package/dist/components.js +26 -157
  64. package/dist/components.js.map +1 -1
  65. package/dist/{file-reference-C9isKNPn.d.ts → file-reference-C6Gkn77H.d.ts} +1 -1
  66. package/dist/{formatting-DFcCxUEk.d.ts → formatting-CvUXy2mF.d.ts} +1 -1
  67. package/dist/hooks.d.ts +3 -3
  68. package/dist/hooks.js +22 -16
  69. package/dist/hooks.js.map +1 -1
  70. package/dist/index.d.ts +219 -9
  71. package/dist/index.js +49 -31
  72. package/dist/index.js.map +1 -1
  73. package/dist/providers.d.ts +1 -1
  74. package/dist/providers.js +5 -4
  75. package/dist/rbac/index.js +13 -12
  76. package/dist/styles/index.js +2 -1
  77. package/dist/theming/runtime.d.ts +2 -19
  78. package/dist/theming/runtime.js +2 -1
  79. package/dist/{types-D5rqZQXk.d.ts → types-Dfz9dmVH.d.ts} +12 -1
  80. package/dist/types.d.ts +2 -2
  81. package/dist/types.js +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 +195 -232
  85. package/dist/utils.js +173 -331
  86. package/dist/utils.js.map +1 -1
  87. package/dist/{validation-DnhrNMju.d.ts → validation-8npbysjg.d.ts} +26 -8
  88. package/dist/validation.d.ts +261 -10
  89. package/dist/validation.js +82 -440
  90. package/dist/validation.js.map +1 -1
  91. package/docs/api/classes/ColumnFactory.md +1 -1
  92. package/docs/api/classes/ErrorBoundary.md +6 -6
  93. package/docs/api/classes/InvalidScopeError.md +1 -1
  94. package/docs/api/classes/MissingUserContextError.md +1 -1
  95. package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
  96. package/docs/api/classes/PermissionDeniedError.md +1 -1
  97. package/docs/api/classes/PublicErrorBoundary.md +1 -1
  98. package/docs/api/classes/RBACAuditManager.md +6 -6
  99. package/docs/api/classes/RBACCache.md +1 -1
  100. package/docs/api/classes/RBACEngine.md +7 -7
  101. package/docs/api/classes/RBACError.md +1 -1
  102. package/docs/api/classes/RBACNotInitializedError.md +1 -1
  103. package/docs/api/classes/SecureSupabaseClient.md +1 -1
  104. package/docs/api/classes/StorageUtils.md +1 -1
  105. package/docs/api/enums/FileCategory.md +1 -1
  106. package/docs/api/interfaces/AggregateConfig.md +4 -4
  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 +3 -3
  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 +90 -0
  122. package/docs/api/interfaces/ExportOptions.md +126 -0
  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 +648 -212
  199. package/docs/api-reference/components.md +106 -26
  200. package/docs/architecture/README.md +0 -2
  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/examples/README.md +30 -14
  205. package/examples/STRUCTURE.md +125 -0
  206. package/examples/components/DataTable/HierarchicalActionsExample.tsx +421 -0
  207. package/examples/components/DataTable/HierarchicalExample.tsx +475 -0
  208. package/examples/components/DataTable/InitialPageSizeExample.tsx +177 -0
  209. package/examples/components/DataTable/PerformanceExample.tsx +506 -0
  210. package/examples/components/DataTable/index.ts +13 -0
  211. package/examples/components/Dialog/BasicHtmlTest.tsx +55 -0
  212. package/examples/components/Dialog/DebugHtmlExample.tsx +68 -0
  213. package/examples/components/Dialog/HtmlDialogExample.tsx +202 -0
  214. package/examples/components/Dialog/ScrollableDialogExample.tsx +290 -0
  215. package/examples/components/Dialog/SimpleHtmlTest.tsx +61 -0
  216. package/examples/components/Dialog/SmartDialogExample.tsx +322 -0
  217. package/examples/components/Dialog/index.ts +15 -0
  218. package/examples/components/index.ts +11 -0
  219. package/examples/features/index.ts +12 -0
  220. package/examples/{public-pages → features/public-pages}/CorrectPublicPageImplementation.tsx +1 -1
  221. package/examples/{public-pages → features/public-pages}/PublicEventPage.tsx +1 -1
  222. package/examples/{public-pages → features/public-pages}/PublicPageApp.tsx +1 -1
  223. package/examples/{public-pages → features/public-pages}/PublicPageUsageExample.tsx +1 -1
  224. package/examples/index.ts +11 -3
  225. package/package.json +30 -10
  226. package/src/components/Alert/Alert.tsx +1 -1
  227. package/src/components/Avatar/Avatar.tsx +1 -1
  228. package/src/components/Button/Button.tsx +1 -1
  229. package/src/components/Card/Card.tsx +1 -1
  230. package/src/components/Checkbox/Checkbox.tsx +1 -1
  231. package/src/components/DataTable/DataTable.test.tsx +1 -1
  232. package/src/components/DataTable/DataTable.tsx +1 -30
  233. package/src/components/DataTable/__tests__/DataTable.grouping-aggregation.test.tsx +562 -0
  234. package/src/components/DataTable/__tests__/styles.test.ts +2 -2
  235. package/src/components/DataTable/components/ActionButtons.tsx +0 -15
  236. package/src/components/DataTable/components/DataTableCore.tsx +4 -185
  237. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +1 -1
  238. package/src/components/DataTable/components/DataTableModals.tsx +1 -27
  239. package/src/components/DataTable/components/EditableRow.tsx +1 -1
  240. package/src/components/DataTable/components/ImportModal.tsx +2 -14
  241. package/src/components/DataTable/components/PaginationControls.tsx +1 -1
  242. package/src/components/DataTable/components/UnifiedTableBody.tsx +109 -82
  243. package/src/components/DataTable/components/__tests__/ActionButtons.test.tsx +1 -1
  244. package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +1 -1
  245. package/src/components/DataTable/components/__tests__/DataTableModals.test.tsx +1 -1
  246. package/src/components/DataTable/components/__tests__/ImportModal.test.tsx +1 -1
  247. package/src/components/DataTable/examples/GroupingAggregationExample.tsx +273 -0
  248. package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +1 -1
  249. package/src/components/DataTable/examples/__tests__/HierarchicalActionsExample.test.tsx +1 -1
  250. package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +1 -1
  251. package/src/components/DataTable/hooks/useColumnVisibilityPersistence.ts +1 -1
  252. package/src/components/DataTable/hooks/useDataTablePermissions.ts +2 -23
  253. package/src/components/DataTable/index.ts +4 -0
  254. package/src/components/DataTable/styles.ts +1 -1
  255. package/src/components/DataTable/types.ts +13 -0
  256. package/src/components/DataTable/utils/__tests__/exportUtils.test.ts +1 -1
  257. package/src/components/DataTable/utils/aggregationUtils.ts +161 -0
  258. package/src/components/DataTable/utils/exportUtils.ts +1 -1
  259. package/src/components/DataTable/utils/flexibleImport.ts +1 -11
  260. package/src/components/DataTable/utils/index.ts +1 -0
  261. package/src/components/DataTable/utils/paginationUtils.ts +1 -1
  262. package/src/components/Dialog/Dialog.tsx +2 -2
  263. package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +35 -7
  264. package/src/components/ErrorBoundary/ErrorBoundary.tsx +5 -4
  265. package/src/components/EventSelector/EventSelector.tsx +3 -2
  266. package/src/components/FileDisplay/FileDisplay.tsx +2 -36
  267. package/src/components/FileUpload/FileUpload.test.tsx +2 -2
  268. package/src/components/FileUpload/FileUpload.tsx +2 -2
  269. package/src/components/Footer/Footer.tsx +1 -1
  270. package/src/components/Form/Form.test.tsx +4 -509
  271. package/src/components/Form/Form.tsx +1 -1
  272. package/src/components/Form/FormField.tsx +1 -1
  273. package/src/components/Form/index.ts +0 -12
  274. package/src/components/Header/Header.tsx +1 -1
  275. package/src/components/Input/Input.tsx +1 -1
  276. package/src/components/Label/Label.tsx +1 -1
  277. package/src/components/LoginForm/LoginForm.tsx +1 -1
  278. package/src/components/NavigationMenu/NavigationMenu.test.tsx +19 -3
  279. package/src/components/NavigationMenu/NavigationMenu.tsx +9 -8
  280. package/src/components/OrganisationSelector/OrganisationSelector.tsx +4 -3
  281. package/src/components/PaceAppLayout/PaceAppLayout.tsx +14 -12
  282. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.integration.test.tsx +0 -16
  283. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.security.test.tsx +0 -1
  284. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.unit.test.tsx +0 -9
  285. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +35 -3
  286. package/src/components/PaceLoginPage/PaceLoginPage.tsx +13 -12
  287. package/src/components/PasswordReset/PasswordChangeForm.tsx +1 -1
  288. package/src/components/PasswordReset/index.ts +0 -2
  289. package/src/components/Progress/Progress.tsx +1 -1
  290. package/src/components/ProtectedRoute/ProtectedRoute.test.tsx +35 -8
  291. package/src/components/ProtectedRoute/ProtectedRoute.tsx +3 -2
  292. package/src/components/PublicLayout/PublicErrorBoundary.tsx +1 -1
  293. package/src/components/PublicLayout/PublicLoadingSpinner.tsx +1 -1
  294. package/src/components/PublicLayout/PublicPageContextChecker.tsx +44 -43
  295. package/src/components/PublicLayout/PublicPageFooter.tsx +1 -1
  296. package/src/components/PublicLayout/PublicPageHeader.tsx +1 -15
  297. package/src/components/PublicLayout/PublicPageProvider.tsx +3 -2
  298. package/src/components/PublicLayout/__tests__/PublicPageContextChecker.test.tsx +2 -0
  299. package/src/components/PublicLayout/index.ts +4 -2
  300. package/src/components/Select/Select.tsx +1 -1
  301. package/src/components/{SessionRestorationLoader.tsx → SessionRestorationLoader/SessionRestorationLoader.tsx} +3 -2
  302. package/src/components/SessionRestorationLoader/index.ts +3 -0
  303. package/src/components/Switch/Switch.tsx +1 -1
  304. package/src/components/Table/Table.tsx +1 -1
  305. package/src/components/Toast/Toast.tsx +1 -1
  306. package/src/components/Tooltip/Tooltip.tsx +1 -1
  307. package/src/components/index.ts +4 -10
  308. package/src/hooks/__tests__/hooks.integration.test.tsx +37 -22
  309. package/src/hooks/__tests__/useComponentPerformance.unit.test.tsx +33 -17
  310. package/src/hooks/__tests__/useDataTablePerformance.unit.test.ts +28 -3
  311. package/src/hooks/__tests__/useFileDisplay.unit.test.ts +36 -9
  312. package/src/hooks/__tests__/useInactivityTracker.unit.test.ts +26 -2
  313. package/src/hooks/__tests__/usePerformanceMonitor.unit.test.ts +19 -6
  314. package/src/hooks/__tests__/usePermissionCache.simple.test.ts +17 -4
  315. package/src/hooks/__tests__/usePermissionCache.unit.test.ts +17 -4
  316. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +26 -6
  317. package/src/hooks/__tests__/usePublicFileDisplay.test.ts +16 -6
  318. package/src/hooks/__tests__/useSecureDataAccess.unit.test.tsx +3 -3
  319. package/src/hooks/__tests__/useSessionRestoration.unit.test.tsx +17 -3
  320. package/src/hooks/public/usePublicEvent.ts +7 -6
  321. package/src/hooks/public/usePublicEventLogo.ts +7 -4
  322. package/src/hooks/public/usePublicFileDisplay.ts +6 -150
  323. package/src/hooks/useComponentPerformance.ts +4 -1
  324. package/src/hooks/useDataTablePerformance.ts +4 -3
  325. package/src/hooks/useEventTheme.test.ts +18 -5
  326. package/src/hooks/useEventTheme.ts +4 -1
  327. package/src/hooks/useEvents.ts +2 -0
  328. package/src/hooks/useFileDisplay.ts +9 -8
  329. package/src/hooks/useFileReference.ts +4 -1
  330. package/src/hooks/useFileUrl.ts +4 -1
  331. package/src/hooks/useInactivityTracker.ts +5 -4
  332. package/src/hooks/useOrganisationSecurity.test.ts +33 -12
  333. package/src/hooks/useOrganisationSecurity.ts +8 -7
  334. package/src/hooks/usePerformanceMonitor.ts +6 -3
  335. package/src/hooks/usePermissionCache.ts +13 -6
  336. package/src/hooks/useSecureDataAccess.test.ts +2 -2
  337. package/src/hooks/useSecureDataAccess.ts +9 -8
  338. package/src/hooks/useSessionRestoration.ts +4 -1
  339. package/src/hooks/useStorage.ts +4 -1
  340. package/src/index.ts +25 -8
  341. package/src/providers/services/AuthServiceProvider.tsx +3 -2
  342. package/src/providers/services/EventServiceProvider.tsx +2 -1
  343. package/src/providers/services/InactivityServiceProvider.tsx +2 -1
  344. package/src/providers/services/OrganisationServiceProvider.tsx +2 -1
  345. package/src/providers/services/UnifiedAuthProvider.tsx +4 -3
  346. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +22 -2
  347. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +24 -2
  348. package/src/rbac/__tests__/cache-invalidation.test.ts +20 -6
  349. package/src/rbac/api.ts +5 -2
  350. package/src/rbac/audit-enhanced.ts +6 -6
  351. package/src/rbac/audit.test.ts +60 -38
  352. package/src/rbac/audit.ts +8 -8
  353. package/src/rbac/cache-invalidation.ts +7 -4
  354. package/src/rbac/components/EnhancedNavigationMenu.tsx +11 -5
  355. package/src/rbac/components/NavigationGuard.tsx +7 -3
  356. package/src/rbac/components/NavigationProvider.tsx +6 -3
  357. package/src/rbac/components/PagePermissionGuard.tsx +28 -16
  358. package/src/rbac/components/PagePermissionProvider.tsx +4 -1
  359. package/src/rbac/components/PermissionEnforcer.tsx +9 -3
  360. package/src/rbac/components/RoleBasedRouter.tsx +3 -1
  361. package/src/rbac/components/SecureDataProvider.tsx +7 -3
  362. package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +87 -61
  363. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +83 -33
  364. package/src/rbac/components/__tests__/NavigationProvider.test.tsx +36 -13
  365. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +2 -2
  366. package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +22 -8
  367. package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +19 -6
  368. package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +43 -17
  369. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +42 -17
  370. package/src/rbac/engine.ts +15 -7
  371. package/src/rbac/hooks/usePermissions.ts +7 -3
  372. package/src/rbac/hooks/useResolvedScope.test.ts +2 -2
  373. package/src/rbac/hooks/useResolvedScope.ts +10 -7
  374. package/src/rbac/permissions.ts +5 -2
  375. package/src/rbac/security.test.ts +27 -16
  376. package/src/rbac/security.ts +5 -4
  377. package/src/services/AuthService.ts +22 -21
  378. package/src/services/EventService.ts +12 -12
  379. package/src/services/InactivityService.ts +5 -4
  380. package/src/services/OrganisationService.ts +26 -25
  381. package/src/services/__tests__/AuthService.test.ts +51 -19
  382. package/src/services/__tests__/EventService.test.ts +37 -5
  383. package/src/services/__tests__/InactivityService.test.ts +38 -4
  384. package/src/services/__tests__/OrganisationService.test.ts +3 -8
  385. package/src/services/base/BaseService.ts +3 -1
  386. package/src/theming/__tests__/runtime.test.ts +21 -12
  387. package/src/theming/parseEventColours.ts +5 -19
  388. package/src/theming/runtime.ts +8 -4
  389. package/src/types/validation.ts +2 -29
  390. package/src/utils/__tests__/appConfig.unit.test.ts +1 -1
  391. package/src/utils/__tests__/audit.unit.test.ts +1 -1
  392. package/src/utils/__tests__/auth-utils.unit.test.ts +1 -1
  393. package/src/utils/__tests__/bundleAnalysis.unit.test.ts +19 -19
  394. package/src/utils/__tests__/cn.unit.test.ts +1 -1
  395. package/src/utils/__tests__/debugLogger.test.ts +1 -1
  396. package/src/utils/__tests__/deviceFingerprint.unit.test.ts +1 -1
  397. package/src/utils/__tests__/dynamicUtils.unit.test.ts +1 -1
  398. package/src/utils/__tests__/formatting.unit.test.ts +1 -1
  399. package/src/utils/__tests__/lazyLoad.unit.test.tsx +1 -1
  400. package/src/utils/__tests__/logger.unit.test.ts +1 -1
  401. package/src/utils/__tests__/organisationContext.unit.test.ts +1 -1
  402. package/src/utils/__tests__/performanceBenchmark.test.ts +1 -1
  403. package/src/utils/__tests__/performanceBudgets.unit.test.ts +1 -1
  404. package/src/utils/__tests__/permissionTypes.unit.test.ts +1 -1
  405. package/src/utils/__tests__/permissionUtils.unit.test.ts +1 -1
  406. package/src/utils/__tests__/sanitization.unit.test.ts +1 -1
  407. package/src/utils/__tests__/schemaUtils.unit.test.ts +1 -1
  408. package/src/utils/__tests__/secureDataAccess.unit.test.ts +1 -1
  409. package/src/utils/__tests__/secureErrors.unit.test.ts +33 -15
  410. package/src/utils/__tests__/secureStorage.unit.test.ts +1 -1
  411. package/src/utils/__tests__/security.unit.test.ts +40 -18
  412. package/src/utils/__tests__/securityMonitor.unit.test.ts +1 -1
  413. package/src/utils/__tests__/sessionTracking.unit.test.ts +40 -29
  414. package/src/utils/__tests__/validationUtils.unit.test.ts +19 -6
  415. package/src/utils/{appIdResolver.test.ts → app/appIdResolver.test.ts} +28 -30
  416. package/src/utils/{appIdResolver.ts → app/appIdResolver.ts} +8 -5
  417. package/src/utils/{appNameResolver.test.ts → app/appNameResolver.test.ts} +1 -1
  418. package/src/utils/{appNameResolver.ts → app/appNameResolver.ts} +5 -1
  419. package/src/utils/{organisationContext.ts → context/organisationContext.ts} +6 -3
  420. package/src/utils/{sessionTracking.ts → context/sessionTracking.ts} +11 -12
  421. package/src/utils/{logger.ts → core/logger.ts} +4 -2
  422. package/src/utils/{deviceFingerprint.ts → device/deviceFingerprint.ts} +1 -1
  423. package/src/utils/{lazyLoad.tsx → dynamic/lazyLoad.tsx} +2 -2
  424. package/src/utils/{file-reference.test.ts → file-reference/__tests__/file-reference.test.ts} +5 -5
  425. package/src/utils/{file-reference.ts → file-reference/index.ts} +20 -38
  426. package/src/utils/index.ts +32 -54
  427. package/src/utils/{secureErrors.ts → security/secureErrors.ts} +6 -3
  428. package/src/utils/{security.ts → security/security.ts} +5 -2
  429. package/src/utils/storage/__tests__/helpers.unit.test.ts +1 -4
  430. package/src/utils/storage/helpers.ts +15 -8
  431. package/src/{components/Dialog/utils/__tests__/safeHtml.unit.test.ts → utils/validation/__tests__/htmlSanitization.unit.test.ts} +9 -15
  432. package/src/{validation → utils/validation}/csrf.ts +1 -1
  433. package/src/{components/Dialog/utils/safeHtml.ts → utils/validation/htmlSanitization.ts} +9 -10
  434. package/src/utils/validation/index.ts +79 -0
  435. package/src/utils/{sanitization.ts → validation/sanitization.ts} +71 -2
  436. package/src/{validation/schemaUtils.ts → utils/validation/schema.ts} +11 -6
  437. package/src/{validation → utils/validation}/sqlInjectionProtection.ts +2 -0
  438. package/src/utils/{validationUtils.ts → validation/validationUtils.ts} +4 -1
  439. package/src/validation/index.ts +3 -34
  440. package/dist/UnifiedAuthProvider-CQDZRJIS.js +0 -16
  441. package/dist/chunk-24MKLB7U.js +0 -81
  442. package/dist/chunk-24MKLB7U.js.map +0 -1
  443. package/dist/chunk-3CG5L6RN.js.map +0 -1
  444. package/dist/chunk-3DBFLLLU.js.map +0 -1
  445. package/dist/chunk-5F3NDPJV.js.map +0 -1
  446. package/dist/chunk-66C4BSAY.js.map +0 -1
  447. package/dist/chunk-BDZUMRBD.js.map +0 -1
  448. package/dist/chunk-BYXRHAIF.js.map +0 -1
  449. package/dist/chunk-CDQ3PX7L.js +0 -18
  450. package/dist/chunk-CDQ3PX7L.js.map +0 -1
  451. package/dist/chunk-CQZU6TFE.js.map +0 -1
  452. package/dist/chunk-F64FFPOZ.js.map +0 -1
  453. package/dist/chunk-GEVIB2UB.js.map +0 -1
  454. package/dist/chunk-GKHF54DI.js.map +0 -1
  455. package/dist/chunk-GVDR7WNV.js.map +0 -1
  456. package/dist/chunk-HMNOSGVA.js.map +0 -1
  457. package/dist/chunk-JCQZ6LA7.js.map +0 -1
  458. package/dist/chunk-M6DDYFUD.js.map +0 -1
  459. package/dist/chunk-O3NWNXDY.js.map +0 -1
  460. package/dist/chunk-PYUXFQJ3.js.map +0 -1
  461. package/dist/chunk-UJI6WSMD.js.map +0 -1
  462. package/dist/chunk-VZ5OR6HD.js.map +0 -1
  463. package/dist/chunk-WP5I5GLN.js.map +0 -1
  464. package/dist/chunk-ZYZCRSBD.js.map +0 -1
  465. package/src/components/Dialog/README.md +0 -804
  466. package/src/components/Form/FormErrorSummary.tsx +0 -113
  467. package/src/components/Form/FormFieldset.tsx +0 -127
  468. package/src/components/Form/FormLiveRegion.tsx +0 -198
  469. package/src/components/PasswordReset/PasswordResetForm.test.tsx +0 -597
  470. package/src/components/PasswordReset/PasswordResetForm.tsx +0 -201
  471. package/src/components/PublicLayout/PublicPageDebugger.tsx +0 -104
  472. package/src/components/PublicLayout/PublicPageDiagnostic.tsx +0 -162
  473. package/src/components/PublicLayout/__tests__/PublicPageDebugger.test.tsx +0 -185
  474. package/src/examples/CorrectPublicPageImplementation.tsx +0 -304
  475. package/src/examples/PublicEventPage.tsx +0 -287
  476. package/src/examples/PublicPageApp.tsx +0 -321
  477. package/src/examples/PublicPageUsageExample.tsx +0 -218
  478. package/src/utils/schemaUtils.ts +0 -37
  479. package/src/validation/__tests__/common.unit.test.ts +0 -101
  480. package/src/validation/__tests__/csrf.unit.test.ts +0 -365
  481. package/src/validation/__tests__/passwordSchema.unit.test.ts +0 -203
  482. package/src/validation/__tests__/sanitization.unit.test.ts +0 -250
  483. package/src/validation/__tests__/schemaUtils.unit.test.ts +0 -451
  484. package/src/validation/__tests__/sqlInjectionProtection.unit.test.ts +0 -462
  485. package/src/validation/__tests__/user.unit.test.ts +0 -440
  486. package/src/validation/sanitization.ts +0 -96
  487. /package/dist/{DataTable-A36PJG6N.js.map → DataTable-CYOHOX3O.js.map} +0 -0
  488. /package/dist/{UnifiedAuthProvider-CQDZRJIS.js.map → UnifiedAuthProvider-5E5TUNMS.js.map} +0 -0
  489. /package/dist/{api-TNIBJWLM.js.map → api-45XYYO2A.js.map} +0 -0
  490. /package/dist/{audit-T36HM7IM.js.map → audit-64X3VJXB.js.map} +0 -0
  491. /package/dist/{chunk-CTJRBUX2.js.map → chunk-2TWNJ46Y.js.map} +0 -0
  492. /package/dist/{chunk-ZV77RZMU.js.map → chunk-XARJS7CD.js.map} +0 -0
  493. /package/dist/{useInactivityTracker-MRUU55XI.js.map → useInactivityTracker-TO6ZOF35.js.map} +0 -0
  494. /package/examples/{public-pages → features/public-pages}/index.ts +0 -0
  495. /package/examples/{RBAC → features/rbac}/CompleteRBACExample.tsx +0 -0
  496. /package/examples/{RBAC → features/rbac}/EventBasedApp.tsx +0 -0
  497. /package/examples/{RBAC → features/rbac}/PermissionExample.tsx +0 -0
  498. /package/examples/{RBAC → features/rbac}/index.ts +0 -0
  499. /package/src/utils/{appConfig.ts → app/appConfig.ts} +0 -0
  500. /package/src/utils/{appNameResolver.simple.test.ts → app/appNameResolver.simple.test.ts} +0 -0
  501. /package/src/utils/{audit.ts → audit/audit.ts} +0 -0
  502. /package/src/utils/{organisationContext.test.ts → context/organisationContext.test.ts} +0 -0
  503. /package/src/utils/{cn.ts → core/cn.ts} +0 -0
  504. /package/src/utils/{debugLogger.ts → core/debugLogger.ts} +0 -0
  505. /package/src/utils/{dynamicUtils.ts → dynamic/dynamicUtils.ts} +0 -0
  506. /package/src/utils/{formatDate.test.ts → formatting/formatDate.test.ts} +0 -0
  507. /package/src/utils/{formatting.ts → formatting/formatting.ts} +0 -0
  508. /package/src/utils/{bundleAnalysis.ts → performance/bundleAnalysis.ts} +0 -0
  509. /package/src/utils/{performanceBenchmark.ts → performance/performanceBenchmark.ts} +0 -0
  510. /package/src/utils/{performanceBudgets.ts → performance/performanceBudgets.ts} +0 -0
  511. /package/src/utils/{permissionTypes.ts → permissions/permissionTypes.ts} +0 -0
  512. /package/src/utils/{permissionUtils.test.ts → permissions/permissionUtils.test.ts} +0 -0
  513. /package/src/utils/{permissionUtils.ts → permissions/permissionUtils.ts} +0 -0
  514. /package/src/utils/{auth-utils.ts → security/auth-utils.ts} +0 -0
  515. /package/src/utils/{secureDataAccess.test.ts → security/secureDataAccess.test.ts} +0 -0
  516. /package/src/utils/{secureDataAccess.ts → security/secureDataAccess.ts} +0 -0
  517. /package/src/utils/{secureStorage.ts → security/secureStorage.ts} +0 -0
  518. /package/src/utils/{securityMonitor.ts → security/securityMonitor.ts} +0 -0
  519. /package/src/{validation → utils/validation}/common.ts +0 -0
  520. /package/src/{validation → utils/validation}/passwordSchema.ts +0 -0
  521. /package/src/{validation → utils/validation}/user.ts +0 -0
  522. /package/src/utils/{validation.ts → validation/validation.ts} +0 -0
@@ -8,7 +8,7 @@
8
8
  */
9
9
 
10
10
  import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
11
- import { Logger, LogLevel, logger, createLogger, type LoggerConfig } from '../logger';
11
+ import { Logger, LogLevel, logger, createLogger, type LoggerConfig } from '../core/logger';
12
12
 
13
13
  describe('Logger Utility', () => {
14
14
  let consoleDebugSpy: ReturnType<typeof vi.spyOn>;
@@ -5,7 +5,7 @@ import {
5
5
  clearOrganisationContext,
6
6
  getOrganisationContext,
7
7
  isOrganisationContextAvailable
8
- } from '../organisationContext';
8
+ } from '../context/organisationContext';
9
9
 
10
10
  describe('organisationContext', () => {
11
11
  let mockSupabase: SupabaseClient;
@@ -12,7 +12,7 @@ import {
12
12
  createPerformanceBenchmark,
13
13
  measureRenderPerformance,
14
14
  type PerformanceMetrics
15
- } from '../performanceBenchmark';
15
+ } from '../performance/performanceBenchmark';
16
16
 
17
17
  describe('Performance Benchmark', () => {
18
18
  beforeEach(() => {
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
- import { performanceBudgetMonitor, PERFORMANCE_BUDGETS } from '../performanceBudgets';
2
+ import { performanceBudgetMonitor, PERFORMANCE_BUDGETS } from '../performance/performanceBudgets';
3
3
 
4
4
  describe('performanceBudgets', () => {
5
5
  let consoleSpy: {
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect } from 'vitest';
2
- import { PermissionType, parsePermission } from '../permissionTypes';
2
+ import { PermissionType, parsePermission } from '../permissions/permissionTypes';
3
3
 
4
4
  describe('permissionTypes', () => {
5
5
  describe('PermissionType enum', () => {
@@ -4,7 +4,7 @@ import {
4
4
  hasPermission,
5
5
  hasAnyPermission,
6
6
  hasAllPermissions
7
- } from '../permissionUtils';
7
+ } from '../permissions/permissionUtils';
8
8
 
9
9
  describe('permissionUtils', () => {
10
10
  describe('transformPermissionMapToBoolean', () => {
@@ -16,7 +16,7 @@ import {
16
16
  sanitizeFormData,
17
17
  generateCSPHeader,
18
18
  RateLimiter
19
- } from '../sanitization';
19
+ } from '../validation/sanitization';
20
20
  import { z } from 'zod';
21
21
 
22
22
  describe('Sanitization Utilities', () => {
@@ -1,6 +1,6 @@
1
1
  import { describe, it, expect } from 'vitest';
2
2
  import { z } from 'zod';
3
- import { pickSchema, combineSchemas } from '../schemaUtils';
3
+ import { pickSchema, combineSchemas } from '../validation/schema';
4
4
 
5
5
  describe('schemaUtils', () => {
6
6
  describe('pickSchema', () => {
@@ -6,7 +6,7 @@
6
6
  */
7
7
 
8
8
  import { describe, it, expect, vi, beforeEach } from 'vitest';
9
- import { createSecureDataAccess } from '../secureDataAccess';
9
+ import { createSecureDataAccess } from '../security/secureDataAccess';
10
10
  import type { SupabaseClient } from '@supabase/supabase-js';
11
11
  import { testDataGenerators } from '../../__tests__/helpers/test-utils';
12
12
 
@@ -14,9 +14,23 @@ import {
14
14
  sanitizeError,
15
15
  generateRequestId,
16
16
  logSecurityEvent
17
- } from '../secureErrors';
17
+ } from '../security/secureErrors';
18
18
  import { AuthErrorCode } from '../../types/unified';
19
19
 
20
+ // Mock the Logger module
21
+ vi.mock('../core/logger', () => {
22
+ const mockLoggerInstance = {
23
+ warn: vi.fn(),
24
+ };
25
+ return {
26
+ createLogger: vi.fn(() => mockLoggerInstance),
27
+ };
28
+ });
29
+
30
+ // Get the mock instance after mock is set up
31
+ import { createLogger } from '../core/logger';
32
+ const getMockLogger = () => createLogger('test');
33
+
20
34
  describe('Secure Errors', () => {
21
35
  describe('SecureError', () => {
22
36
  it('should create a SecureError with all properties', () => {
@@ -288,50 +302,54 @@ describe('Secure Errors', () => {
288
302
 
289
303
  describe('logSecurityEvent', () => {
290
304
  it('should log security events', () => {
291
- const consoleSpy = vi.spyOn(console, 'warn');
305
+ vi.clearAllMocks();
292
306
 
293
307
  logSecurityEvent('Test security event');
294
308
 
295
- expect(consoleSpy).toHaveBeenCalledWith(
296
- '[SECURITY] Test security event',
309
+ const logger = getMockLogger();
310
+ expect(vi.mocked(logger.warn)).toHaveBeenCalledWith(
311
+ 'Security event: Test security event',
297
312
  undefined
298
313
  );
299
314
  });
300
315
 
301
316
  it('should log security events with details', () => {
302
- const consoleSpy = vi.spyOn(console, 'warn');
317
+ vi.clearAllMocks();
303
318
  const details = { userId: 'user-123', action: 'login_attempt' };
304
319
 
305
320
  logSecurityEvent('Test security event', details);
306
321
 
307
- expect(consoleSpy).toHaveBeenCalledWith(
308
- '[SECURITY] Test security event',
322
+ const logger = getMockLogger();
323
+ expect(vi.mocked(logger.warn)).toHaveBeenCalledWith(
324
+ 'Security event: Test security event',
309
325
  details
310
326
  );
311
327
  });
312
328
 
313
329
  it('should handle multiple security events', () => {
314
- const consoleSpy = vi.spyOn(console, 'warn');
330
+ vi.clearAllMocks();
315
331
 
316
332
  logSecurityEvent('Event 1');
317
333
  logSecurityEvent('Event 2', { detail: 'test' });
318
334
 
319
- expect(consoleSpy).toHaveBeenCalledTimes(2);
335
+ const logger = getMockLogger();
336
+ expect(vi.mocked(logger.warn)).toHaveBeenCalledTimes(2);
320
337
  });
321
338
 
322
339
  it('should handle null and undefined details', () => {
323
- const consoleSpy = vi.spyOn(console, 'warn');
340
+ vi.clearAllMocks();
324
341
 
325
342
  logSecurityEvent('Event with null details', null);
326
343
  logSecurityEvent('Event with undefined details', undefined);
327
344
 
328
- expect(consoleSpy).toHaveBeenCalledTimes(2);
329
- expect(consoleSpy).toHaveBeenCalledWith(
330
- '[SECURITY] Event with null details',
345
+ const logger = getMockLogger();
346
+ expect(vi.mocked(logger.warn)).toHaveBeenCalledTimes(2);
347
+ expect(vi.mocked(logger.warn)).toHaveBeenCalledWith(
348
+ 'Security event: Event with null details',
331
349
  null
332
350
  );
333
- expect(consoleSpy).toHaveBeenCalledWith(
334
- '[SECURITY] Event with undefined details',
351
+ expect(vi.mocked(logger.warn)).toHaveBeenCalledWith(
352
+ 'Security event: Event with undefined details',
335
353
  undefined
336
354
  );
337
355
  });
@@ -6,7 +6,7 @@
6
6
  */
7
7
 
8
8
  import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
9
- import { secureStorage } from '../secureStorage';
9
+ import { secureStorage } from '../security/secureStorage';
10
10
 
11
11
  // Mock localStorage
12
12
  const mockLocalStorage = {
@@ -8,32 +8,49 @@ import {
8
8
  validateSecurityHeaders,
9
9
  generateDeviceFingerprint,
10
10
  validateDeviceFingerprint
11
- } from '../security';
11
+ } from '../security/security';
12
+
13
+ // Mock the Logger module
14
+ vi.mock('../core/logger', () => {
15
+ const mockLoggerInstance = {
16
+ warn: vi.fn(),
17
+ };
18
+ return {
19
+ createLogger: vi.fn(() => mockLoggerInstance),
20
+ };
21
+ });
22
+
23
+ // Get the mock instance after mock is set up
24
+ import { createLogger } from '../core/logger';
25
+ const getMockLogger = () => createLogger('test');
12
26
 
13
27
  describe('Security Utils', () => {
14
28
  beforeEach(() => {
15
29
  vi.restoreAllMocks();
16
30
  });
17
31
 
18
- it('logSecurityEvent logs to console.warn', () => {
19
- const spy = vi.spyOn(console, 'warn').mockImplementation(() => {});
32
+ it('logSecurityEvent logs to Logger', () => {
33
+ vi.clearAllMocks();
20
34
  const event = { type: 'test', timestamp: new Date(), details: { foo: 1 } };
21
35
  logSecurityEvent(event);
22
- expect(spy).toHaveBeenCalledWith('[SECURITY EVENT]', expect.objectContaining({ type: 'test', details: { foo: 1 }, timestamp: event.timestamp.toISOString() }));
36
+ const logger = getMockLogger();
37
+ expect(vi.mocked(logger.warn)).toHaveBeenCalledWith('Security event:', expect.objectContaining({ type: 'test', details: { foo: 1 }, timestamp: event.timestamp.toISOString() }));
23
38
  });
24
39
 
25
40
  it('validateUserSession returns false and logs for invalid userId', async () => {
26
- const spy = vi.spyOn(console, 'warn').mockImplementation(() => {});
41
+ vi.clearAllMocks();
27
42
  const result = await validateUserSession('', 'sometoken');
28
43
  expect(result).toBe(false);
29
- expect(spy).toHaveBeenCalledWith('[SECURITY EVENT]', expect.objectContaining({ type: 'invalid_session_validation' }));
44
+ const logger = getMockLogger();
45
+ expect(vi.mocked(logger.warn)).toHaveBeenCalledWith('Security event:', expect.objectContaining({ type: 'invalid_session_validation' }));
30
46
  });
31
47
 
32
48
  it('validateUserSession returns false and logs for short sessionToken', async () => {
33
- const spy = vi.spyOn(console, 'warn').mockImplementation(() => {});
49
+ vi.clearAllMocks();
34
50
  const result = await validateUserSession('user1', 'short');
35
51
  expect(result).toBe(false);
36
- expect(spy).toHaveBeenCalledWith('[SECURITY EVENT]', expect.objectContaining({ type: 'suspicious_session_token' }));
52
+ const logger = getMockLogger();
53
+ expect(vi.mocked(logger.warn)).toHaveBeenCalledWith('Security event:', expect.objectContaining({ type: 'suspicious_session_token' }));
37
54
  });
38
55
 
39
56
  it('validateUserSession returns true for valid input', async () => {
@@ -42,19 +59,21 @@ describe('Security Utils', () => {
42
59
  });
43
60
 
44
61
  it('createSecureSession returns a session ID and logs', async () => {
45
- const spy = vi.spyOn(console, 'warn').mockImplementation(() => {});
62
+ vi.clearAllMocks();
46
63
  const fakeClient = {} as any;
47
64
  const sessionId = await createSecureSession(fakeClient, { userId: 'user1', deviceFingerprint: 'abc' });
48
65
  expect(typeof sessionId).toBe('string');
49
66
  expect(sessionId).toMatch(/^sess_/);
50
- expect(spy).toHaveBeenCalledWith('[SECURITY EVENT]', expect.objectContaining({ type: 'session_created' }));
67
+ const logger = getMockLogger();
68
+ expect(vi.mocked(logger.warn)).toHaveBeenCalledWith('Security event:', expect.objectContaining({ type: 'session_created' }));
51
69
  });
52
70
 
53
71
  it('invalidateSession logs and resolves', async () => {
54
- const spy = vi.spyOn(console, 'warn').mockImplementation(() => {});
72
+ vi.clearAllMocks();
55
73
  const fakeClient = {} as any;
56
74
  await expect(invalidateSession(fakeClient, 'sess_123')).resolves.toBeUndefined();
57
- expect(spy).toHaveBeenCalledWith('[SECURITY EVENT]', expect.objectContaining({ type: 'session_invalidated' }));
75
+ const logger = getMockLogger();
76
+ expect(vi.mocked(logger.warn)).toHaveBeenCalledWith('Security event:', expect.objectContaining({ type: 'session_invalidated' }));
58
77
  });
59
78
 
60
79
  it('getSecurityHeaders returns required headers', () => {
@@ -72,10 +91,11 @@ describe('Security Utils', () => {
72
91
  });
73
92
 
74
93
  it('validateSecurityHeaders returns false and logs for missing headers', () => {
75
- const spy = vi.spyOn(console, 'warn').mockImplementation(() => {});
94
+ vi.clearAllMocks();
76
95
  const headers = { 'X-Content-Type-Options': 'nosniff' };
77
96
  expect(validateSecurityHeaders(headers)).toBe(false);
78
- expect(spy).toHaveBeenCalledWith('[SECURITY EVENT]', expect.objectContaining({ type: 'missing_security_headers' }));
97
+ const logger = getMockLogger();
98
+ expect(vi.mocked(logger.warn)).toHaveBeenCalledWith('Security event:', expect.objectContaining({ type: 'missing_security_headers' }));
79
99
  });
80
100
 
81
101
  it('generateDeviceFingerprint returns a string', () => {
@@ -114,14 +134,16 @@ describe('Security Utils', () => {
114
134
  });
115
135
 
116
136
  it('validateDeviceFingerprint returns false and logs for invalid input', () => {
117
- const spy = vi.spyOn(console, 'warn').mockImplementation(() => {});
137
+ vi.clearAllMocks();
118
138
  expect(validateDeviceFingerprint('', 'abc')).toBe(false);
119
- expect(spy).toHaveBeenCalledWith('[SECURITY EVENT]', expect.objectContaining({ type: 'invalid_device_fingerprint' }));
139
+ const logger = getMockLogger();
140
+ expect(vi.mocked(logger.warn)).toHaveBeenCalledWith('Security event:', expect.objectContaining({ type: 'invalid_device_fingerprint' }));
120
141
  });
121
142
 
122
143
  it('validateDeviceFingerprint returns false and logs for mismatch', () => {
123
- const spy = vi.spyOn(console, 'warn').mockImplementation(() => {});
144
+ vi.clearAllMocks();
124
145
  expect(validateDeviceFingerprint('abc', 'def')).toBe(false);
125
- expect(spy).toHaveBeenCalledWith('[SECURITY EVENT]', expect.objectContaining({ type: 'device_fingerprint_mismatch' }));
146
+ const logger = getMockLogger();
147
+ expect(vi.mocked(logger.warn)).toHaveBeenCalledWith('Security event:', expect.objectContaining({ type: 'device_fingerprint_mismatch' }));
126
148
  });
127
149
  });
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
- import { securityMonitor } from '../securityMonitor';
2
+ import { securityMonitor } from '../security/securityMonitor';
3
3
 
4
4
  describe('securityMonitor', () => {
5
5
  beforeEach(() => {
@@ -1,22 +1,27 @@
1
1
  import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
2
  import type { SupabaseClient } from '@supabase/supabase-js';
3
3
 
4
- describe('sessionTracking', () => {
5
- let consoleSpy: {
6
- log: ReturnType<typeof vi.spyOn>;
7
- warn: ReturnType<typeof vi.spyOn>;
8
- error: ReturnType<typeof vi.spyOn>;
4
+ // Mock the Logger module
5
+ vi.mock('../core/logger', () => {
6
+ const mockLoggerInstance = {
7
+ warn: vi.fn(),
8
+ error: vi.fn(),
9
+ };
10
+ return {
11
+ createLogger: vi.fn(() => mockLoggerInstance),
9
12
  };
13
+ });
14
+
15
+ // Get the mock instance after mock is set up
16
+ import { createLogger } from '../core/logger';
17
+ const getMockLogger = () => createLogger('test');
18
+
19
+ describe('sessionTracking', () => {
10
20
  let mockSupabase: SupabaseClient;
11
21
  let trackingFunctions: any;
12
22
 
13
23
  beforeEach(() => {
14
- // Mock console methods before each test
15
- consoleSpy = {
16
- log: vi.spyOn(console, 'log').mockImplementation(() => {}),
17
- warn: vi.spyOn(console, 'warn').mockImplementation(() => {}),
18
- error: vi.spyOn(console, 'error').mockImplementation(() => {})
19
- };
24
+ vi.clearAllMocks();
20
25
 
21
26
  // Create a mock Supabase client
22
27
  mockSupabase = {
@@ -37,7 +42,7 @@ describe('sessionTracking', () => {
37
42
  mockSupabase.rpc = mockRpc;
38
43
 
39
44
  vi.resetModules();
40
- const { useSessionTracking } = await import('../sessionTracking');
45
+ const { useSessionTracking } = await import('../context/sessionTracking');
41
46
  trackingFunctions = useSessionTracking(mockSupabase, 'test-app');
42
47
 
43
48
  await trackingFunctions.trackEventSwitch('event-456');
@@ -50,7 +55,7 @@ describe('sessionTracking', () => {
50
55
  p_ip_address: undefined,
51
56
  p_user_agent: undefined
52
57
  });
53
- expect(consoleSpy.log).toHaveBeenCalledWith('Event switch session tracked successfully');
58
+ // Success messages were removed - no logging needed for successful operations
54
59
  });
55
60
 
56
61
  it('should handle no authenticated user', async () => {
@@ -58,12 +63,13 @@ describe('sessionTracking', () => {
58
63
  mockSupabase.auth.getUser = mockGetUser;
59
64
 
60
65
  vi.resetModules();
61
- const { useSessionTracking } = await import('../sessionTracking');
66
+ const { useSessionTracking } = await import('../context/sessionTracking');
62
67
  trackingFunctions = useSessionTracking(mockSupabase, 'test-app');
63
68
 
64
69
  await trackingFunctions.trackEventSwitch('event-456');
65
70
 
66
- expect(consoleSpy.warn).toHaveBeenCalledWith('No authenticated user found for session tracking');
71
+ const logger = getMockLogger();
72
+ expect(vi.mocked(logger.warn)).toHaveBeenCalledWith('No authenticated user found for session tracking');
67
73
  });
68
74
 
69
75
  it('should handle tracking error', async () => {
@@ -75,12 +81,13 @@ describe('sessionTracking', () => {
75
81
  mockSupabase.rpc = mockRpc;
76
82
 
77
83
  vi.resetModules();
78
- const { useSessionTracking } = await import('../sessionTracking');
84
+ const { useSessionTracking } = await import('../context/sessionTracking');
79
85
  trackingFunctions = useSessionTracking(mockSupabase, 'test-app');
80
86
 
81
87
  await trackingFunctions.trackEventSwitch('event-456');
82
88
 
83
- expect(consoleSpy.error).toHaveBeenCalledWith('Failed to track event switch session:', { message: 'Database error' });
89
+ const logger = getMockLogger();
90
+ expect(vi.mocked(logger.error)).toHaveBeenCalledWith('Failed to track event switch session:', { message: 'Database error' });
84
91
  });
85
92
 
86
93
  it('should handle unexpected errors', async () => {
@@ -88,12 +95,13 @@ describe('sessionTracking', () => {
88
95
  mockSupabase.auth.getUser = mockGetUser;
89
96
 
90
97
  vi.resetModules();
91
- const { useSessionTracking } = await import('../sessionTracking');
98
+ const { useSessionTracking } = await import('../context/sessionTracking');
92
99
  trackingFunctions = useSessionTracking(mockSupabase, 'test-app');
93
100
 
94
101
  await trackingFunctions.trackEventSwitch('event-456');
95
102
 
96
- expect(consoleSpy.error).toHaveBeenCalledWith('Failed to track event switch:', expect.any(Error));
103
+ const logger = getMockLogger();
104
+ expect(vi.mocked(logger.error)).toHaveBeenCalledWith('Failed to track event switch:', expect.any(Error));
97
105
  });
98
106
  });
99
107
 
@@ -107,7 +115,7 @@ describe('sessionTracking', () => {
107
115
  mockSupabase.rpc = mockRpc;
108
116
 
109
117
  vi.resetModules();
110
- const { useSessionTracking } = await import('../sessionTracking');
118
+ const { useSessionTracking } = await import('../context/sessionTracking');
111
119
  trackingFunctions = useSessionTracking(mockSupabase, 'test-app');
112
120
 
113
121
  await trackingFunctions.trackSessionExpired();
@@ -120,7 +128,7 @@ describe('sessionTracking', () => {
120
128
  p_ip_address: undefined,
121
129
  p_user_agent: undefined
122
130
  });
123
- expect(consoleSpy.log).toHaveBeenCalledWith('Session expiration tracked successfully');
131
+ // Success messages were removed - no logging needed for successful operations
124
132
  });
125
133
 
126
134
  it('should handle no authenticated user', async () => {
@@ -128,12 +136,13 @@ describe('sessionTracking', () => {
128
136
  mockSupabase.auth.getUser = mockGetUser;
129
137
 
130
138
  vi.resetModules();
131
- const { useSessionTracking } = await import('../sessionTracking');
139
+ const { useSessionTracking } = await import('../context/sessionTracking');
132
140
  trackingFunctions = useSessionTracking(mockSupabase, 'test-app');
133
141
 
134
142
  await trackingFunctions.trackSessionExpired();
135
143
 
136
- expect(consoleSpy.warn).toHaveBeenCalledWith('No authenticated user found for session tracking');
144
+ const logger = getMockLogger();
145
+ expect(vi.mocked(logger.warn)).toHaveBeenCalledWith('No authenticated user found for session tracking');
137
146
  });
138
147
 
139
148
  it('should handle tracking error', async () => {
@@ -145,12 +154,13 @@ describe('sessionTracking', () => {
145
154
  mockSupabase.rpc = mockRpc;
146
155
 
147
156
  vi.resetModules();
148
- const { useSessionTracking } = await import('../sessionTracking');
157
+ const { useSessionTracking } = await import('../context/sessionTracking');
149
158
  trackingFunctions = useSessionTracking(mockSupabase, 'test-app');
150
159
 
151
160
  await trackingFunctions.trackSessionExpired();
152
161
 
153
- expect(consoleSpy.error).toHaveBeenCalledWith('Failed to track session expiration:', { message: 'Database error' });
162
+ const logger = getMockLogger();
163
+ expect(vi.mocked(logger.error)).toHaveBeenCalledWith('Failed to track session expiration:', { message: 'Database error' });
154
164
  });
155
165
 
156
166
  it('should handle unexpected errors', async () => {
@@ -158,19 +168,20 @@ describe('sessionTracking', () => {
158
168
  mockSupabase.auth.getUser = mockGetUser;
159
169
 
160
170
  vi.resetModules();
161
- const { useSessionTracking } = await import('../sessionTracking');
171
+ const { useSessionTracking } = await import('../context/sessionTracking');
162
172
  trackingFunctions = useSessionTracking(mockSupabase, 'test-app');
163
173
 
164
174
  await trackingFunctions.trackSessionExpired();
165
175
 
166
- expect(consoleSpy.error).toHaveBeenCalledWith('Failed to track session expiration:', expect.any(Error));
176
+ const logger = getMockLogger();
177
+ expect(vi.mocked(logger.error)).toHaveBeenCalledWith('Failed to track session expiration:', expect.any(Error));
167
178
  });
168
179
  });
169
180
 
170
181
  describe('useSessionTracking without app name', () => {
171
182
  it('should work without app name parameter', async () => {
172
183
  vi.resetModules();
173
- const { useSessionTracking } = await import('../sessionTracking');
184
+ const { useSessionTracking } = await import('../context/sessionTracking');
174
185
  const trackingWithoutApp = useSessionTracking(mockSupabase);
175
186
 
176
187
  expect(trackingWithoutApp).toHaveProperty('trackEventSwitch');
@@ -189,7 +200,7 @@ describe('sessionTracking', () => {
189
200
  mockSupabase.rpc = mockRpc;
190
201
 
191
202
  vi.resetModules();
192
- const { useSessionTracking } = await import('../sessionTracking');
203
+ const { useSessionTracking } = await import('../context/sessionTracking');
193
204
  const trackingWithoutApp = useSessionTracking(mockSupabase);
194
205
 
195
206
  await trackingWithoutApp.trackEventSwitch('event-123');
@@ -9,10 +9,24 @@ import {
9
9
  nameSchema,
10
10
  phoneSchema,
11
11
  urlSchema
12
- } from '../validationUtils';
12
+ } from '../validation/validationUtils';
13
+
14
+ // Mock the Logger module
15
+ vi.mock('../core/logger', () => {
16
+ const mockLoggerInstance = {
17
+ warn: vi.fn(),
18
+ };
19
+ return {
20
+ createLogger: vi.fn(() => mockLoggerInstance),
21
+ };
22
+ });
23
+
24
+ // Get the mock instance after mock is set up
25
+ import { createLogger } from '../core/logger';
26
+ const getMockLogger = () => createLogger('test');
13
27
 
14
28
  // Mock sanitization functions
15
- vi.mock('../sanitization', () => ({
29
+ vi.mock('../validation/sanitization', () => ({
16
30
  sanitizeUserInput: vi.fn((input: string) => `sanitized_${input}`),
17
31
  sanitizeFormData: vi.fn((data: unknown, schema: z.ZodSchema, rules?: Record<string, any>) => {
18
32
  // Try to parse with the schema to determine success
@@ -80,16 +94,15 @@ describe('validationUtils', () => {
80
94
 
81
95
  describe('sanitizeUserInput_deprecated', () => {
82
96
  it('should call sanitizeUserInput and log deprecation warning', () => {
83
- const consoleSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
97
+ vi.clearAllMocks();
84
98
 
85
99
  const result = sanitizeUserInput_deprecated('test input');
86
100
 
87
101
  expect(result).toBe('sanitized_test input');
88
- expect(consoleSpy).toHaveBeenCalledWith(
102
+ const logger = getMockLogger();
103
+ expect(vi.mocked(logger.warn)).toHaveBeenCalledWith(
89
104
  'sanitizeUserInput is deprecated. Use sanitizeUserInput from lib/sanitization instead.'
90
105
  );
91
-
92
- consoleSpy.mockRestore();
93
106
  });
94
107
  });
95
108