@jmruthers/pace-core 0.5.134 → 0.5.136
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +219 -9
- package/dist/index.js +49 -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 +3 -3
- 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 +90 -0
- package/docs/api/interfaces/ExportOptions.md +126 -0
- 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 +648 -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 +25 -8
- 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
package/src/utils/index.ts
CHANGED
|
@@ -6,39 +6,50 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
// Core utilities
|
|
9
|
-
export { cn } from './cn';
|
|
10
|
-
export { DebugLogger } from './debugLogger';
|
|
9
|
+
export { cn } from './core/cn';
|
|
10
|
+
export { DebugLogger } from './core/debugLogger';
|
|
11
|
+
export { Logger, logger, createLogger, LogLevel } from './core/logger';
|
|
12
|
+
export type { LoggerConfig } from './core/logger';
|
|
11
13
|
|
|
12
14
|
// App configuration utilities
|
|
13
|
-
export * from './appNameResolver';
|
|
14
|
-
export
|
|
15
|
+
export * from './app/appNameResolver';
|
|
16
|
+
export { setAppConfig, getAppConfig, getCurrentAppId } from './app/appConfig';
|
|
17
|
+
export * from './app/appIdResolver';
|
|
15
18
|
|
|
16
19
|
// Validation and sanitization
|
|
17
20
|
export * from './validation';
|
|
18
|
-
export * from './validationUtils';
|
|
19
|
-
export * from './sanitization';
|
|
20
21
|
|
|
21
22
|
// Security utilities
|
|
22
23
|
export {
|
|
23
24
|
getSecurityHeaders,
|
|
24
25
|
validateSecurityHeaders
|
|
25
|
-
} from './security';
|
|
26
|
+
} from './security/security';
|
|
27
|
+
export type { SecurityEvent } from './security/security';
|
|
26
28
|
|
|
27
|
-
//
|
|
28
|
-
|
|
29
|
+
// Security monitoring utilities
|
|
30
|
+
export {
|
|
31
|
+
securityMonitor
|
|
32
|
+
} from './security/securityMonitor';
|
|
33
|
+
export type { SecureDataAccess } from './security/secureDataAccess';
|
|
29
34
|
|
|
30
35
|
// Performance utilities
|
|
31
36
|
export { useComponentPerformance } from '../hooks/useComponentPerformance';
|
|
32
37
|
export { PERFORMANCE_THRESHOLDS } from '../constants/performance';
|
|
33
|
-
export { createPerformanceBenchmark, measureRenderPerformance } from './performanceBenchmark';
|
|
34
|
-
export type { PerformanceMetrics } from './performanceBenchmark';
|
|
38
|
+
export { createPerformanceBenchmark, measureRenderPerformance } from './performance/performanceBenchmark';
|
|
39
|
+
export type { PerformanceMetrics } from './performance/performanceBenchmark';
|
|
35
40
|
|
|
36
41
|
// Bundle analysis utilities
|
|
37
42
|
export {
|
|
38
43
|
bundleAnalyzer,
|
|
39
44
|
validateImportPattern,
|
|
40
45
|
trackDynamicImport
|
|
41
|
-
} from './bundleAnalysis';
|
|
46
|
+
} from './performance/bundleAnalysis';
|
|
47
|
+
|
|
48
|
+
// Performance budget utilities
|
|
49
|
+
export {
|
|
50
|
+
performanceBudgetMonitor,
|
|
51
|
+
PERFORMANCE_BUDGETS
|
|
52
|
+
} from './performance/performanceBudgets';
|
|
42
53
|
|
|
43
54
|
// Dynamic utility loaders
|
|
44
55
|
export {
|
|
@@ -53,25 +64,10 @@ export {
|
|
|
53
64
|
lazyChartUtils,
|
|
54
65
|
lazyFormUtils,
|
|
55
66
|
lazyCSVUtils
|
|
56
|
-
} from './dynamicUtils';
|
|
57
|
-
|
|
58
|
-
// Performance budget utilities
|
|
59
|
-
export {
|
|
60
|
-
performanceBudgetMonitor,
|
|
61
|
-
PERFORMANCE_BUDGETS
|
|
62
|
-
} from './performanceBudgets';
|
|
67
|
+
} from './dynamic/dynamicUtils';
|
|
63
68
|
|
|
64
69
|
// Lazy loading utilities
|
|
65
|
-
export { createLazyComponent, LazyDataTable } from './lazyLoad';
|
|
66
|
-
|
|
67
|
-
// App configuration utilities
|
|
68
|
-
export {
|
|
69
|
-
setAppConfig,
|
|
70
|
-
getAppConfig,
|
|
71
|
-
getCurrentAppName,
|
|
72
|
-
getCurrentAppId
|
|
73
|
-
} from './appConfig';
|
|
74
|
-
export type { AppConfig } from './appConfig';
|
|
70
|
+
export { createLazyComponent, LazyDataTable } from './dynamic/lazyLoad';
|
|
75
71
|
|
|
76
72
|
// Permission utilities
|
|
77
73
|
export {
|
|
@@ -79,30 +75,18 @@ export {
|
|
|
79
75
|
hasPermission,
|
|
80
76
|
hasAnyPermission,
|
|
81
77
|
hasAllPermissions
|
|
82
|
-
} from './permissionUtils';
|
|
78
|
+
} from './permissions/permissionUtils';
|
|
83
79
|
|
|
84
80
|
// Permission types
|
|
85
81
|
export {
|
|
86
82
|
PermissionType,
|
|
87
83
|
parsePermission
|
|
88
|
-
} from './permissionTypes';
|
|
89
|
-
|
|
90
|
-
// Schema utilities
|
|
91
|
-
export {
|
|
92
|
-
pickSchema,
|
|
93
|
-
combineSchemas
|
|
94
|
-
} from './schemaUtils';
|
|
95
|
-
|
|
96
|
-
// Security monitoring utilities
|
|
97
|
-
export {
|
|
98
|
-
securityMonitor
|
|
99
|
-
} from './securityMonitor';
|
|
100
|
-
export type { SecureDataAccess } from './secureDataAccess';
|
|
84
|
+
} from './permissions/permissionTypes';
|
|
101
85
|
|
|
102
86
|
// Session tracking utilities
|
|
103
87
|
export {
|
|
104
88
|
useSessionTracking
|
|
105
|
-
} from './sessionTracking';
|
|
89
|
+
} from './context/sessionTracking';
|
|
106
90
|
|
|
107
91
|
// Audit utilities
|
|
108
92
|
export {
|
|
@@ -112,14 +96,13 @@ export {
|
|
|
112
96
|
logPermissionEvent,
|
|
113
97
|
logSecurityEvent,
|
|
114
98
|
logAuditEvent
|
|
115
|
-
} from './audit';
|
|
99
|
+
} from './audit/audit';
|
|
116
100
|
|
|
117
101
|
// Device fingerprinting utilities
|
|
118
102
|
export {
|
|
119
103
|
generateDeviceFingerprint,
|
|
120
104
|
validateDeviceFingerprint
|
|
121
|
-
} from './deviceFingerprint';
|
|
122
|
-
|
|
105
|
+
} from './device/deviceFingerprint';
|
|
123
106
|
|
|
124
107
|
// Formatting utilities
|
|
125
108
|
export {
|
|
@@ -129,7 +112,7 @@ export {
|
|
|
129
112
|
formatPercent,
|
|
130
113
|
formatCompactNumber,
|
|
131
114
|
formatFileSize
|
|
132
|
-
} from './formatting';
|
|
115
|
+
} from './formatting/formatting';
|
|
133
116
|
|
|
134
117
|
// Organisation context utilities
|
|
135
118
|
export {
|
|
@@ -137,9 +120,4 @@ export {
|
|
|
137
120
|
clearOrganisationContext,
|
|
138
121
|
getOrganisationContext,
|
|
139
122
|
isOrganisationContextAvailable
|
|
140
|
-
} from './organisationContext';
|
|
141
|
-
|
|
142
|
-
// Re-export types for convenience
|
|
143
|
-
export type {
|
|
144
|
-
SecurityEvent
|
|
145
|
-
} from './security';
|
|
123
|
+
} from './context/organisationContext';
|
|
@@ -2,7 +2,10 @@
|
|
|
2
2
|
* @file Secure error handling utilities
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import { AuthError, AuthErrorCode, RequestId } from '
|
|
5
|
+
import { AuthError, AuthErrorCode, RequestId } from '../../types/unified';
|
|
6
|
+
import { createLogger } from '../core/logger';
|
|
7
|
+
|
|
8
|
+
const log = createLogger('Security');
|
|
6
9
|
|
|
7
10
|
export class SecureError extends Error {
|
|
8
11
|
public readonly code: AuthErrorCode;
|
|
@@ -74,6 +77,6 @@ export function generateRequestId(): RequestId {
|
|
|
74
77
|
|
|
75
78
|
export function logSecurityEvent(event: string, details?: unknown): void {
|
|
76
79
|
// In production, this would send to a proper logging service
|
|
77
|
-
//
|
|
78
|
-
|
|
80
|
+
// Using Logger.warn for now - can be upgraded to audit system later
|
|
81
|
+
log.warn(`Security event: ${event}`, details);
|
|
79
82
|
}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
|
|
2
2
|
import type { SupabaseClient } from '@supabase/supabase-js';
|
|
3
|
+
import { createLogger } from '../core/logger';
|
|
4
|
+
|
|
5
|
+
const log = createLogger('Security');
|
|
3
6
|
|
|
4
7
|
export interface SecurityEvent {
|
|
5
8
|
type: string;
|
|
@@ -10,8 +13,8 @@ export interface SecurityEvent {
|
|
|
10
13
|
|
|
11
14
|
export function logSecurityEvent(event: SecurityEvent): void {
|
|
12
15
|
// In production, this should log to your security monitoring system
|
|
13
|
-
//
|
|
14
|
-
|
|
16
|
+
// Using Logger.warn for now - can be upgraded to audit system later
|
|
17
|
+
log.warn('Security event:', {
|
|
15
18
|
...event,
|
|
16
19
|
timestamp: event.timestamp.toISOString()
|
|
17
20
|
});
|
|
@@ -145,17 +145,14 @@ describe('Storage Helpers', () => {
|
|
|
145
145
|
const originalDigest = crypto.subtle.digest;
|
|
146
146
|
crypto.subtle.digest = vi.fn().mockRejectedValue(new Error('Hash generation failed'));
|
|
147
147
|
|
|
148
|
-
const consoleSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
149
|
-
|
|
150
148
|
const result = await extractFileMetadata(file, baseOptions, 'user-123');
|
|
151
149
|
|
|
152
150
|
// Hash should be undefined when generation fails
|
|
151
|
+
// Note: Error logging was removed as it's non-critical optional metadata
|
|
153
152
|
expect(result.hash).toBeUndefined();
|
|
154
|
-
expect(consoleSpy).toHaveBeenCalledWith('Could not generate file hash:', expect.any(Error));
|
|
155
153
|
|
|
156
154
|
// Restore original function
|
|
157
155
|
crypto.subtle.digest = originalDigest;
|
|
158
|
-
consoleSpy.mockRestore();
|
|
159
156
|
});
|
|
160
157
|
});
|
|
161
158
|
|
|
@@ -13,6 +13,9 @@ import {
|
|
|
13
13
|
StorageFileInfo
|
|
14
14
|
} from './types';
|
|
15
15
|
import { validateFileSize, STORAGE_CONFIG, getBucketName } from './config';
|
|
16
|
+
import { createLogger } from '../core/logger';
|
|
17
|
+
|
|
18
|
+
const log = createLogger('StorageHelpers');
|
|
16
19
|
|
|
17
20
|
/**
|
|
18
21
|
* Generate a file path based on organization-first structure
|
|
@@ -99,7 +102,9 @@ export async function extractFileMetadata(
|
|
|
99
102
|
metadata.width = dimensions.width;
|
|
100
103
|
metadata.height = dimensions.height;
|
|
101
104
|
} catch (error) {
|
|
102
|
-
|
|
105
|
+
// Non-critical error - image dimensions are optional metadata
|
|
106
|
+
// Using Logger would be better, but this is in a utility function
|
|
107
|
+
// For now, silently continue - dimensions are optional
|
|
103
108
|
}
|
|
104
109
|
}
|
|
105
110
|
|
|
@@ -107,7 +112,9 @@ export async function extractFileMetadata(
|
|
|
107
112
|
try {
|
|
108
113
|
metadata.hash = await generateFileHash(file);
|
|
109
114
|
} catch (error) {
|
|
110
|
-
|
|
115
|
+
// Non-critical error - file hash is optional metadata
|
|
116
|
+
// Using Logger would be better, but this is in a utility function
|
|
117
|
+
// For now, silently continue - hash is optional
|
|
111
118
|
}
|
|
112
119
|
|
|
113
120
|
return metadata;
|
|
@@ -331,7 +338,7 @@ export async function getSignedUrl(
|
|
|
331
338
|
.createSignedUrl(path, options.expiresIn || 3600);
|
|
332
339
|
|
|
333
340
|
if (error) {
|
|
334
|
-
|
|
341
|
+
log.error('Failed to create signed URL:', error);
|
|
335
342
|
return null;
|
|
336
343
|
}
|
|
337
344
|
|
|
@@ -340,7 +347,7 @@ export async function getSignedUrl(
|
|
|
340
347
|
expiresAt: new Date(Date.now() + (options.expiresIn || 3600) * 1000).toISOString()
|
|
341
348
|
};
|
|
342
349
|
} catch (error) {
|
|
343
|
-
|
|
350
|
+
log.error('Failed to create signed URL:', error);
|
|
344
351
|
return null;
|
|
345
352
|
}
|
|
346
353
|
}
|
|
@@ -407,7 +414,7 @@ export async function listFiles(
|
|
|
407
414
|
});
|
|
408
415
|
|
|
409
416
|
if (error) {
|
|
410
|
-
|
|
417
|
+
log.error('Failed to list files:', error);
|
|
411
418
|
return { files: [], totalCount: 0, hasMore: false };
|
|
412
419
|
}
|
|
413
420
|
|
|
@@ -434,7 +441,7 @@ export async function listFiles(
|
|
|
434
441
|
hasMore: files.length >= (options.limit || 100)
|
|
435
442
|
};
|
|
436
443
|
} catch (error) {
|
|
437
|
-
|
|
444
|
+
log.error('Failed to list files:', error);
|
|
438
445
|
return { files: [], totalCount: 0, hasMore: false };
|
|
439
446
|
}
|
|
440
447
|
}
|
|
@@ -459,7 +466,7 @@ export async function downloadFile(
|
|
|
459
466
|
.download(path);
|
|
460
467
|
|
|
461
468
|
if (error) {
|
|
462
|
-
|
|
469
|
+
log.error('Failed to download file:', error);
|
|
463
470
|
return null;
|
|
464
471
|
}
|
|
465
472
|
|
|
@@ -488,7 +495,7 @@ export async function downloadFile(
|
|
|
488
495
|
}
|
|
489
496
|
};
|
|
490
497
|
} catch (error) {
|
|
491
|
-
|
|
498
|
+
log.error('Failed to download file:', error);
|
|
492
499
|
return null;
|
|
493
500
|
}
|
|
494
501
|
}
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @file
|
|
2
|
+
* @file HTML Sanitization Utilities Unit Tests
|
|
3
3
|
* @package @jmruthers/pace-core
|
|
4
|
-
* @module
|
|
4
|
+
* @module Utils/Validation/HTMLSanitization/Tests
|
|
5
5
|
* @since 0.4.36
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
9
|
-
import { sanitizeHtml, validateHtml, renderSafeHtml } from '../
|
|
9
|
+
import { sanitizeHtml, validateHtml, renderSafeHtml } from '../htmlSanitization';
|
|
10
10
|
|
|
11
11
|
// Mock console methods to avoid noise in test output
|
|
12
12
|
const originalConsoleLog = console.log;
|
|
13
13
|
const originalConsoleWarn = console.warn;
|
|
14
14
|
|
|
15
|
-
describe('
|
|
15
|
+
describe('HTML Sanitization Utilities', () => {
|
|
16
16
|
afterEach(() => {
|
|
17
17
|
// Restore console methods
|
|
18
18
|
console.log = originalConsoleLog;
|
|
@@ -221,15 +221,8 @@ describe('Safe HTML Utilities', () => {
|
|
|
221
221
|
});
|
|
222
222
|
});
|
|
223
223
|
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
const html = '<p>Test content</p>';
|
|
227
|
-
sanitizeHtml(html);
|
|
228
|
-
|
|
229
|
-
expect(console.log).toHaveBeenCalledWith('🔍 sanitizeHtml input:', html);
|
|
230
|
-
expect(console.log).toHaveBeenCalledWith('🔍 sanitizeHtml output:', html);
|
|
231
|
-
});
|
|
232
|
-
});
|
|
224
|
+
// Note: Debug logging was removed from sanitizeHtml as part of logging cleanup
|
|
225
|
+
// The function now focuses on sanitization without verbose debug output
|
|
233
226
|
});
|
|
234
227
|
|
|
235
228
|
describe('validateHtml', () => {
|
|
@@ -481,7 +474,7 @@ describe('Safe HTML Utilities', () => {
|
|
|
481
474
|
const html = '<p>Safe content</p><script>alert("xss")</script>';
|
|
482
475
|
renderSafeHtml(html, { logWarnings: true });
|
|
483
476
|
|
|
484
|
-
expect(console.warn).toHaveBeenCalledWith('
|
|
477
|
+
expect(console.warn).toHaveBeenCalledWith('HTML content warnings:', ['Script tags are not allowed']);
|
|
485
478
|
});
|
|
486
479
|
|
|
487
480
|
it('should handle both options together', () => {
|
|
@@ -490,7 +483,7 @@ describe('Safe HTML Utilities', () => {
|
|
|
490
483
|
|
|
491
484
|
expect(result.isValid).toBe(false);
|
|
492
485
|
expect(result.warnings).toHaveLength(2);
|
|
493
|
-
expect(console.warn).toHaveBeenCalledWith('
|
|
486
|
+
expect(console.warn).toHaveBeenCalledWith('HTML content warnings:', expect.arrayContaining(['Script tags are not allowed', 'Iframe tags are not allowed']));
|
|
494
487
|
});
|
|
495
488
|
});
|
|
496
489
|
|
|
@@ -602,3 +595,4 @@ describe('Safe HTML Utilities', () => {
|
|
|
602
595
|
});
|
|
603
596
|
});
|
|
604
597
|
});
|
|
598
|
+
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @file
|
|
2
|
+
* @file HTML Sanitization Utilities
|
|
3
3
|
* @package @jmruthers/pace-core
|
|
4
|
-
* @module
|
|
4
|
+
* @module Utils/Validation/HTMLSanitization
|
|
5
5
|
* @since 0.4.36
|
|
6
6
|
*
|
|
7
|
-
* Utilities for safely rendering HTML content
|
|
7
|
+
* Utilities for safely rendering HTML content.
|
|
8
8
|
* Provides sanitization and validation for basic HTML elements.
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
|
-
* Allowed HTML tags for safe rendering
|
|
12
|
+
* Allowed HTML tags for safe rendering
|
|
13
13
|
*/
|
|
14
14
|
const ALLOWED_TAGS = [
|
|
15
15
|
'p', 'div', 'span', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',
|
|
@@ -56,10 +56,6 @@ export function sanitizeHtml(html: string): string {
|
|
|
56
56
|
return '';
|
|
57
57
|
}
|
|
58
58
|
|
|
59
|
-
// For debugging, let's just return the HTML as-is for now
|
|
60
|
-
// This will help us see if the issue is with sanitization or rendering
|
|
61
|
-
console.log('🔍 sanitizeHtml input:', html);
|
|
62
|
-
|
|
63
59
|
// Basic safety: just remove script tags and dangerous attributes
|
|
64
60
|
let sanitized = html
|
|
65
61
|
// Remove script tags (including self-closing and malformed)
|
|
@@ -88,7 +84,6 @@ export function sanitizeHtml(html: string): string {
|
|
|
88
84
|
// Remove data: protocols - correct pattern
|
|
89
85
|
.replace(/data:[^"'\s>]*/gi, '');
|
|
90
86
|
|
|
91
|
-
console.log('🔍 sanitizeHtml output:', sanitized);
|
|
92
87
|
return sanitized;
|
|
93
88
|
}
|
|
94
89
|
|
|
@@ -174,7 +169,10 @@ export function renderSafeHtml(
|
|
|
174
169
|
const sanitizedHtml = sanitizeHtml(html);
|
|
175
170
|
|
|
176
171
|
if (logWarnings && validation.warnings.length > 0) {
|
|
177
|
-
|
|
172
|
+
// Use logger if needed, but this is controlled by logWarnings option
|
|
173
|
+
// For now, keep console.warn as it's only called when explicitly requested
|
|
174
|
+
// via logWarnings option, which is typically for debugging
|
|
175
|
+
console.warn('HTML content warnings:', validation.warnings);
|
|
178
176
|
}
|
|
179
177
|
|
|
180
178
|
return {
|
|
@@ -183,3 +181,4 @@ export function renderSafeHtml(
|
|
|
183
181
|
warnings: validation.warnings
|
|
184
182
|
};
|
|
185
183
|
}
|
|
184
|
+
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Validation Module Exports
|
|
3
|
+
* @package @jmruthers/pace-core
|
|
4
|
+
* @module Utils/Validation
|
|
5
|
+
* @since 0.1.0
|
|
6
|
+
*
|
|
7
|
+
* Consolidated validation utilities and schemas for the PACE Core library.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
// Schema utilities
|
|
11
|
+
export { pickSchema, combineSchemas } from './schema';
|
|
12
|
+
|
|
13
|
+
// Common validation functions
|
|
14
|
+
export {
|
|
15
|
+
isValidEmail,
|
|
16
|
+
isEmpty,
|
|
17
|
+
isStrongPassword,
|
|
18
|
+
isValidUrl,
|
|
19
|
+
isValidDate,
|
|
20
|
+
isWithinRange,
|
|
21
|
+
matchesPattern,
|
|
22
|
+
deepMerge,
|
|
23
|
+
isObject
|
|
24
|
+
} from './validation';
|
|
25
|
+
|
|
26
|
+
// Enhanced validation with sanitization
|
|
27
|
+
export {
|
|
28
|
+
validateUserInput,
|
|
29
|
+
sanitizeUserInput_deprecated,
|
|
30
|
+
emailSchema as enhancedEmailSchema,
|
|
31
|
+
passwordSchema as enhancedPasswordSchema,
|
|
32
|
+
usernameSchema,
|
|
33
|
+
nameSchema as enhancedNameSchema,
|
|
34
|
+
phoneSchema as enhancedPhoneSchema,
|
|
35
|
+
urlSchema as enhancedUrlSchema
|
|
36
|
+
} from './validationUtils';
|
|
37
|
+
|
|
38
|
+
// Sanitization utilities
|
|
39
|
+
export {
|
|
40
|
+
sanitizeUserInput,
|
|
41
|
+
sanitizeFormData,
|
|
42
|
+
sanitizeHtml,
|
|
43
|
+
type SanitizationOptions
|
|
44
|
+
} from './sanitization';
|
|
45
|
+
|
|
46
|
+
// HTML sanitization utilities (allows safe HTML tags)
|
|
47
|
+
export {
|
|
48
|
+
sanitizeHtml as sanitizeHtmlAdvanced,
|
|
49
|
+
validateHtml,
|
|
50
|
+
renderSafeHtml
|
|
51
|
+
} from './htmlSanitization';
|
|
52
|
+
|
|
53
|
+
// Common validation schemas
|
|
54
|
+
export {
|
|
55
|
+
emailSchema,
|
|
56
|
+
nameSchema,
|
|
57
|
+
phoneSchema,
|
|
58
|
+
urlSchema,
|
|
59
|
+
dateSchema
|
|
60
|
+
} from './common';
|
|
61
|
+
|
|
62
|
+
// Security validation
|
|
63
|
+
export * from './csrf';
|
|
64
|
+
export * from './sqlInjectionProtection';
|
|
65
|
+
export * from './passwordSchema';
|
|
66
|
+
export * from './user';
|
|
67
|
+
|
|
68
|
+
// Re-export schemas from types for convenience (these are the canonical schemas)
|
|
69
|
+
export {
|
|
70
|
+
loginSchema,
|
|
71
|
+
registrationSchema,
|
|
72
|
+
secureLoginSchema,
|
|
73
|
+
passwordResetSchema,
|
|
74
|
+
changePasswordSchema,
|
|
75
|
+
userProfileSchema,
|
|
76
|
+
contactFormSchema,
|
|
77
|
+
securePasswordSchema
|
|
78
|
+
} from '../../types/validation';
|
|
79
|
+
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
|
|
2
1
|
/**
|
|
3
2
|
* @file Input Sanitization Layer
|
|
4
3
|
* @package @jmruthers/pace-core
|
|
5
|
-
* @module
|
|
4
|
+
* @module Utils/Validation/Sanitization
|
|
6
5
|
* @since 0.1.0
|
|
7
6
|
*
|
|
8
7
|
* Comprehensive input sanitization utilities to prevent XSS, injection attacks,
|
|
@@ -204,6 +203,10 @@ export function sanitizeFormData<T>(
|
|
|
204
203
|
}
|
|
205
204
|
}
|
|
206
205
|
|
|
206
|
+
// Re-export HTML sanitization from the consolidated module
|
|
207
|
+
// The new implementation allows safe HTML tags while removing dangerous ones
|
|
208
|
+
export { sanitizeHtml } from './htmlSanitization';
|
|
209
|
+
|
|
207
210
|
/**
|
|
208
211
|
* Content Security Policy (CSP) utilities
|
|
209
212
|
*/
|
|
@@ -262,3 +265,69 @@ export class RateLimiter {
|
|
|
262
265
|
this.attempts.delete(identifier);
|
|
263
266
|
}
|
|
264
267
|
}
|
|
268
|
+
|
|
269
|
+
// Validation schemas (kept from previous version)
|
|
270
|
+
/**
|
|
271
|
+
* Enhanced email schema with security checks
|
|
272
|
+
*/
|
|
273
|
+
export const secureEmailSchema = z
|
|
274
|
+
.string()
|
|
275
|
+
.min(1, 'Email is required')
|
|
276
|
+
.email('Invalid email format')
|
|
277
|
+
.max(254, 'Email too long')
|
|
278
|
+
.refine(
|
|
279
|
+
(email) => {
|
|
280
|
+
if (!email || typeof email !== 'string') return false;
|
|
281
|
+
// Basic domain validation
|
|
282
|
+
const domain = email.split('@')[1];
|
|
283
|
+
return domain && domain.includes('.') && domain.length > 3;
|
|
284
|
+
},
|
|
285
|
+
'Invalid email domain'
|
|
286
|
+
)
|
|
287
|
+
.transform((email) => sanitizeEmail(email));
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* Basic email schema for common use
|
|
291
|
+
*/
|
|
292
|
+
export const emailSchema = z
|
|
293
|
+
.string()
|
|
294
|
+
.min(1, 'Email is required')
|
|
295
|
+
.email('Invalid email format');
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* Name validation schema
|
|
299
|
+
*/
|
|
300
|
+
export const nameSchema = z
|
|
301
|
+
.string()
|
|
302
|
+
.min(1, 'Name is required')
|
|
303
|
+
.max(100, 'Name too long')
|
|
304
|
+
.regex(/^[a-zA-Z\s'-]+$/, 'Name contains invalid characters');
|
|
305
|
+
|
|
306
|
+
/**
|
|
307
|
+
* Phone validation schema
|
|
308
|
+
*/
|
|
309
|
+
export const phoneSchema = z
|
|
310
|
+
.string()
|
|
311
|
+
.regex(/^[\+]?[1-9][\d]{0,15}$/, 'Invalid phone number format');
|
|
312
|
+
|
|
313
|
+
/**
|
|
314
|
+
* URL validation schema
|
|
315
|
+
*/
|
|
316
|
+
export const urlSchema = z
|
|
317
|
+
.string()
|
|
318
|
+
.url('Invalid URL format');
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* Date validation schema
|
|
322
|
+
*/
|
|
323
|
+
export const dateSchema = z
|
|
324
|
+
.string()
|
|
325
|
+
.regex(/^\d{4}-\d{2}-\d{2}$/, 'Invalid date format (YYYY-MM-DD)');
|
|
326
|
+
|
|
327
|
+
/**
|
|
328
|
+
* Secure login schema
|
|
329
|
+
*/
|
|
330
|
+
export const secureLoginSchema = z.object({
|
|
331
|
+
email: secureEmailSchema,
|
|
332
|
+
password: z.string().min(1, 'Password is required'),
|
|
333
|
+
});
|
|
@@ -1,6 +1,10 @@
|
|
|
1
|
-
|
|
2
1
|
/**
|
|
3
2
|
* @file Schema utility functions
|
|
3
|
+
* @package @jmruthers/pace-core
|
|
4
|
+
* @module Utils/Validation/Schema
|
|
5
|
+
* @since 0.1.0
|
|
6
|
+
*
|
|
7
|
+
* Utility functions for working with Zod schemas.
|
|
4
8
|
*/
|
|
5
9
|
|
|
6
10
|
import { z } from 'zod';
|
|
@@ -15,15 +19,15 @@ import { z } from 'zod';
|
|
|
15
19
|
export function pickSchema<T extends z.ZodObject<any, any, any>, K extends keyof z.infer<T>>(
|
|
16
20
|
schema: T,
|
|
17
21
|
keys: K[]
|
|
18
|
-
): z.ZodObject<
|
|
22
|
+
): z.ZodObject<Pick<z.infer<T>, K>> {
|
|
19
23
|
const shape = Object.entries(schema.shape)
|
|
20
24
|
.filter(([key]) => keys.includes(key as K))
|
|
21
25
|
.reduce((acc, [key, value]) => {
|
|
22
|
-
acc[key] = value as
|
|
26
|
+
(acc as Record<string, unknown>)[key] = value as unknown;
|
|
23
27
|
return acc;
|
|
24
|
-
}, {} as Record<string,
|
|
28
|
+
}, {} as Record<string, unknown>);
|
|
25
29
|
|
|
26
|
-
return z.object(shape)
|
|
30
|
+
return z.object(shape as Record<string, z.ZodTypeAny>) as z.ZodObject<Pick<z.infer<T>, K>>;
|
|
27
31
|
}
|
|
28
32
|
|
|
29
33
|
/**
|
|
@@ -34,9 +38,10 @@ export function pickSchema<T extends z.ZodObject<any, any, any>, K extends keyof
|
|
|
34
38
|
*/
|
|
35
39
|
export function combineSchemas<T extends z.ZodObject<any, any, any>[]>(
|
|
36
40
|
schemas: T
|
|
37
|
-
): z.ZodObject<any> {
|
|
41
|
+
): z.ZodObject<any, any, any> {
|
|
38
42
|
return schemas.reduce(
|
|
39
43
|
(merged, schema) => merged.merge(schema),
|
|
40
44
|
z.object({})
|
|
41
45
|
);
|
|
42
46
|
}
|
|
47
|
+
|
|
@@ -110,6 +110,8 @@ export function sanitizeFilters(filters: Record<string, unknown>): Record<string
|
|
|
110
110
|
const keyValidation = sqlIdentifierSchema.safeParse(key);
|
|
111
111
|
if (!keyValidation.success) {
|
|
112
112
|
// Log warning for invalid filter keys
|
|
113
|
+
// Note: Using console.warn here is intentional for security events
|
|
114
|
+
// This should eventually use the security audit system
|
|
113
115
|
console.warn(`[SECURITY] Invalid filter key detected and removed: ${key}`);
|
|
114
116
|
continue;
|
|
115
117
|
}
|
|
@@ -7,6 +7,9 @@
|
|
|
7
7
|
|
|
8
8
|
import { z } from 'zod';
|
|
9
9
|
import { sanitizeUserInput, sanitizeFormData, type SanitizationOptions } from './sanitization';
|
|
10
|
+
import { createLogger } from '../core/logger';
|
|
11
|
+
|
|
12
|
+
const log = createLogger('ValidationUtils');
|
|
10
13
|
|
|
11
14
|
/**
|
|
12
15
|
* Validates user input against a schema with automatic sanitization
|
|
@@ -25,7 +28,7 @@ export function validateUserInput<T>(
|
|
|
25
28
|
*/
|
|
26
29
|
export function sanitizeUserInput_deprecated(input: string): string {
|
|
27
30
|
// Log deprecation warning
|
|
28
|
-
|
|
31
|
+
log.warn('sanitizeUserInput is deprecated. Use sanitizeUserInput from lib/sanitization instead.');
|
|
29
32
|
return sanitizeUserInput(input);
|
|
30
33
|
}
|
|
31
34
|
|