@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.
- package/dist/{DataTable-A36PJG6N.js → DataTable-6M4L6BI2.js} +26 -13
- package/dist/{DataTable-C7GaRZye.d.ts → DataTable-CWAZZcXC.d.ts} +1 -1
- package/dist/{PublicLoadingSpinner-CUAnTvcg.d.ts → EventLogo-rFL_kRjk.d.ts} +123 -135
- package/dist/{UnifiedAuthProvider-BVKmQd9u.d.ts → UnifiedAuthProvider-DJxGTftH.d.ts} +1 -1
- package/dist/{UnifiedAuthProvider-CQDZRJIS.js → UnifiedAuthProvider-XIQQ7LVU.js} +5 -5
- package/dist/{api-TNIBJWLM.js → api-45XYYO2A.js} +4 -3
- package/dist/{audit-T36HM7IM.js → audit-64X3VJXB.js} +3 -2
- package/dist/{chunk-F64FFPOZ.js → chunk-22WKWKRX.js} +26 -20
- package/dist/chunk-22WKWKRX.js.map +1 -0
- package/dist/{chunk-VZ5OR6HD.js → chunk-4C7EXCAR.js} +62 -150
- package/dist/chunk-4C7EXCAR.js.map +1 -0
- package/dist/{chunk-PYUXFQJ3.js → chunk-56XJ3TU6.js} +2 -2
- package/dist/chunk-56XJ3TU6.js.map +1 -0
- package/dist/{chunk-CTJRBUX2.js → chunk-6LAAY47Q.js} +2 -2
- package/dist/{chunk-UJI6WSMD.js → chunk-7QCC6MCP.js} +90 -3
- package/dist/chunk-7QCC6MCP.js.map +1 -0
- package/dist/{chunk-66C4BSAY.js → chunk-ANBQRTPX.js} +9 -2
- package/dist/chunk-ANBQRTPX.js.map +1 -0
- package/dist/{chunk-CQZU6TFE.js → chunk-BCIBECNB.js} +100 -62
- package/dist/chunk-BCIBECNB.js.map +1 -0
- package/dist/{chunk-GKHF54DI.js → chunk-BESYRHQM.js} +10 -4
- package/dist/chunk-BESYRHQM.js.map +1 -0
- package/dist/chunk-BJPBT3CU.js +21 -0
- package/dist/chunk-BJPBT3CU.js.map +1 -0
- package/dist/{chunk-BYXRHAIF.js → chunk-BLCXZEYF.js} +23 -14
- package/dist/chunk-BLCXZEYF.js.map +1 -0
- package/dist/{chunk-WP5I5GLN.js → chunk-BVYWGZVV.js} +112 -97
- package/dist/chunk-BVYWGZVV.js.map +1 -0
- package/dist/{chunk-GEVIB2UB.js → chunk-ERISIBYU.js} +14 -5
- package/dist/chunk-ERISIBYU.js.map +1 -0
- package/dist/{chunk-O3NWNXDY.js → chunk-FMUCXFII.js} +2 -2
- package/dist/chunk-FMUCXFII.js.map +1 -0
- package/dist/{chunk-GVDR7WNV.js → chunk-HAWZXGR2.js} +334 -614
- package/dist/chunk-HAWZXGR2.js.map +1 -0
- package/dist/{chunk-ZV77RZMU.js → chunk-INQLMHPF.js} +2 -2
- package/dist/chunk-JISYG63F.js +70 -0
- package/dist/chunk-JISYG63F.js.map +1 -0
- package/dist/{chunk-HMNOSGVA.js → chunk-KYRHUBIU.js} +576 -767
- package/dist/chunk-KYRHUBIU.js.map +1 -0
- package/dist/{chunk-M6DDYFUD.js → chunk-LS353YLY.js} +19 -16
- package/dist/chunk-LS353YLY.js.map +1 -0
- package/dist/{chunk-TGIY2AR2.js → chunk-MA6EPSGZ.js} +4 -3
- package/dist/{chunk-TGIY2AR2.js.map → chunk-MA6EPSGZ.js.map} +1 -1
- package/dist/chunk-OWAG3GSU.js +58 -0
- package/dist/chunk-OWAG3GSU.js.map +1 -0
- package/dist/{chunk-JCQZ6LA7.js → chunk-Q5QRDWKI.js} +9 -3
- package/dist/chunk-Q5QRDWKI.js.map +1 -0
- package/dist/chunk-S5OFRT4M.js +94 -0
- package/dist/chunk-S5OFRT4M.js.map +1 -0
- package/dist/{chunk-3DBFLLLU.js → chunk-SBVILCCA.js} +14 -9
- package/dist/chunk-SBVILCCA.js.map +1 -0
- package/dist/{chunk-ZYZCRSBD.js → chunk-T6JN6LH6.js} +16 -11
- package/dist/chunk-T6JN6LH6.js.map +1 -0
- package/dist/chunk-XDNLUEXI.js +138 -0
- package/dist/chunk-XDNLUEXI.js.map +1 -0
- package/dist/{chunk-3CG5L6RN.js → chunk-YCWDTTUK.js} +90 -75
- package/dist/chunk-YCWDTTUK.js.map +1 -0
- package/dist/{chunk-5F3NDPJV.js → chunk-ZZ2SS7NI.js} +10 -5
- package/dist/chunk-ZZ2SS7NI.js.map +1 -0
- package/dist/components.d.ts +7 -287
- package/dist/components.js +27 -157
- package/dist/components.js.map +1 -1
- package/dist/{file-reference-C9isKNPn.d.ts → file-reference-C6Gkn77H.d.ts} +1 -1
- package/dist/{formatting-DFcCxUEk.d.ts → formatting-CvUXy2mF.d.ts} +1 -1
- package/dist/hooks.d.ts +3 -3
- package/dist/hooks.js +21 -16
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +101 -9
- package/dist/index.js +44 -31
- package/dist/index.js.map +1 -1
- package/dist/providers.d.ts +1 -1
- package/dist/providers.js +4 -4
- package/dist/rbac/index.js +12 -12
- package/dist/schema-DTDZQe2u.d.ts +28 -0
- package/dist/styles/index.js +2 -1
- package/dist/theming/runtime.d.ts +2 -19
- package/dist/theming/runtime.js +2 -1
- package/dist/{types-D5rqZQXk.d.ts → types-Dfz9dmVH.d.ts} +12 -1
- package/dist/types.d.ts +153 -4
- package/dist/types.js +51 -16
- package/dist/types.js.map +1 -1
- package/dist/{useInactivityTracker-MRUU55XI.js → useInactivityTracker-TO6ZOF35.js} +3 -2
- package/dist/{usePublicRouteParams-Dyt1tzI9.d.ts → usePublicRouteParams-B7PabvuH.d.ts} +1 -1
- package/dist/utils.d.ts +221 -173
- package/dist/utils.js +185 -225
- package/dist/utils.js.map +1 -1
- package/dist/validation.d.ts +24 -115
- package/dist/validation.js +19 -474
- package/dist/validation.js.map +1 -1
- package/docs/api/classes/ColumnFactory.md +1 -1
- package/docs/api/classes/ErrorBoundary.md +6 -6
- package/docs/api/classes/InvalidScopeError.md +1 -1
- package/docs/api/classes/MissingUserContextError.md +1 -1
- package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
- package/docs/api/classes/PermissionDeniedError.md +1 -1
- package/docs/api/classes/PublicErrorBoundary.md +1 -1
- package/docs/api/classes/RBACAuditManager.md +6 -6
- package/docs/api/classes/RBACCache.md +1 -1
- package/docs/api/classes/RBACEngine.md +7 -7
- package/docs/api/classes/RBACError.md +1 -1
- package/docs/api/classes/RBACNotInitializedError.md +1 -1
- package/docs/api/classes/SecureSupabaseClient.md +1 -1
- package/docs/api/classes/StorageUtils.md +1 -1
- package/docs/api/enums/FileCategory.md +1 -1
- package/docs/api/interfaces/AggregateConfig.md +4 -4
- package/docs/api/interfaces/BadgeProps.md +27 -0
- package/docs/api/interfaces/ButtonProps.md +1 -1
- package/docs/api/interfaces/CardProps.md +1 -1
- package/docs/api/interfaces/ColorPalette.md +1 -1
- package/docs/api/interfaces/ColorShade.md +29 -4
- package/docs/api/interfaces/DataAccessRecord.md +9 -9
- package/docs/api/interfaces/DataRecord.md +1 -1
- package/docs/api/interfaces/DataTableAction.md +18 -18
- package/docs/api/interfaces/DataTableColumn.md +61 -1
- package/docs/api/interfaces/DataTableProps.md +1 -1
- package/docs/api/interfaces/DataTableToolbarButton.md +7 -7
- package/docs/api/interfaces/EmptyStateConfig.md +5 -5
- package/docs/api/interfaces/EnhancedNavigationMenuProps.md +14 -14
- package/docs/api/interfaces/EventAppRoleData.md +1 -1
- package/docs/api/interfaces/EventLogoProps.md +152 -0
- package/docs/api/interfaces/ExportColumn.md +1 -1
- package/docs/api/interfaces/ExportOptions.md +8 -8
- package/docs/api/interfaces/FileDisplayProps.md +15 -15
- package/docs/api/interfaces/FileMetadata.md +1 -1
- package/docs/api/interfaces/FileReference.md +1 -1
- package/docs/api/interfaces/FileSizeLimits.md +1 -1
- package/docs/api/interfaces/FileUploadOptions.md +1 -1
- package/docs/api/interfaces/FileUploadProps.md +1 -1
- package/docs/api/interfaces/FooterProps.md +1 -1
- package/docs/api/interfaces/GrantEventAppRoleParams.md +1 -1
- package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
- package/docs/api/interfaces/InputProps.md +1 -1
- package/docs/api/interfaces/LabelProps.md +1 -1
- package/docs/api/interfaces/LoginFormProps.md +1 -1
- package/docs/api/interfaces/NavigationAccessRecord.md +10 -10
- package/docs/api/interfaces/NavigationContextType.md +9 -9
- package/docs/api/interfaces/NavigationGuardProps.md +10 -10
- package/docs/api/interfaces/NavigationItem.md +1 -1
- package/docs/api/interfaces/NavigationMenuProps.md +1 -1
- package/docs/api/interfaces/NavigationProviderProps.md +7 -7
- package/docs/api/interfaces/Organisation.md +1 -1
- package/docs/api/interfaces/OrganisationContextType.md +1 -1
- package/docs/api/interfaces/OrganisationMembership.md +1 -1
- package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
- package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
- package/docs/api/interfaces/PaceAppLayoutProps.md +27 -27
- package/docs/api/interfaces/PaceLoginPageProps.md +4 -4
- package/docs/api/interfaces/PageAccessRecord.md +8 -8
- package/docs/api/interfaces/PagePermissionContextType.md +8 -8
- package/docs/api/interfaces/PagePermissionGuardProps.md +11 -11
- package/docs/api/interfaces/PagePermissionProviderProps.md +7 -7
- package/docs/api/interfaces/PaletteData.md +4 -4
- package/docs/api/interfaces/PermissionEnforcerProps.md +11 -11
- package/docs/api/interfaces/ProtectedRouteProps.md +6 -6
- package/docs/api/interfaces/PublicErrorBoundaryProps.md +1 -1
- package/docs/api/interfaces/PublicErrorBoundaryState.md +1 -1
- package/docs/api/interfaces/PublicLoadingSpinnerProps.md +1 -1
- package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
- package/docs/api/interfaces/PublicPageHeaderProps.md +1 -1
- package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
- package/docs/api/interfaces/RBACConfig.md +1 -1
- package/docs/api/interfaces/RBACLogger.md +1 -1
- package/docs/api/interfaces/RevokeEventAppRoleParams.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterContextType.md +8 -8
- package/docs/api/interfaces/RoleBasedRouterProps.md +10 -10
- package/docs/api/interfaces/RoleManagementResult.md +1 -1
- package/docs/api/interfaces/RouteAccessRecord.md +10 -10
- package/docs/api/interfaces/RouteConfig.md +10 -10
- package/docs/api/interfaces/SecureDataContextType.md +9 -9
- package/docs/api/interfaces/SecureDataProviderProps.md +8 -8
- package/docs/api/interfaces/SessionRestorationLoaderProps.md +21 -0
- package/docs/api/interfaces/StorageConfig.md +1 -1
- package/docs/api/interfaces/StorageFileInfo.md +1 -1
- package/docs/api/interfaces/StorageFileMetadata.md +1 -1
- package/docs/api/interfaces/StorageListOptions.md +1 -1
- package/docs/api/interfaces/StorageListResult.md +1 -1
- package/docs/api/interfaces/StorageUploadOptions.md +1 -1
- package/docs/api/interfaces/StorageUploadResult.md +1 -1
- package/docs/api/interfaces/StorageUrlOptions.md +1 -1
- package/docs/api/interfaces/StyleImport.md +1 -1
- package/docs/api/interfaces/SwitchProps.md +1 -1
- package/docs/api/interfaces/ToastActionElement.md +1 -1
- package/docs/api/interfaces/ToastProps.md +1 -1
- package/docs/api/interfaces/UnifiedAuthContextType.md +53 -53
- package/docs/api/interfaces/UnifiedAuthProviderProps.md +13 -13
- package/docs/api/interfaces/UseInactivityTrackerOptions.md +9 -9
- package/docs/api/interfaces/UseInactivityTrackerReturn.md +8 -8
- package/docs/api/interfaces/UsePublicEventOptions.md +3 -3
- package/docs/api/interfaces/UsePublicEventReturn.md +5 -5
- package/docs/api/interfaces/UsePublicFileDisplayOptions.md +4 -4
- package/docs/api/interfaces/UsePublicFileDisplayReturn.md +9 -9
- package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
- package/docs/api/interfaces/UseResolvedScopeOptions.md +4 -4
- package/docs/api/interfaces/UseResolvedScopeReturn.md +4 -4
- package/docs/api/interfaces/UserEventAccess.md +11 -11
- package/docs/api/interfaces/UserMenuProps.md +1 -1
- package/docs/api/interfaces/UserProfile.md +1 -1
- package/docs/api/modules.md +591 -220
- package/docs/api-reference/components.md +106 -26
- package/docs/architecture/README.md +0 -3
- package/docs/implementation-guides/data-tables.md +277 -13
- package/docs/implementation-guides/forms.md +1 -16
- package/docs/implementation-guides/permission-enforcement.md +8 -2
- package/docs/styles/README.md +0 -2
- package/examples/README.md +30 -14
- package/examples/STRUCTURE.md +125 -0
- package/examples/components 2/DataTable/HierarchicalActionsExample.tsx +421 -0
- package/examples/components 2/DataTable/HierarchicalExample.tsx +475 -0
- package/examples/components 2/DataTable/InitialPageSizeExample.tsx +177 -0
- package/examples/components 2/DataTable/PerformanceExample.tsx +506 -0
- package/examples/components 2/DataTable/index.ts +13 -0
- package/examples/components 2/Dialog/BasicHtmlTest.tsx +55 -0
- package/examples/components 2/Dialog/DebugHtmlExample.tsx +68 -0
- package/examples/components 2/Dialog/HtmlDialogExample.tsx +202 -0
- package/examples/components 2/Dialog/ScrollableDialogExample.tsx +290 -0
- package/examples/components 2/Dialog/SimpleHtmlTest.tsx +61 -0
- package/examples/components 2/Dialog/SmartDialogExample.tsx +322 -0
- package/examples/components 2/Dialog/index.ts +15 -0
- package/examples/components 2/index.ts +11 -0
- package/examples/features/index.ts +12 -0
- package/{src/examples → examples/features/public-pages}/CorrectPublicPageImplementation.tsx +14 -17
- package/{src/examples → examples/features/public-pages}/PublicEventPage.tsx +14 -27
- package/{src/examples → examples/features/public-pages}/PublicPageApp.tsx +15 -28
- package/{src/examples → examples/features/public-pages}/PublicPageUsageExample.tsx +8 -10
- package/examples/features/public-pages/index.ts +14 -0
- package/examples/features/rbac/CompleteRBACExample.tsx +324 -0
- package/examples/features/rbac/EventBasedApp.tsx +239 -0
- package/examples/features/rbac/PermissionExample.tsx +151 -0
- package/examples/features/rbac/index.ts +13 -0
- package/examples/index.ts +11 -3
- package/package.json +30 -19
- package/src/__tests__/TEST_STANDARD.md +92 -0
- package/src/components/Alert/Alert.tsx +1 -1
- package/src/components/Avatar/Avatar.tsx +1 -1
- package/src/components/Badge/Badge.test.tsx +314 -0
- package/src/components/Badge/Badge.tsx +304 -0
- package/src/components/Badge/index.ts +3 -0
- package/src/components/Button/Button.tsx +1 -1
- package/src/components/Card/Card.tsx +1 -1
- package/src/components/Checkbox/Checkbox.tsx +1 -1
- package/src/components/DataTable/DataTable.test.tsx +1 -1
- package/src/components/DataTable/DataTable.tsx +1 -30
- package/src/components/DataTable/__tests__/DataTable.grouping-aggregation.test.tsx +562 -0
- package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +217 -0
- package/src/components/DataTable/__tests__/styles.test.ts +3 -3
- package/src/components/DataTable/components/ActionButtons.tsx +0 -15
- package/src/components/DataTable/components/ColumnFilter.tsx +8 -4
- package/src/components/DataTable/components/DataTableBody.tsx +461 -0
- package/src/components/DataTable/components/DataTableCore.tsx +4 -185
- package/src/components/DataTable/components/DataTableErrorBoundary.tsx +1 -1
- package/src/components/DataTable/components/DataTableModals.tsx +1 -27
- package/src/components/DataTable/components/DraggableColumnHeader.tsx +144 -0
- package/src/components/DataTable/components/EditableRow.tsx +1 -1
- package/src/components/DataTable/components/FilterRow.tsx +9 -3
- package/src/components/DataTable/components/ImportModal.tsx +2 -14
- package/src/components/DataTable/components/PaginationControls.tsx +2 -1
- package/src/components/DataTable/components/UnifiedTableBody.tsx +109 -82
- package/src/components/DataTable/components/VirtualizedDataTable.tsx +513 -0
- package/src/components/DataTable/components/__tests__/AccessDeniedPage.test.tsx +14 -68
- package/src/components/DataTable/components/__tests__/ActionButtons.test.tsx +1 -1
- package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +62 -0
- package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +1 -1
- package/src/components/DataTable/components/__tests__/DataTableModals.test.tsx +1 -1
- package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +43 -0
- package/src/components/DataTable/components/__tests__/ImportModal.test.tsx +1 -1
- package/src/components/DataTable/core/ActionManager.ts +235 -0
- package/src/components/DataTable/core/ColumnManager.ts +205 -0
- package/src/components/DataTable/core/DataManager.ts +188 -0
- package/src/components/DataTable/core/DataTableContext.tsx +181 -0
- package/src/components/DataTable/core/LocalDataAdapter.ts +273 -0
- package/src/components/DataTable/core/PluginRegistry.ts +229 -0
- package/src/components/DataTable/core/StateManager.ts +311 -0
- package/src/components/DataTable/core/interfaces.ts +338 -0
- package/src/components/DataTable/examples/GroupingAggregationExample.tsx +273 -0
- package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +1 -1
- package/src/components/DataTable/examples/__tests__/HierarchicalActionsExample.test.tsx +1 -1
- package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +1 -1
- package/src/components/DataTable/hooks/useColumnVisibilityPersistence.ts +1 -1
- package/src/components/DataTable/hooks/useDataTablePermissions.ts +2 -23
- package/src/components/DataTable/index.ts +4 -0
- package/src/components/DataTable/styles.ts +28 -7
- package/src/components/DataTable/types.ts +13 -0
- package/src/components/DataTable/utils/__tests__/columnUtils.test.ts +94 -0
- package/src/components/DataTable/utils/__tests__/exportUtils.test.ts +1 -1
- package/src/components/DataTable/utils/aggregationUtils.ts +161 -0
- package/src/components/DataTable/utils/columnUtils.ts +40 -0
- package/src/components/DataTable/utils/debugTools.ts +609 -0
- package/src/components/DataTable/utils/exportUtils.ts +1 -1
- package/src/components/DataTable/utils/flexibleImport.ts +1 -11
- package/src/components/DataTable/utils/index.ts +2 -0
- package/src/components/DataTable/utils/paginationUtils.ts +1 -1
- package/src/components/Dialog/Dialog.tsx +2 -2
- package/src/components/Dialog/utils/__tests__/safeHtml.unit.test.ts +8 -1
- package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +35 -7
- package/src/components/ErrorBoundary/ErrorBoundary.tsx +5 -4
- package/src/components/EventSelector/EventSelector.tsx +3 -2
- package/src/components/FileDisplay/FileDisplay.tsx +2 -36
- package/src/components/FileUpload/FileUpload.test.tsx +2 -2
- package/src/components/FileUpload/FileUpload.tsx +2 -2
- package/src/components/Footer/Footer.test.tsx +1 -1
- package/src/components/Footer/Footer.tsx +1 -1
- package/src/components/Form/Form.test.tsx +5 -510
- package/src/components/Form/Form.tsx +1 -1
- package/src/components/Form/FormField.tsx +1 -1
- package/src/components/Form/index.ts +0 -12
- package/src/components/Header/Header.tsx +1 -1
- package/src/components/Input/Input.tsx +1 -1
- package/src/components/Label/Label.tsx +1 -1
- package/src/components/LoginForm/LoginForm.test.tsx +1 -1
- package/src/components/LoginForm/LoginForm.tsx +1 -1
- package/src/components/NavigationMenu/NavigationMenu.test.tsx +19 -3
- package/src/components/NavigationMenu/NavigationMenu.tsx +9 -8
- package/src/components/OrganisationSelector/OrganisationSelector.tsx +4 -3
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +14 -12
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.integration.test.tsx +0 -16
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.performance.test.tsx +76 -10
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.security.test.tsx +0 -1
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.unit.test.tsx +0 -9
- package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +35 -3
- package/src/components/PaceLoginPage/PaceLoginPage.tsx +14 -13
- package/src/components/PasswordReset/PasswordChangeForm.tsx +1 -1
- package/src/components/PasswordReset/index.ts +0 -2
- package/src/components/Progress/Progress.tsx +1 -1
- package/src/components/ProtectedRoute/ProtectedRoute.test.tsx +35 -8
- package/src/components/ProtectedRoute/ProtectedRoute.tsx +3 -2
- package/src/components/PublicLayout/PublicErrorBoundary.tsx +1 -1
- package/src/components/PublicLayout/PublicLoadingSpinner.tsx +1 -1
- package/src/components/PublicLayout/PublicPageContextChecker.tsx +44 -43
- package/src/components/PublicLayout/PublicPageFooter.tsx +1 -1
- package/src/components/PublicLayout/PublicPageHeader.tsx +1 -15
- package/src/components/PublicLayout/PublicPageProvider.tsx +3 -2
- package/src/components/PublicLayout/__tests__/PublicPageContextChecker.test.tsx +2 -0
- package/src/components/PublicLayout/__tests__/PublicPageFooter.test.tsx +1 -1
- package/src/components/PublicLayout/index.ts +4 -2
- package/src/components/Select/Select.test.tsx +1 -1
- package/src/components/Select/Select.tsx +21 -9
- package/src/components/{SessionRestorationLoader.tsx → SessionRestorationLoader/SessionRestorationLoader.tsx} +3 -2
- package/src/components/SessionRestorationLoader/index.ts +3 -0
- package/src/components/Switch/Switch.tsx +1 -1
- package/src/components/Table/Table.tsx +1 -1
- package/src/components/Table/__tests__/Table.test.tsx +1 -1
- package/src/components/Toast/Toast.tsx +1 -1
- package/src/components/Tooltip/Tooltip.tsx +1 -1
- package/src/components/index.ts +7 -10
- package/src/hooks/__tests__/hooks.integration.test.tsx +37 -22
- package/src/hooks/__tests__/useComponentPerformance.unit.test.tsx +33 -17
- package/src/hooks/__tests__/useDataTablePerformance.unit.test.ts +28 -3
- package/src/hooks/__tests__/useFileDisplay.unit.test.ts +36 -9
- package/src/hooks/__tests__/useFileUrl.unit.test.ts +83 -85
- package/src/hooks/__tests__/useInactivityTracker.unit.test.ts +26 -2
- package/src/hooks/__tests__/usePerformanceMonitor.unit.test.ts +19 -6
- package/src/hooks/__tests__/usePermissionCache.simple.test.ts +17 -4
- package/src/hooks/__tests__/usePermissionCache.unit.test.ts +17 -4
- package/src/hooks/__tests__/usePublicEvent.simple.test.ts +26 -6
- package/src/hooks/__tests__/usePublicFileDisplay.test.ts +16 -6
- package/src/hooks/__tests__/useSecureDataAccess.unit.test.tsx +3 -3
- package/src/hooks/__tests__/useSessionRestoration.unit.test.tsx +17 -3
- package/src/hooks/public/usePublicEvent.ts +7 -6
- package/src/hooks/public/usePublicEventLogo.ts +7 -4
- package/src/hooks/public/usePublicFileDisplay.ts +6 -150
- package/src/hooks/useComponentPerformance.ts +4 -1
- package/src/hooks/useDataTablePerformance.ts +4 -3
- package/src/hooks/useEventTheme.test.ts +18 -5
- package/src/hooks/useEventTheme.ts +4 -1
- package/src/hooks/useEvents.ts +2 -0
- package/src/hooks/useFileDisplay.ts +9 -8
- package/src/hooks/useFileReference.ts +4 -1
- package/src/hooks/useFileUrl.ts +4 -1
- package/src/hooks/useInactivityTracker.ts +5 -4
- package/src/hooks/useOrganisationSecurity.test.ts +33 -12
- package/src/hooks/useOrganisationSecurity.ts +8 -7
- package/src/hooks/usePerformanceMonitor.ts +6 -3
- package/src/hooks/usePermissionCache.ts +13 -6
- package/src/hooks/useSecureDataAccess.test.ts +2 -2
- package/src/hooks/useSecureDataAccess.ts +9 -8
- package/src/hooks/useSessionRestoration.ts +4 -1
- package/src/hooks/useStorage.ts +4 -1
- package/src/index.ts +20 -7
- package/src/providers/services/AuthServiceProvider.tsx +3 -2
- package/src/providers/services/EventServiceProvider.tsx +2 -1
- package/src/providers/services/InactivityServiceProvider.tsx +2 -1
- package/src/providers/services/OrganisationServiceProvider.tsx +2 -1
- package/src/providers/services/UnifiedAuthProvider.tsx +4 -3
- package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +22 -2
- package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +24 -2
- package/src/rbac/__tests__/cache-invalidation.test.ts +20 -6
- package/src/rbac/api.ts +5 -2
- package/src/rbac/audit-enhanced.ts +6 -6
- package/src/rbac/audit.test.ts +60 -38
- package/src/rbac/audit.ts +8 -8
- package/src/rbac/cache-invalidation.ts +7 -4
- package/src/rbac/components/EnhancedNavigationMenu.tsx +11 -5
- package/src/rbac/components/NavigationGuard.tsx +7 -3
- package/src/rbac/components/NavigationProvider.tsx +6 -3
- package/src/rbac/components/PagePermissionGuard.tsx +28 -16
- package/src/rbac/components/PagePermissionProvider.tsx +4 -1
- package/src/rbac/components/PermissionEnforcer.tsx +9 -3
- package/src/rbac/components/RoleBasedRouter.tsx +3 -1
- package/src/rbac/components/SecureDataProvider.tsx +7 -3
- package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +87 -61
- package/src/rbac/components/__tests__/NavigationGuard.test.tsx +83 -33
- package/src/rbac/components/__tests__/NavigationProvider.test.tsx +36 -13
- package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +2 -2
- package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +22 -8
- package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +19 -6
- package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +43 -17
- package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +42 -17
- package/src/rbac/engine.ts +15 -7
- package/src/rbac/hooks/usePermissions.ts +7 -3
- package/src/rbac/hooks/useResolvedScope.test.ts +2 -2
- package/src/rbac/hooks/useResolvedScope.ts +10 -7
- package/src/rbac/permissions.ts +5 -2
- package/src/rbac/security.test.ts +27 -16
- package/src/rbac/security.ts +5 -4
- package/src/services/AuthService.ts +22 -21
- package/src/services/EventService.ts +12 -12
- package/src/services/InactivityService.ts +5 -4
- package/src/services/OrganisationService.ts +26 -25
- package/src/services/__tests__/AuthService.test.ts +51 -19
- package/src/services/__tests__/EventService.test.ts +37 -5
- package/src/services/__tests__/InactivityService.test.ts +38 -4
- package/src/services/__tests__/OrganisationService.test.ts +3 -8
- package/src/services/base/BaseService.ts +3 -1
- package/src/styles/core.css +3 -0
- package/src/theming/__tests__/runtime.test.ts +21 -12
- package/src/theming/parseEventColours.ts +5 -19
- package/src/theming/runtime.ts +8 -4
- package/src/types/validation.ts +2 -29
- package/src/utils/__tests__/appConfig.unit.test.ts +1 -1
- package/src/utils/__tests__/audit.unit.test.ts +1 -1
- package/src/utils/__tests__/auth-utils.unit.test.ts +1 -1
- package/src/utils/__tests__/bundleAnalysis.unit.test.ts +19 -19
- package/src/utils/__tests__/cn.unit.test.ts +1 -1
- package/src/utils/__tests__/debugLogger.test.ts +1 -1
- package/src/utils/__tests__/deviceFingerprint.unit.test.ts +1 -1
- package/src/utils/__tests__/dynamicUtils.unit.test.ts +1 -1
- package/src/utils/__tests__/formatting.unit.test.ts +1 -1
- package/src/utils/__tests__/lazyLoad.unit.test.tsx +1 -1
- package/src/utils/__tests__/logger.unit.test.ts +1 -1
- package/src/utils/__tests__/organisationContext.unit.test.ts +1 -1
- package/src/utils/__tests__/performanceBenchmark.test.ts +1 -1
- package/src/utils/__tests__/performanceBudgets.unit.test.ts +1 -1
- package/src/utils/__tests__/permissionTypes.unit.test.ts +1 -1
- package/src/utils/__tests__/permissionUtils.unit.test.ts +1 -1
- package/src/utils/__tests__/sanitization.unit.test.ts +1 -1
- package/src/utils/__tests__/schemaUtils.unit.test.ts +1 -1
- package/src/utils/__tests__/secureDataAccess.unit.test.ts +1 -1
- package/src/utils/__tests__/secureErrors.unit.test.ts +33 -15
- package/src/utils/__tests__/secureStorage.unit.test.ts +1 -1
- package/src/utils/__tests__/security.unit.test.ts +40 -18
- package/src/utils/__tests__/securityMonitor.unit.test.ts +1 -1
- package/src/utils/__tests__/sessionTracking.unit.test.ts +40 -29
- package/src/utils/__tests__/validationUtils.unit.test.ts +19 -6
- package/src/utils/app/appConfig.ts +47 -0
- package/src/utils/app/appIdResolver.test.ts +497 -0
- package/src/utils/app/appIdResolver.ts +133 -0
- package/src/utils/app/appNameResolver.simple.test.ts +212 -0
- package/src/utils/app/appNameResolver.test.ts +121 -0
- package/src/utils/app/appNameResolver.ts +195 -0
- package/src/utils/audit/audit.ts +127 -0
- package/src/utils/context/organisationContext.test.ts +322 -0
- package/src/utils/context/organisationContext.ts +156 -0
- package/src/utils/context/sessionTracking.ts +125 -0
- package/src/utils/core/cn.ts +7 -0
- package/src/utils/core/debugLogger.ts +67 -0
- package/src/utils/core/logger.ts +181 -0
- package/src/utils/device/deviceFingerprint.ts +215 -0
- package/src/utils/dynamic/dynamicUtils.ts +105 -0
- package/src/utils/dynamic/lazyLoad.tsx +44 -0
- package/src/utils/file-reference/__tests__/file-reference.test.ts +788 -0
- package/src/utils/file-reference/index.ts +501 -0
- package/src/utils/formatting/formatDate.test.ts +237 -0
- package/src/utils/formatting/formatting.ts +133 -0
- package/src/utils/index.ts +39 -54
- package/src/utils/performance/bundleAnalysis.ts +129 -0
- package/src/utils/performance/performanceBenchmark.ts +64 -0
- package/src/utils/performance/performanceBudgets.ts +110 -0
- package/src/utils/permissions/permissionTypes.ts +37 -0
- package/src/utils/permissions/permissionUtils.test.ts +393 -0
- package/src/utils/permissions/permissionUtils.ts +34 -0
- package/src/utils/security/auth-utils.ts +96 -0
- package/src/utils/security/secureDataAccess.test.ts +711 -0
- package/src/utils/security/secureDataAccess.ts +377 -0
- package/src/utils/security/secureErrors.ts +82 -0
- package/src/utils/security/secureStorage.ts +244 -0
- package/src/utils/security/security.ts +159 -0
- package/src/utils/security/securityMonitor.ts +45 -0
- package/src/utils/storage/__tests__/helpers.unit.test.ts +1 -4
- package/src/utils/storage/helpers.ts +15 -8
- package/src/utils/validation/__tests__/htmlSanitization.unit.test.ts +598 -0
- package/src/{validation → utils/validation}/csrf.ts +1 -1
- package/src/utils/validation/htmlSanitization.ts +184 -0
- package/src/utils/validation/index.ts +79 -0
- package/src/utils/validation/sanitization.ts +333 -0
- package/src/{validation/schemaUtils.ts → utils/validation/schema.ts} +11 -6
- package/src/{validation → utils/validation}/sqlInjectionProtection.ts +2 -0
- package/src/utils/validation/validation.ts +111 -0
- package/src/utils/validation/validationUtils.ts +123 -0
- package/src/validation/index.ts +3 -34
- package/dist/chunk-24MKLB7U.js +0 -81
- package/dist/chunk-24MKLB7U.js.map +0 -1
- package/dist/chunk-3CG5L6RN.js.map +0 -1
- package/dist/chunk-3DBFLLLU.js.map +0 -1
- package/dist/chunk-5F3NDPJV.js.map +0 -1
- package/dist/chunk-66C4BSAY.js.map +0 -1
- package/dist/chunk-BDZUMRBD.js +0 -87
- package/dist/chunk-BDZUMRBD.js.map +0 -1
- package/dist/chunk-BYXRHAIF.js.map +0 -1
- package/dist/chunk-CDQ3PX7L.js +0 -18
- package/dist/chunk-CDQ3PX7L.js.map +0 -1
- package/dist/chunk-CQZU6TFE.js.map +0 -1
- package/dist/chunk-F64FFPOZ.js.map +0 -1
- package/dist/chunk-GEVIB2UB.js.map +0 -1
- package/dist/chunk-GKHF54DI.js.map +0 -1
- package/dist/chunk-GVDR7WNV.js.map +0 -1
- package/dist/chunk-HMNOSGVA.js.map +0 -1
- package/dist/chunk-JCQZ6LA7.js.map +0 -1
- package/dist/chunk-M6DDYFUD.js.map +0 -1
- package/dist/chunk-O3NWNXDY.js.map +0 -1
- package/dist/chunk-PYUXFQJ3.js.map +0 -1
- package/dist/chunk-UJI6WSMD.js.map +0 -1
- package/dist/chunk-VZ5OR6HD.js.map +0 -1
- package/dist/chunk-WP5I5GLN.js.map +0 -1
- package/dist/chunk-ZYZCRSBD.js.map +0 -1
- package/dist/validation-DnhrNMju.d.ts +0 -159
- package/src/components/PublicLayout/__tests__/PublicPageDebugger.test.tsx +0 -185
- package/src/validation/__tests__/common.unit.test.ts +0 -101
- package/src/validation/__tests__/csrf.unit.test.ts +0 -365
- package/src/validation/__tests__/passwordSchema.unit.test.ts +0 -203
- package/src/validation/__tests__/sanitization.unit.test.ts +0 -250
- package/src/validation/__tests__/schemaUtils.unit.test.ts +0 -451
- package/src/validation/__tests__/sqlInjectionProtection.unit.test.ts +0 -462
- package/src/validation/__tests__/user.unit.test.ts +0 -440
- package/src/validation/sanitization.ts +0 -96
- /package/dist/{DataTable-A36PJG6N.js.map → DataTable-6M4L6BI2.js.map} +0 -0
- /package/dist/{UnifiedAuthProvider-CQDZRJIS.js.map → UnifiedAuthProvider-XIQQ7LVU.js.map} +0 -0
- /package/dist/{api-TNIBJWLM.js.map → api-45XYYO2A.js.map} +0 -0
- /package/dist/{audit-T36HM7IM.js.map → audit-64X3VJXB.js.map} +0 -0
- /package/dist/{chunk-CTJRBUX2.js.map → chunk-6LAAY47Q.js.map} +0 -0
- /package/dist/{chunk-ZV77RZMU.js.map → chunk-INQLMHPF.js.map} +0 -0
- /package/dist/{useInactivityTracker-MRUU55XI.js.map → useInactivityTracker-TO6ZOF35.js.map} +0 -0
- /package/src/{validation → utils/validation}/common.ts +0 -0
- /package/src/{validation → utils/validation}/passwordSchema.ts +0 -0
- /package/src/{validation → utils/validation}/user.ts +0 -0
package/src/hooks/useStorage.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
120
|
-
|
|
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
|
-
|
|
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).
|
|
205
|
-
|
|
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
|
-
|
|
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
|
-
|
|
376
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
package/src/rbac/audit.test.ts
CHANGED
|
@@ -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
|
|
354
|
+
let consoleDebugSpy: any;
|
|
354
355
|
let consoleWarnSpy: any;
|
|
356
|
+
let consoleErrorSpy: any;
|
|
357
|
+
let originalMode: string | undefined;
|
|
355
358
|
|
|
356
359
|
beforeEach(() => {
|
|
357
|
-
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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'
|
|
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(
|
|
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(
|
|
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
|
-
|
|
535
|
-
expect(
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
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
|
|