@jmruthers/pace-core 0.5.135 → 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.
- package/dist/{DataTable-C7GaRZye.d.ts → DataTable-CWAZZcXC.d.ts} +1 -1
- package/dist/{DataTable-A36PJG6N.js → DataTable-CYOHOX3O.js} +25 -13
- package/dist/{PublicLoadingSpinner-CUAnTvcg.d.ts → EventLogo-801uofbR.d.ts} +51 -135
- package/dist/UnifiedAuthProvider-5E5TUNMS.js +17 -0
- package/dist/{UnifiedAuthProvider-BVKmQd9u.d.ts → UnifiedAuthProvider-DJxGTftH.d.ts} +1 -1
- package/dist/{api-TNIBJWLM.js → api-45XYYO2A.js} +4 -3
- package/dist/{audit-T36HM7IM.js → audit-64X3VJXB.js} +3 -2
- package/dist/{chunk-CTJRBUX2.js → chunk-2TWNJ46Y.js} +2 -2
- package/dist/{chunk-UJI6WSMD.js → chunk-444EZN6N.js} +3 -3
- package/dist/chunk-444EZN6N.js.map +1 -0
- package/dist/{chunk-3CG5L6RN.js → chunk-4MT5BGGL.js} +90 -73
- package/dist/chunk-4MT5BGGL.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-5DPZ5EAT.js +60 -0
- package/dist/chunk-5DPZ5EAT.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-APIBCTL2.js +670 -0
- package/dist/chunk-APIBCTL2.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-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-CQZU6TFE.js → chunk-FHWWBIHA.js} +100 -62
- package/dist/chunk-FHWWBIHA.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-HJGGOMQ6.js} +194 -518
- package/dist/chunk-HJGGOMQ6.js.map +1 -0
- package/dist/{chunk-BDZUMRBD.js → chunk-K2WWTH7O.js} +13 -6
- package/dist/chunk-K2WWTH7O.js.map +1 -0
- package/dist/{chunk-BYXRHAIF.js → chunk-L6PGMCMD.js} +23 -14
- package/dist/chunk-L6PGMCMD.js.map +1 -0
- package/dist/chunk-LMC26NLJ.js +84 -0
- package/dist/chunk-LMC26NLJ.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-ZYZCRSBD.js → chunk-LTV3XIJJ.js} +16 -11
- package/dist/chunk-LTV3XIJJ.js.map +1 -0
- package/dist/{chunk-HMNOSGVA.js → chunk-NOHEVYVX.js} +377 -666
- package/dist/chunk-NOHEVYVX.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-TGIY2AR2.js → chunk-SL2YQDR6.js} +4 -3
- package/dist/{chunk-TGIY2AR2.js.map → chunk-SL2YQDR6.js.map} +1 -1
- package/dist/{chunk-VZ5OR6HD.js → chunk-TVYPTYOY.js} +55 -179
- package/dist/chunk-TVYPTYOY.js.map +1 -0
- package/dist/{chunk-ZV77RZMU.js → chunk-XARJS7CD.js} +2 -2
- package/dist/chunk-XDNLUEXI.js +138 -0
- package/dist/chunk-XDNLUEXI.js.map +1 -0
- package/dist/{chunk-F64FFPOZ.js → chunk-YLKIDTUK.js} +26 -20
- package/dist/chunk-YLKIDTUK.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 +26 -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 +22 -16
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +101 -9
- package/dist/index.js +43 -31
- package/dist/index.js.map +1 -1
- package/dist/providers.d.ts +1 -1
- package/dist/providers.js +5 -4
- package/dist/rbac/index.js +13 -12
- 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 +2 -2
- package/dist/types.js +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 +195 -232
- package/dist/utils.js +173 -331
- package/dist/utils.js.map +1 -1
- package/dist/{validation-DnhrNMju.d.ts → validation-8npbysjg.d.ts} +26 -8
- package/dist/validation.d.ts +261 -10
- package/dist/validation.js +82 -440
- 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/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 +514 -212
- package/docs/api-reference/components.md +106 -26
- package/docs/architecture/README.md +0 -2
- 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/examples/README.md +30 -14
- package/examples/STRUCTURE.md +125 -0
- package/examples/components/DataTable/HierarchicalActionsExample.tsx +421 -0
- package/examples/components/DataTable/HierarchicalExample.tsx +475 -0
- package/examples/components/DataTable/InitialPageSizeExample.tsx +177 -0
- package/examples/components/DataTable/PerformanceExample.tsx +506 -0
- package/examples/components/DataTable/index.ts +13 -0
- package/examples/components/Dialog/BasicHtmlTest.tsx +55 -0
- package/examples/components/Dialog/DebugHtmlExample.tsx +68 -0
- package/examples/components/Dialog/HtmlDialogExample.tsx +202 -0
- package/examples/components/Dialog/ScrollableDialogExample.tsx +290 -0
- package/examples/components/Dialog/SimpleHtmlTest.tsx +61 -0
- package/examples/components/Dialog/SmartDialogExample.tsx +322 -0
- package/examples/components/Dialog/index.ts +15 -0
- package/examples/components/index.ts +11 -0
- package/examples/features/index.ts +12 -0
- package/examples/{public-pages → features/public-pages}/CorrectPublicPageImplementation.tsx +1 -1
- package/examples/{public-pages → features/public-pages}/PublicEventPage.tsx +1 -1
- package/examples/{public-pages → features/public-pages}/PublicPageApp.tsx +1 -1
- package/examples/{public-pages → features/public-pages}/PublicPageUsageExample.tsx +1 -1
- package/examples/index.ts +11 -3
- package/package.json +30 -10
- package/src/components/Alert/Alert.tsx +1 -1
- package/src/components/Avatar/Avatar.tsx +1 -1
- 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__/styles.test.ts +2 -2
- package/src/components/DataTable/components/ActionButtons.tsx +0 -15
- 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/EditableRow.tsx +1 -1
- package/src/components/DataTable/components/ImportModal.tsx +2 -14
- package/src/components/DataTable/components/PaginationControls.tsx +1 -1
- package/src/components/DataTable/components/UnifiedTableBody.tsx +109 -82
- package/src/components/DataTable/components/__tests__/ActionButtons.test.tsx +1 -1
- 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__/ImportModal.test.tsx +1 -1
- 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 +1 -1
- package/src/components/DataTable/types.ts +13 -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/exportUtils.ts +1 -1
- package/src/components/DataTable/utils/flexibleImport.ts +1 -11
- package/src/components/DataTable/utils/index.ts +1 -0
- package/src/components/DataTable/utils/paginationUtils.ts +1 -1
- package/src/components/Dialog/Dialog.tsx +2 -2
- 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.tsx +1 -1
- package/src/components/Form/Form.test.tsx +4 -509
- 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.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.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 +13 -12
- 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/index.ts +4 -2
- package/src/components/Select/Select.tsx +1 -1
- 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/Toast/Toast.tsx +1 -1
- package/src/components/Tooltip/Tooltip.tsx +1 -1
- package/src/components/index.ts +4 -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__/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 +16 -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/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/{appIdResolver.test.ts → app/appIdResolver.test.ts} +28 -30
- package/src/utils/{appIdResolver.ts → app/appIdResolver.ts} +8 -5
- package/src/utils/{appNameResolver.test.ts → app/appNameResolver.test.ts} +1 -1
- package/src/utils/{appNameResolver.ts → app/appNameResolver.ts} +5 -1
- package/src/utils/{organisationContext.ts → context/organisationContext.ts} +6 -3
- package/src/utils/{sessionTracking.ts → context/sessionTracking.ts} +11 -12
- package/src/utils/{logger.ts → core/logger.ts} +4 -2
- package/src/utils/{deviceFingerprint.ts → device/deviceFingerprint.ts} +1 -1
- package/src/utils/{lazyLoad.tsx → dynamic/lazyLoad.tsx} +2 -2
- package/src/utils/{file-reference.test.ts → file-reference/__tests__/file-reference.test.ts} +5 -5
- package/src/utils/{file-reference.ts → file-reference/index.ts} +20 -38
- package/src/utils/index.ts +32 -54
- package/src/utils/{secureErrors.ts → security/secureErrors.ts} +6 -3
- package/src/utils/{security.ts → security/security.ts} +5 -2
- package/src/utils/storage/__tests__/helpers.unit.test.ts +1 -4
- package/src/utils/storage/helpers.ts +15 -8
- package/src/{components/Dialog/utils/__tests__/safeHtml.unit.test.ts → utils/validation/__tests__/htmlSanitization.unit.test.ts} +9 -15
- package/src/{validation → utils/validation}/csrf.ts +1 -1
- package/src/{components/Dialog/utils/safeHtml.ts → utils/validation/htmlSanitization.ts} +9 -10
- package/src/utils/validation/index.ts +79 -0
- package/src/utils/{sanitization.ts → validation/sanitization.ts} +71 -2
- package/src/{validation/schemaUtils.ts → utils/validation/schema.ts} +11 -6
- package/src/{validation → utils/validation}/sqlInjectionProtection.ts +2 -0
- package/src/utils/{validationUtils.ts → validation/validationUtils.ts} +4 -1
- package/src/validation/index.ts +3 -34
- package/dist/UnifiedAuthProvider-CQDZRJIS.js +0 -16
- 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.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/src/components/Dialog/README.md +0 -804
- package/src/components/Form/FormErrorSummary.tsx +0 -113
- package/src/components/Form/FormFieldset.tsx +0 -127
- package/src/components/Form/FormLiveRegion.tsx +0 -198
- package/src/components/PasswordReset/PasswordResetForm.test.tsx +0 -597
- package/src/components/PasswordReset/PasswordResetForm.tsx +0 -201
- package/src/components/PublicLayout/PublicPageDebugger.tsx +0 -104
- package/src/components/PublicLayout/PublicPageDiagnostic.tsx +0 -162
- package/src/components/PublicLayout/__tests__/PublicPageDebugger.test.tsx +0 -185
- package/src/examples/CorrectPublicPageImplementation.tsx +0 -304
- package/src/examples/PublicEventPage.tsx +0 -287
- package/src/examples/PublicPageApp.tsx +0 -321
- package/src/examples/PublicPageUsageExample.tsx +0 -218
- package/src/utils/schemaUtils.ts +0 -37
- 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-CYOHOX3O.js.map} +0 -0
- /package/dist/{UnifiedAuthProvider-CQDZRJIS.js.map → UnifiedAuthProvider-5E5TUNMS.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-2TWNJ46Y.js.map} +0 -0
- /package/dist/{chunk-ZV77RZMU.js.map → chunk-XARJS7CD.js.map} +0 -0
- /package/dist/{useInactivityTracker-MRUU55XI.js.map → useInactivityTracker-TO6ZOF35.js.map} +0 -0
- /package/examples/{public-pages → features/public-pages}/index.ts +0 -0
- /package/examples/{RBAC → features/rbac}/CompleteRBACExample.tsx +0 -0
- /package/examples/{RBAC → features/rbac}/EventBasedApp.tsx +0 -0
- /package/examples/{RBAC → features/rbac}/PermissionExample.tsx +0 -0
- /package/examples/{RBAC → features/rbac}/index.ts +0 -0
- /package/src/utils/{appConfig.ts → app/appConfig.ts} +0 -0
- /package/src/utils/{appNameResolver.simple.test.ts → app/appNameResolver.simple.test.ts} +0 -0
- /package/src/utils/{audit.ts → audit/audit.ts} +0 -0
- /package/src/utils/{organisationContext.test.ts → context/organisationContext.test.ts} +0 -0
- /package/src/utils/{cn.ts → core/cn.ts} +0 -0
- /package/src/utils/{debugLogger.ts → core/debugLogger.ts} +0 -0
- /package/src/utils/{dynamicUtils.ts → dynamic/dynamicUtils.ts} +0 -0
- /package/src/utils/{formatDate.test.ts → formatting/formatDate.test.ts} +0 -0
- /package/src/utils/{formatting.ts → formatting/formatting.ts} +0 -0
- /package/src/utils/{bundleAnalysis.ts → performance/bundleAnalysis.ts} +0 -0
- /package/src/utils/{performanceBenchmark.ts → performance/performanceBenchmark.ts} +0 -0
- /package/src/utils/{performanceBudgets.ts → performance/performanceBudgets.ts} +0 -0
- /package/src/utils/{permissionTypes.ts → permissions/permissionTypes.ts} +0 -0
- /package/src/utils/{permissionUtils.test.ts → permissions/permissionUtils.test.ts} +0 -0
- /package/src/utils/{permissionUtils.ts → permissions/permissionUtils.ts} +0 -0
- /package/src/utils/{auth-utils.ts → security/auth-utils.ts} +0 -0
- /package/src/utils/{secureDataAccess.test.ts → security/secureDataAccess.test.ts} +0 -0
- /package/src/utils/{secureDataAccess.ts → security/secureDataAccess.ts} +0 -0
- /package/src/utils/{secureStorage.ts → security/secureStorage.ts} +0 -0
- /package/src/utils/{securityMonitor.ts → security/securityMonitor.ts} +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/utils/{validation.ts → validation/validation.ts} +0 -0
|
@@ -12,8 +12,19 @@ import { describe, it, expect, beforeEach, vi, afterEach } from 'vitest';
|
|
|
12
12
|
import { EventService } from '../EventService';
|
|
13
13
|
import { Event } from '../../types/unified';
|
|
14
14
|
|
|
15
|
+
// Don't mock the logger - it now works in test mode
|
|
16
|
+
// We'll spy on the Logger class methods in beforeEach to verify calls
|
|
17
|
+
import { Logger } from '../../utils/core/logger';
|
|
18
|
+
|
|
19
|
+
let mockLoggerFunctions: {
|
|
20
|
+
debug: ReturnType<typeof vi.spyOn>;
|
|
21
|
+
error: ReturnType<typeof vi.spyOn>;
|
|
22
|
+
warn: ReturnType<typeof vi.spyOn>;
|
|
23
|
+
info: ReturnType<typeof vi.spyOn>;
|
|
24
|
+
};
|
|
25
|
+
|
|
15
26
|
// Mock secureStorage - must be defined inline in vi.mock due to hoisting
|
|
16
|
-
vi.mock('../../utils/secureStorage', () => {
|
|
27
|
+
vi.mock('../../utils/security/secureStorage', () => {
|
|
17
28
|
const mockSecureStorage = {
|
|
18
29
|
setItem: vi.fn().mockResolvedValue(undefined),
|
|
19
30
|
getItem: vi.fn().mockResolvedValue(null),
|
|
@@ -25,7 +36,7 @@ vi.mock('../../utils/secureStorage', () => {
|
|
|
25
36
|
});
|
|
26
37
|
|
|
27
38
|
// Get reference to mocked secureStorage for test assertions
|
|
28
|
-
import { secureStorage } from '../../utils/secureStorage';
|
|
39
|
+
import { secureStorage } from '../../utils/security/secureStorage';
|
|
29
40
|
const mockSecureStorage = secureStorage as any;
|
|
30
41
|
|
|
31
42
|
// Mock Supabase client
|
|
@@ -86,6 +97,14 @@ describe('EventService', () => {
|
|
|
86
97
|
let eventService: EventService;
|
|
87
98
|
|
|
88
99
|
beforeEach(() => {
|
|
100
|
+
// Spy on Logger methods to verify calls (logger now works in test mode)
|
|
101
|
+
mockLoggerFunctions = {
|
|
102
|
+
debug: vi.spyOn(Logger, 'debug'),
|
|
103
|
+
error: vi.spyOn(Logger, 'error'),
|
|
104
|
+
warn: vi.spyOn(Logger, 'warn'),
|
|
105
|
+
info: vi.spyOn(Logger, 'info'),
|
|
106
|
+
};
|
|
107
|
+
|
|
89
108
|
vi.clearAllMocks();
|
|
90
109
|
mockSupabase = createMockSupabaseClient();
|
|
91
110
|
eventService = new EventService(
|
|
@@ -100,6 +119,11 @@ describe('EventService', () => {
|
|
|
100
119
|
|
|
101
120
|
afterEach(() => {
|
|
102
121
|
eventService.cleanup();
|
|
122
|
+
// Restore spies
|
|
123
|
+
mockLoggerFunctions.debug.mockRestore();
|
|
124
|
+
mockLoggerFunctions.error.mockRestore();
|
|
125
|
+
mockLoggerFunctions.warn.mockRestore();
|
|
126
|
+
mockLoggerFunctions.info.mockRestore();
|
|
103
127
|
vi.clearAllMocks();
|
|
104
128
|
// Clear localStorage
|
|
105
129
|
localStorage.clear();
|
|
@@ -880,7 +904,7 @@ describe('EventService', () => {
|
|
|
880
904
|
|
|
881
905
|
describe('Event Validation', () => {
|
|
882
906
|
it('should handle validation error gracefully', () => {
|
|
883
|
-
|
|
907
|
+
vi.clearAllMocks();
|
|
884
908
|
|
|
885
909
|
const eventFromDifferentOrg: Event = {
|
|
886
910
|
...mockEvent,
|
|
@@ -890,8 +914,16 @@ describe('EventService', () => {
|
|
|
890
914
|
// Should not throw error
|
|
891
915
|
eventService.setSelectedEvent(eventFromDifferentOrg);
|
|
892
916
|
|
|
893
|
-
|
|
894
|
-
|
|
917
|
+
// The logger should be called synchronously when validation fails
|
|
918
|
+
expect(mockLoggerFunctions.error).toHaveBeenCalledWith(
|
|
919
|
+
'EventService',
|
|
920
|
+
'Event organisation_id does not match selected organisation',
|
|
921
|
+
expect.objectContaining({
|
|
922
|
+
eventOrganisationId: 'org-2',
|
|
923
|
+
selectedOrganisationId: 'org-1',
|
|
924
|
+
eventName: expect.any(String)
|
|
925
|
+
})
|
|
926
|
+
);
|
|
895
927
|
});
|
|
896
928
|
|
|
897
929
|
it('should handle missing organisation during validation', () => {
|
|
@@ -11,6 +11,17 @@
|
|
|
11
11
|
import { describe, it, expect, beforeEach, vi, afterEach } from 'vitest';
|
|
12
12
|
import { InactivityService } from '../InactivityService';
|
|
13
13
|
|
|
14
|
+
// Don't mock the logger - it now works in test mode
|
|
15
|
+
// We'll spy on the Logger class methods in beforeEach to verify calls
|
|
16
|
+
import { Logger } from '../../utils/core/logger';
|
|
17
|
+
|
|
18
|
+
let mockLoggerFunctions: {
|
|
19
|
+
debug: ReturnType<typeof vi.spyOn>;
|
|
20
|
+
error: ReturnType<typeof vi.spyOn>;
|
|
21
|
+
warn: ReturnType<typeof vi.spyOn>;
|
|
22
|
+
info: ReturnType<typeof vi.spyOn>;
|
|
23
|
+
};
|
|
24
|
+
|
|
14
25
|
// Mock Supabase client
|
|
15
26
|
const createMockSupabaseClient = () => ({
|
|
16
27
|
auth: {
|
|
@@ -48,6 +59,14 @@ describe('InactivityService', () => {
|
|
|
48
59
|
let mockOnIdleLogout: ReturnType<typeof vi.fn>;
|
|
49
60
|
|
|
50
61
|
beforeEach(() => {
|
|
62
|
+
// Spy on Logger methods to verify calls (logger now works in test mode)
|
|
63
|
+
mockLoggerFunctions = {
|
|
64
|
+
debug: vi.spyOn(Logger, 'debug'),
|
|
65
|
+
error: vi.spyOn(Logger, 'error'),
|
|
66
|
+
warn: vi.spyOn(Logger, 'warn'),
|
|
67
|
+
info: vi.spyOn(Logger, 'info'),
|
|
68
|
+
};
|
|
69
|
+
|
|
51
70
|
mockSupabase = createMockSupabaseClient();
|
|
52
71
|
mockOnIdleLogout = vi.fn();
|
|
53
72
|
|
|
@@ -64,6 +83,11 @@ describe('InactivityService', () => {
|
|
|
64
83
|
|
|
65
84
|
afterEach(() => {
|
|
66
85
|
inactivityService.cleanup();
|
|
86
|
+
// Restore spies
|
|
87
|
+
mockLoggerFunctions.debug.mockRestore();
|
|
88
|
+
mockLoggerFunctions.error.mockRestore();
|
|
89
|
+
mockLoggerFunctions.warn.mockRestore();
|
|
90
|
+
mockLoggerFunctions.info.mockRestore();
|
|
67
91
|
vi.clearAllMocks();
|
|
68
92
|
});
|
|
69
93
|
|
|
@@ -498,8 +522,15 @@ describe('InactivityService', () => {
|
|
|
498
522
|
});
|
|
499
523
|
|
|
500
524
|
it('should log production warning when enabled', async () => {
|
|
501
|
-
|
|
525
|
+
vi.clearAllMocks();
|
|
502
526
|
const originalMode = import.meta.env.MODE;
|
|
527
|
+
const originalWindow = global.window;
|
|
528
|
+
|
|
529
|
+
// Ensure window is defined for the test
|
|
530
|
+
if (typeof global.window === 'undefined') {
|
|
531
|
+
(global as any).window = {};
|
|
532
|
+
}
|
|
533
|
+
|
|
503
534
|
(import.meta.env as any).MODE = 'production';
|
|
504
535
|
|
|
505
536
|
const service = new InactivityService(
|
|
@@ -514,12 +545,15 @@ describe('InactivityService', () => {
|
|
|
514
545
|
await service.initialize();
|
|
515
546
|
|
|
516
547
|
// Should log warning in production
|
|
517
|
-
expect(
|
|
518
|
-
|
|
548
|
+
expect(mockLoggerFunctions.warn).toHaveBeenCalledWith(
|
|
549
|
+
'InactivityService',
|
|
550
|
+
'Inactivity feature enabled in production'
|
|
519
551
|
);
|
|
520
552
|
|
|
521
553
|
(import.meta.env as any).MODE = originalMode;
|
|
522
|
-
|
|
554
|
+
if (originalWindow === undefined) {
|
|
555
|
+
delete (global as any).window;
|
|
556
|
+
}
|
|
523
557
|
service.cleanup();
|
|
524
558
|
});
|
|
525
559
|
});
|
|
@@ -74,7 +74,7 @@ const mockMembership2: OrganisationMembership = {
|
|
|
74
74
|
};
|
|
75
75
|
|
|
76
76
|
// Mock the organisationContext utility
|
|
77
|
-
vi.mock('../../utils/organisationContext', () => ({
|
|
77
|
+
vi.mock('../../utils/context/organisationContext', () => ({
|
|
78
78
|
setOrganisationContext: vi.fn().mockResolvedValue(undefined)
|
|
79
79
|
}));
|
|
80
80
|
|
|
@@ -157,11 +157,6 @@ describe('OrganisationService', () => {
|
|
|
157
157
|
p_user_id: mockUser.id,
|
|
158
158
|
p_organisation_id: null
|
|
159
159
|
});
|
|
160
|
-
|
|
161
|
-
// Debug: Check if state was populated
|
|
162
|
-
console.log('Memberships:', organisationService.getUserMemberships());
|
|
163
|
-
console.log('Organisations:', organisationService.getOrganisations());
|
|
164
|
-
console.log('Selected:', organisationService.getSelectedOrganisation());
|
|
165
160
|
});
|
|
166
161
|
|
|
167
162
|
it('should handle missing dependencies gracefully', async () => {
|
|
@@ -706,7 +701,7 @@ describe('OrganisationService', () => {
|
|
|
706
701
|
it('should handle database context setting timeout', async () => {
|
|
707
702
|
vi.useFakeTimers();
|
|
708
703
|
|
|
709
|
-
const { setOrganisationContext } = await import('../../utils/organisationContext');
|
|
704
|
+
const { setOrganisationContext } = await import('../../utils/context/organisationContext');
|
|
710
705
|
vi.mocked(setOrganisationContext).mockImplementation(() => {
|
|
711
706
|
return new Promise(() => {
|
|
712
707
|
// Never resolves, will timeout after 5 seconds
|
|
@@ -729,7 +724,7 @@ describe('OrganisationService', () => {
|
|
|
729
724
|
});
|
|
730
725
|
|
|
731
726
|
it('should handle database context setting error', async () => {
|
|
732
|
-
const { setOrganisationContext } = await import('../../utils/organisationContext');
|
|
727
|
+
const { setOrganisationContext } = await import('../../utils/context/organisationContext');
|
|
733
728
|
vi.mocked(setOrganisationContext).mockRejectedValue(new Error('Database error'));
|
|
734
729
|
|
|
735
730
|
organisationService.setSelectedOrganisation(mockOrganisation);
|
|
@@ -8,6 +8,8 @@
|
|
|
8
8
|
* All services extend this class to provide state change notifications.
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
+
import { logger } from '../../utils/core/logger';
|
|
12
|
+
|
|
11
13
|
export type StateChangeCallback = () => void;
|
|
12
14
|
|
|
13
15
|
export abstract class BaseService {
|
|
@@ -40,7 +42,7 @@ export abstract class BaseService {
|
|
|
40
42
|
try {
|
|
41
43
|
callback();
|
|
42
44
|
} catch (error) {
|
|
43
|
-
|
|
45
|
+
logger.error('BaseService', 'Error in subscriber callback:', error);
|
|
44
46
|
}
|
|
45
47
|
});
|
|
46
48
|
}
|
|
@@ -17,6 +17,20 @@ import {
|
|
|
17
17
|
type PaletteData
|
|
18
18
|
} from '../runtime';
|
|
19
19
|
|
|
20
|
+
// Mock the Logger module
|
|
21
|
+
vi.mock('../../utils/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 '../../utils/core/logger';
|
|
32
|
+
const getMockLogger = () => createLogger('test');
|
|
33
|
+
|
|
20
34
|
// Create proper mock for style object that mimics CSSStyleDeclaration
|
|
21
35
|
const createMockStyle = () => {
|
|
22
36
|
const data = {
|
|
@@ -69,25 +83,18 @@ const mockDocument = {
|
|
|
69
83
|
get documentElement() { return mockDocumentElement; },
|
|
70
84
|
head: {
|
|
71
85
|
appendChild: vi.fn()
|
|
86
|
+
},
|
|
87
|
+
body: {
|
|
88
|
+
innerHTML: ''
|
|
72
89
|
}
|
|
73
90
|
};
|
|
74
91
|
|
|
75
|
-
const mockConsole = {
|
|
76
|
-
warn: vi.fn(),
|
|
77
|
-
log: vi.fn()
|
|
78
|
-
};
|
|
79
|
-
|
|
80
92
|
// Mock global objects
|
|
81
93
|
Object.defineProperty(global, 'document', {
|
|
82
94
|
value: mockDocument,
|
|
83
95
|
writable: true
|
|
84
96
|
});
|
|
85
97
|
|
|
86
|
-
Object.defineProperty(global, 'console', {
|
|
87
|
-
value: mockConsole,
|
|
88
|
-
writable: true
|
|
89
|
-
});
|
|
90
|
-
|
|
91
98
|
describe('[theming] applyPalette', () => {
|
|
92
99
|
beforeEach(() => {
|
|
93
100
|
vi.clearAllMocks();
|
|
@@ -154,7 +161,8 @@ describe('[theming] applyPalette', () => {
|
|
|
154
161
|
};
|
|
155
162
|
|
|
156
163
|
expect(() => applyPalette(palette)).not.toThrow();
|
|
157
|
-
|
|
164
|
+
const logger = getMockLogger();
|
|
165
|
+
expect(vi.mocked(logger.warn)).toHaveBeenCalledWith('Document not available (SSR) - palette not applied');
|
|
158
166
|
|
|
159
167
|
// Restore document
|
|
160
168
|
Object.defineProperty(global, 'document', {
|
|
@@ -177,7 +185,8 @@ describe('[theming] applyPalette', () => {
|
|
|
177
185
|
};
|
|
178
186
|
|
|
179
187
|
expect(() => applyPalette(palette)).not.toThrow();
|
|
180
|
-
|
|
188
|
+
const logger = getMockLogger();
|
|
189
|
+
expect(vi.mocked(logger.warn)).toHaveBeenCalledWith('Document not available (SSR) - palette not applied');
|
|
181
190
|
|
|
182
191
|
// Restore document
|
|
183
192
|
Object.defineProperty(global, 'document', {
|
|
@@ -6,26 +6,12 @@
|
|
|
6
6
|
*
|
|
7
7
|
* Shared utility for parsing and normalizing event_colours from database.
|
|
8
8
|
* Handles multiple input formats and ensures consistent palette structure.
|
|
9
|
-
*
|
|
10
|
-
* Supports:
|
|
11
|
-
* - Object format: { main: {...}, sec: {...}, acc: {...} }
|
|
12
|
-
* - String format: JSON string that will be parsed
|
|
13
|
-
* - Legacy format: { "ev-main": {...}, "ev-sec": {...}, "ev-acc": {...} }
|
|
14
|
-
*
|
|
15
|
-
* The function only includes explicitly defined color values, ensuring
|
|
16
|
-
* that undefined shades are not included in the palette.
|
|
17
|
-
*
|
|
18
|
-
* @example
|
|
19
|
-
* ```ts
|
|
20
|
-
* import { parseAndNormalizeEventColours } from '@jmruthers/pace-core/theming/parseEventColours';
|
|
21
|
-
*
|
|
22
|
-
* const palette = parseAndNormalizeEventColours(event.event_colours);
|
|
23
|
-
* if (palette) {
|
|
24
|
-
* applyPalette(palette);
|
|
25
|
-
* }
|
|
26
|
-
* ```
|
|
27
9
|
*/
|
|
28
10
|
|
|
11
|
+
import { createLogger } from '../utils/core/logger';
|
|
12
|
+
|
|
13
|
+
const log = createLogger('ParseEventColours');
|
|
14
|
+
|
|
29
15
|
/**
|
|
30
16
|
* Parse and normalize event_colours to PaletteData
|
|
31
17
|
*
|
|
@@ -116,7 +102,7 @@ export function parseAndNormalizeEventColours(input: unknown): { main: any; sec:
|
|
|
116
102
|
acc: fill(acc)
|
|
117
103
|
};
|
|
118
104
|
} catch (error) {
|
|
119
|
-
|
|
105
|
+
log.warn('Failed to parse/normalize event colours:', error);
|
|
120
106
|
return null;
|
|
121
107
|
}
|
|
122
108
|
}
|
package/src/theming/runtime.ts
CHANGED
|
@@ -6,7 +6,13 @@
|
|
|
6
6
|
*
|
|
7
7
|
* Runtime helpers for palette replacement from organisation/event payloads.
|
|
8
8
|
* Provides simple applyPalette() and clearPalette() API with SSR support.
|
|
9
|
-
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { createLogger } from '../utils/core/logger';
|
|
12
|
+
|
|
13
|
+
const log = createLogger('ThemingRuntime');
|
|
14
|
+
|
|
15
|
+
/**
|
|
10
16
|
* @example
|
|
11
17
|
* ```ts
|
|
12
18
|
* import { applyPalette, clearPalette } from '@jmruthers/pace-core/theming/runtime';
|
|
@@ -63,9 +69,7 @@ function formatOklchCss(color: ColorShade): string {
|
|
|
63
69
|
*/
|
|
64
70
|
export function applyPalette(palette: PaletteData): void {
|
|
65
71
|
if (typeof document === 'undefined' || document === null) {
|
|
66
|
-
|
|
67
|
-
console.warn('applyPalette: Document not available (SSR)');
|
|
68
|
-
}
|
|
72
|
+
log.warn('Document not available (SSR) - palette not applied');
|
|
69
73
|
return;
|
|
70
74
|
}
|
|
71
75
|
|
package/src/types/validation.ts
CHANGED
|
@@ -102,7 +102,6 @@ export const contactFormSchema = z.object({
|
|
|
102
102
|
|
|
103
103
|
export type LoginFormValues = z.infer<typeof loginSchema>;
|
|
104
104
|
export type RegistrationFormValues = z.infer<typeof registrationSchema>;
|
|
105
|
-
export type PasswordResetFormValues = z.infer<typeof passwordResetSchema>;
|
|
106
105
|
export type ChangePasswordFormValues = z.infer<typeof changePasswordSchema>;
|
|
107
106
|
export type UserProfileFormValues = z.infer<typeof userProfileSchema>;
|
|
108
107
|
|
|
@@ -120,11 +119,6 @@ export type SecureRegistrationFormValues = {
|
|
|
120
119
|
csrfToken?: string;
|
|
121
120
|
};
|
|
122
121
|
|
|
123
|
-
export type SecurePasswordResetFormValues = {
|
|
124
|
-
email: string;
|
|
125
|
-
csrfToken?: string;
|
|
126
|
-
};
|
|
127
|
-
|
|
128
122
|
// ============================================================================
|
|
129
123
|
// Utility Types
|
|
130
124
|
// ============================================================================
|
|
@@ -139,26 +133,5 @@ export type ContactFormData = z.infer<typeof contactFormSchema>;
|
|
|
139
133
|
// ============================================================================
|
|
140
134
|
// Schema Utility Functions
|
|
141
135
|
// ============================================================================
|
|
142
|
-
|
|
143
|
-
export
|
|
144
|
-
schema: T,
|
|
145
|
-
keys: K[]
|
|
146
|
-
): z.ZodObject<Pick<z.infer<T>, K>> {
|
|
147
|
-
const shape = Object.entries(schema.shape)
|
|
148
|
-
.filter(([key]) => keys.includes(key as K))
|
|
149
|
-
.reduce((acc, [key, value]) => {
|
|
150
|
-
(acc as Record<string, unknown>)[key] = value as unknown;
|
|
151
|
-
return acc;
|
|
152
|
-
}, {} as Record<string, unknown>);
|
|
153
|
-
|
|
154
|
-
return z.object(shape as Record<string, z.ZodTypeAny>) as z.ZodObject<Pick<z.infer<T>, K>>;
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
export function combineSchemas<T extends z.ZodObject<any, any, any>[]>(
|
|
158
|
-
schemas: T
|
|
159
|
-
): z.ZodObject<any, any, any> {
|
|
160
|
-
return schemas.reduce(
|
|
161
|
-
(merged, schema) => merged.merge(schema),
|
|
162
|
-
z.object({})
|
|
163
|
-
);
|
|
164
|
-
}
|
|
136
|
+
// Re-exported from utils/validation/schema.ts
|
|
137
|
+
export { pickSchema, combineSchemas } from '../utils/validation/schema';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect, beforeEach, vi } from 'vitest';
|
|
2
|
-
import { setAppConfig, getAppConfig, getCurrentAppName, getCurrentAppId } from '../appConfig';
|
|
2
|
+
import { setAppConfig, getAppConfig, getCurrentAppName, getCurrentAppId } from '../app/appConfig';
|
|
3
3
|
|
|
4
4
|
describe('App Configuration Utilities', () => {
|
|
5
5
|
beforeEach(() => {
|
|
@@ -25,7 +25,7 @@ describe('bundleAnalysis', () => {
|
|
|
25
25
|
|
|
26
26
|
// Clear module cache and re-import
|
|
27
27
|
vi.resetModules();
|
|
28
|
-
const { bundleAnalyzer } = await import('../bundleAnalysis');
|
|
28
|
+
const { bundleAnalyzer } = await import('../performance/bundleAnalysis');
|
|
29
29
|
const result = bundleAnalyzer.analyzeBundle();
|
|
30
30
|
|
|
31
31
|
expect(result).toBeNull();
|
|
@@ -39,7 +39,7 @@ describe('bundleAnalysis', () => {
|
|
|
39
39
|
|
|
40
40
|
// Clear module cache and re-import to pick up environment change
|
|
41
41
|
vi.resetModules();
|
|
42
|
-
const { bundleAnalyzer } = await import('../bundleAnalysis');
|
|
42
|
+
const { bundleAnalyzer } = await import('../performance/bundleAnalysis');
|
|
43
43
|
const result = bundleAnalyzer.analyzeBundle();
|
|
44
44
|
|
|
45
45
|
expect(result).toEqual({
|
|
@@ -59,7 +59,7 @@ describe('bundleAnalysis', () => {
|
|
|
59
59
|
// Clear module cache and re-import to pick up environment change
|
|
60
60
|
vi.resetModules();
|
|
61
61
|
const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => {});
|
|
62
|
-
const { bundleAnalyzer } = await import('../bundleAnalysis');
|
|
62
|
+
const { bundleAnalyzer } = await import('../performance/bundleAnalysis');
|
|
63
63
|
bundleAnalyzer.analyzeBundle();
|
|
64
64
|
|
|
65
65
|
expect(consoleSpy).toHaveBeenCalledWith('Bundle analysis would run here in development');
|
|
@@ -79,7 +79,7 @@ describe('bundleAnalysis', () => {
|
|
|
79
79
|
process.env.NODE_ENV = 'production';
|
|
80
80
|
|
|
81
81
|
vi.resetModules();
|
|
82
|
-
const { bundleAnalyzer } = await import('../bundleAnalysis');
|
|
82
|
+
const { bundleAnalyzer } = await import('../performance/bundleAnalysis');
|
|
83
83
|
bundleAnalyzer.checkTreeshaking();
|
|
84
84
|
|
|
85
85
|
expect(consoleSpy.group).not.toHaveBeenCalled();
|
|
@@ -96,7 +96,7 @@ describe('bundleAnalysis', () => {
|
|
|
96
96
|
const consoleSpy = vi.spyOn(console, 'group').mockImplementation(() => {});
|
|
97
97
|
const consoleLogSpy = vi.spyOn(console, 'log').mockImplementation(() => {});
|
|
98
98
|
const consoleGroupEndSpy = vi.spyOn(console, 'groupEnd').mockImplementation(() => {});
|
|
99
|
-
const { bundleAnalyzer } = await import('../bundleAnalysis');
|
|
99
|
+
const { bundleAnalyzer } = await import('../performance/bundleAnalysis');
|
|
100
100
|
bundleAnalyzer.checkTreeshaking();
|
|
101
101
|
|
|
102
102
|
expect(consoleSpy).toHaveBeenCalledWith('Tree-shaking Analysis');
|
|
@@ -119,7 +119,7 @@ describe('bundleAnalysis', () => {
|
|
|
119
119
|
process.env.NODE_ENV = 'production';
|
|
120
120
|
|
|
121
121
|
vi.resetModules();
|
|
122
|
-
const { bundleAnalyzer } = await import('../bundleAnalysis');
|
|
122
|
+
const { bundleAnalyzer } = await import('../performance/bundleAnalysis');
|
|
123
123
|
bundleAnalyzer.validateExports();
|
|
124
124
|
|
|
125
125
|
expect(consoleSpy.group).not.toHaveBeenCalled();
|
|
@@ -136,7 +136,7 @@ describe('bundleAnalysis', () => {
|
|
|
136
136
|
const consoleSpy = vi.spyOn(console, 'group').mockImplementation(() => {});
|
|
137
137
|
const consoleLogSpy = vi.spyOn(console, 'log').mockImplementation(() => {});
|
|
138
138
|
const consoleGroupEndSpy = vi.spyOn(console, 'groupEnd').mockImplementation(() => {});
|
|
139
|
-
const { bundleAnalyzer } = await import('../bundleAnalysis');
|
|
139
|
+
const { bundleAnalyzer } = await import('../performance/bundleAnalysis');
|
|
140
140
|
bundleAnalyzer.validateExports();
|
|
141
141
|
|
|
142
142
|
expect(consoleSpy).toHaveBeenCalledWith('Export Validation');
|
|
@@ -156,7 +156,7 @@ describe('bundleAnalysis', () => {
|
|
|
156
156
|
describe('bundleAnalyzer.generateReport', () => {
|
|
157
157
|
it('should generate a comprehensive bundle analysis report', async () => {
|
|
158
158
|
vi.resetModules();
|
|
159
|
-
const { bundleAnalyzer } = await import('../bundleAnalysis');
|
|
159
|
+
const { bundleAnalyzer } = await import('../performance/bundleAnalysis');
|
|
160
160
|
const report = bundleAnalyzer.generateReport();
|
|
161
161
|
|
|
162
162
|
expect(report).toContain('# Bundle Analysis Report');
|
|
@@ -173,7 +173,7 @@ describe('bundleAnalysis', () => {
|
|
|
173
173
|
|
|
174
174
|
it('should include specific recommendations', async () => {
|
|
175
175
|
vi.resetModules();
|
|
176
|
-
const { bundleAnalyzer } = await import('../bundleAnalysis');
|
|
176
|
+
const { bundleAnalyzer } = await import('../performance/bundleAnalysis');
|
|
177
177
|
const report = bundleAnalyzer.generateReport();
|
|
178
178
|
|
|
179
179
|
expect(report).toContain('Lazy load heavy UI components (charts, complex forms)');
|
|
@@ -190,7 +190,7 @@ describe('bundleAnalysis', () => {
|
|
|
190
190
|
process.env.NODE_ENV = 'production';
|
|
191
191
|
|
|
192
192
|
vi.resetModules();
|
|
193
|
-
const { validateImportPattern } = await import('../bundleAnalysis');
|
|
193
|
+
const { validateImportPattern } = await import('../performance/bundleAnalysis');
|
|
194
194
|
validateImportPattern('lodash', ['debounce', 'throttle']);
|
|
195
195
|
|
|
196
196
|
expect(consoleSpy.warn).not.toHaveBeenCalled();
|
|
@@ -204,7 +204,7 @@ describe('bundleAnalysis', () => {
|
|
|
204
204
|
|
|
205
205
|
vi.resetModules();
|
|
206
206
|
const consoleSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
207
|
-
const { validateImportPattern } = await import('../bundleAnalysis');
|
|
207
|
+
const { validateImportPattern } = await import('../performance/bundleAnalysis');
|
|
208
208
|
validateImportPattern('lodash', ['debounce', 'throttle', 'map', 'filter', 'reduce', 'forEach']);
|
|
209
209
|
|
|
210
210
|
expect(consoleSpy).toHaveBeenCalledWith(
|
|
@@ -221,7 +221,7 @@ describe('bundleAnalysis', () => {
|
|
|
221
221
|
process.env.NODE_ENV = 'development';
|
|
222
222
|
|
|
223
223
|
vi.resetModules();
|
|
224
|
-
const { validateImportPattern } = await import('../bundleAnalysis');
|
|
224
|
+
const { validateImportPattern } = await import('../performance/bundleAnalysis');
|
|
225
225
|
validateImportPattern('lodash', ['debounce', 'throttle']);
|
|
226
226
|
|
|
227
227
|
expect(consoleSpy.warn).not.toHaveBeenCalled();
|
|
@@ -234,7 +234,7 @@ describe('bundleAnalysis', () => {
|
|
|
234
234
|
process.env.NODE_ENV = 'development';
|
|
235
235
|
|
|
236
236
|
vi.resetModules();
|
|
237
|
-
const { validateImportPattern } = await import('../bundleAnalysis');
|
|
237
|
+
const { validateImportPattern } = await import('../performance/bundleAnalysis');
|
|
238
238
|
validateImportPattern('small-module', ['func1', 'func2', 'func3', 'func4', 'func5', 'func6']);
|
|
239
239
|
|
|
240
240
|
expect(consoleSpy.warn).not.toHaveBeenCalled();
|
|
@@ -248,7 +248,7 @@ describe('bundleAnalysis', () => {
|
|
|
248
248
|
|
|
249
249
|
vi.resetModules();
|
|
250
250
|
const consoleSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
251
|
-
const { validateImportPattern } = await import('../bundleAnalysis');
|
|
251
|
+
const { validateImportPattern } = await import('../performance/bundleAnalysis');
|
|
252
252
|
validateImportPattern('lodash-es', ['debounce', 'throttle', 'map', 'filter', 'reduce', 'forEach']);
|
|
253
253
|
|
|
254
254
|
expect(consoleSpy).toHaveBeenCalled();
|
|
@@ -263,7 +263,7 @@ describe('bundleAnalysis', () => {
|
|
|
263
263
|
|
|
264
264
|
vi.resetModules();
|
|
265
265
|
const consoleSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
266
|
-
const { validateImportPattern } = await import('../bundleAnalysis');
|
|
266
|
+
const { validateImportPattern } = await import('../performance/bundleAnalysis');
|
|
267
267
|
validateImportPattern('moment', ['format', 'parse', 'add', 'subtract', 'diff', 'isValid']);
|
|
268
268
|
|
|
269
269
|
expect(consoleSpy).toHaveBeenCalled();
|
|
@@ -278,7 +278,7 @@ describe('bundleAnalysis', () => {
|
|
|
278
278
|
|
|
279
279
|
vi.resetModules();
|
|
280
280
|
const consoleSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
281
|
-
const { validateImportPattern } = await import('../bundleAnalysis');
|
|
281
|
+
const { validateImportPattern } = await import('../performance/bundleAnalysis');
|
|
282
282
|
validateImportPattern('rxjs', ['Observable', 'Subject', 'BehaviorSubject', 'map', 'filter', 'switchMap']);
|
|
283
283
|
|
|
284
284
|
expect(consoleSpy).toHaveBeenCalled();
|
|
@@ -294,7 +294,7 @@ describe('bundleAnalysis', () => {
|
|
|
294
294
|
process.env.NODE_ENV = 'production';
|
|
295
295
|
|
|
296
296
|
vi.resetModules();
|
|
297
|
-
const { trackDynamicImport } = await import('../bundleAnalysis');
|
|
297
|
+
const { trackDynamicImport } = await import('../performance/bundleAnalysis');
|
|
298
298
|
trackDynamicImport('some-module');
|
|
299
299
|
|
|
300
300
|
expect(consoleSpy.log).not.toHaveBeenCalled();
|
|
@@ -308,7 +308,7 @@ describe('bundleAnalysis', () => {
|
|
|
308
308
|
|
|
309
309
|
vi.resetModules();
|
|
310
310
|
const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => {});
|
|
311
|
-
const { trackDynamicImport } = await import('../bundleAnalysis');
|
|
311
|
+
const { trackDynamicImport } = await import('../performance/bundleAnalysis');
|
|
312
312
|
trackDynamicImport('react-hook-form');
|
|
313
313
|
|
|
314
314
|
expect(consoleSpy).toHaveBeenCalledWith(
|
|
@@ -325,7 +325,7 @@ describe('bundleAnalysis', () => {
|
|
|
325
325
|
|
|
326
326
|
vi.resetModules();
|
|
327
327
|
const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => {});
|
|
328
|
-
const { trackDynamicImport } = await import('../bundleAnalysis');
|
|
328
|
+
const { trackDynamicImport } = await import('../performance/bundleAnalysis');
|
|
329
329
|
trackDynamicImport('date-fns');
|
|
330
330
|
|
|
331
331
|
expect(consoleSpy).toHaveBeenCalledWith(
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
*/
|
|
14
14
|
|
|
15
15
|
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
16
|
-
import { DebugLogger } from '../debugLogger';
|
|
16
|
+
import { DebugLogger } from '../core/debugLogger';
|
|
17
17
|
|
|
18
18
|
describe('[unit] DebugLogger Tests', () => {
|
|
19
19
|
let originalConsoleLog: typeof console.log;
|
|
@@ -9,7 +9,7 @@ import React from 'react';
|
|
|
9
9
|
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
10
10
|
import { screen, waitFor, act } from '@testing-library/react';
|
|
11
11
|
import '@testing-library/jest-dom';
|
|
12
|
-
import { createLazyComponent, LazyDataTable } from '../lazyLoad';
|
|
12
|
+
import { createLazyComponent, LazyDataTable } from '../dynamic/lazyLoad';
|
|
13
13
|
import { LoadingSpinner } from '../../components/LoadingSpinner/LoadingSpinner';
|
|
14
14
|
import { renderWithProviders } from '../../__tests__/helpers/test-utils';
|
|
15
15
|
|