@jmruthers/pace-core 0.5.191 → 0.6.1
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/CHANGELOG.md +29 -0
- package/README.md +7 -1
- package/cursor-rules/00-pace-core-compliance.mdc +372 -0
- package/cursor-rules/01-standards-compliance.mdc +275 -0
- package/cursor-rules/02-project-structure.mdc +200 -0
- package/cursor-rules/03-solid-principles.mdc +341 -0
- package/cursor-rules/04-testing-standards.mdc +315 -0
- package/cursor-rules/05-bug-reports-and-features.mdc +246 -0
- package/cursor-rules/06-code-quality.mdc +392 -0
- package/cursor-rules/07-tech-stack-compliance.mdc +309 -0
- package/cursor-rules/CHANGELOG.md +101 -0
- package/cursor-rules/README.md +191 -0
- package/dist/{AuthService-CbP_utw2.d.ts → AuthService-DjnJHDtC.d.ts} +1 -0
- package/dist/{DataTable-Be6dH_dR.d.ts → DataTable-CH1U5Tpy.d.ts} +1 -1
- package/dist/{DataTable-WKRZD47S.js → DataTable-DQ7RSOHE.js} +8 -7
- package/dist/{PublicPageProvider-ULXC_u6U.d.ts → PublicPageProvider-ce4xlHYA.d.ts} +37 -156
- package/dist/{UnifiedAuthProvider-BYA9qB-o.d.ts → UnifiedAuthProvider-185Ih4dj.d.ts} +2 -0
- package/dist/{UnifiedAuthProvider-FTSG5XH7.js → UnifiedAuthProvider-ATAP5UTR.js} +3 -3
- package/dist/{api-IHKALJZD.js → api-N774RPUA.js} +2 -2
- package/dist/{chunk-6C4YBBJM.js → chunk-3QRJFVBR.js} +1 -1
- package/dist/chunk-3QRJFVBR.js.map +1 -0
- package/dist/{chunk-OETXORNB.js → chunk-3XTALGJF.js} +211 -136
- package/dist/chunk-3XTALGJF.js.map +1 -0
- package/dist/{chunk-6TQDD426.js → chunk-4N5C5XZU.js} +47 -228
- package/dist/chunk-4N5C5XZU.js.map +1 -0
- package/dist/{chunk-LOMZXPSN.js → chunk-4ZC4GX36.js} +47 -74
- package/dist/chunk-4ZC4GX36.js.map +1 -0
- package/dist/{chunk-6LTQQAT6.js → chunk-BYFSK72L.js} +357 -158
- package/dist/chunk-BYFSK72L.js.map +1 -0
- package/dist/{chunk-XYXSXPUK.js → chunk-EXUD6RNJ.js} +50 -10
- package/dist/chunk-EXUD6RNJ.js.map +1 -0
- package/dist/{chunk-VKB2CO4Z.js → chunk-GLK6VM3F.js} +244 -249
- package/dist/chunk-GLK6VM3F.js.map +1 -0
- package/dist/{chunk-HW3OVDUF.js → chunk-J36DSWQK.js} +1 -1
- package/dist/{chunk-HW3OVDUF.js.map → chunk-J36DSWQK.js.map} +1 -1
- package/dist/{chunk-XNYQOL3Z.js → chunk-JBKQ3SAO.js} +9 -18
- package/dist/chunk-JBKQ3SAO.js.map +1 -0
- package/dist/{chunk-ROXMHMY2.js → chunk-KNC55RTG.js} +13 -3
- package/dist/{chunk-ROXMHMY2.js.map → chunk-KNC55RTG.js.map} +1 -1
- package/dist/{chunk-QWWZ5CAQ.js → chunk-LXQLPRQ2.js} +2 -2
- package/dist/{chunk-ULHIJK66.js → chunk-T33XF5ZC.js} +255 -140
- package/dist/chunk-T33XF5ZC.js.map +1 -0
- package/dist/{chunk-VRGWKHDB.js → chunk-XM25TVIE.js} +100 -33
- package/dist/chunk-XM25TVIE.js.map +1 -0
- package/dist/components.d.ts +4 -4
- package/dist/components.js +9 -9
- package/dist/hooks.d.ts +6 -6
- package/dist/hooks.js +20 -25
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +11 -11
- package/dist/index.js +18 -21
- package/dist/index.js.map +1 -1
- package/dist/providers.d.ts +3 -3
- package/dist/providers.js +2 -2
- package/dist/rbac/index.d.ts +2 -20
- package/dist/rbac/index.js +7 -9
- package/dist/{usePublicRouteParams-TZe0gy-4.d.ts → usePublicRouteParams-BJAlWfuJ.d.ts} +3 -3
- package/dist/{useToast-C8gR5ir4.d.ts → useToast-AyaT-x7p.d.ts} +2 -2
- package/dist/utils.d.ts +1 -1
- package/dist/utils.js +3 -3
- package/docs/api/classes/ColumnFactory.md +1 -1
- package/docs/api/classes/ErrorBoundary.md +1 -1
- package/docs/api/classes/InvalidScopeError.md +1 -1
- package/docs/api/classes/Logger.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 +2 -2
- package/docs/api/classes/RBACAuditManager.md +2 -2
- package/docs/api/classes/RBACCache.md +1 -1
- package/docs/api/classes/RBACEngine.md +2 -2
- package/docs/api/classes/RBACError.md +1 -1
- package/docs/api/classes/RBACNotInitializedError.md +1 -1
- package/docs/api/classes/SecureSupabaseClient.md +10 -10
- package/docs/api/classes/StorageUtils.md +1 -1
- package/docs/api/enums/FileCategory.md +1 -1
- package/docs/api/enums/LogLevel.md +1 -1
- package/docs/api/enums/RBACErrorCode.md +1 -1
- package/docs/api/enums/RPCFunction.md +1 -1
- package/docs/api/interfaces/AddressFieldProps.md +1 -1
- package/docs/api/interfaces/AddressFieldRef.md +1 -1
- package/docs/api/interfaces/AggregateConfig.md +1 -1
- package/docs/api/interfaces/AutocompleteOptions.md +1 -1
- package/docs/api/interfaces/AvatarProps.md +1 -1
- package/docs/api/interfaces/BadgeProps.md +1 -1
- package/docs/api/interfaces/ButtonProps.md +1 -1
- package/docs/api/interfaces/CalendarProps.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 +1 -1
- package/docs/api/interfaces/ComplianceResult.md +1 -1
- package/docs/api/interfaces/DataAccessRecord.md +1 -1
- package/docs/api/interfaces/DataRecord.md +1 -1
- package/docs/api/interfaces/DataTableAction.md +1 -1
- package/docs/api/interfaces/DataTableColumn.md +1 -1
- package/docs/api/interfaces/DataTableProps.md +1 -1
- package/docs/api/interfaces/DataTableToolbarButton.md +1 -1
- package/docs/api/interfaces/DatabaseComplianceResult.md +1 -1
- package/docs/api/interfaces/DatabaseIssue.md +1 -1
- package/docs/api/interfaces/EmptyStateConfig.md +1 -1
- package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
- package/docs/api/interfaces/EventAppRoleData.md +1 -1
- package/docs/api/interfaces/ExportColumn.md +1 -1
- package/docs/api/interfaces/ExportOptions.md +1 -1
- package/docs/api/interfaces/FileDisplayProps.md +24 -11
- 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/FormFieldProps.md +1 -1
- package/docs/api/interfaces/FormProps.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/LoggerConfig.md +1 -1
- package/docs/api/interfaces/LoginFormProps.md +1 -1
- package/docs/api/interfaces/NavigationAccessRecord.md +2 -2
- package/docs/api/interfaces/NavigationContextType.md +1 -1
- package/docs/api/interfaces/NavigationGuardProps.md +1 -1
- package/docs/api/interfaces/NavigationItem.md +1 -1
- package/docs/api/interfaces/NavigationMenuProps.md +1 -1
- package/docs/api/interfaces/NavigationProviderProps.md +1 -1
- 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 +1 -1
- package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
- package/docs/api/interfaces/PageAccessRecord.md +1 -1
- package/docs/api/interfaces/PagePermissionContextType.md +1 -1
- package/docs/api/interfaces/PagePermissionGuardProps.md +2 -2
- package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
- package/docs/api/interfaces/PaletteData.md +1 -1
- package/docs/api/interfaces/ParsedAddress.md +1 -1
- package/docs/api/interfaces/PermissionEnforcerProps.md +4 -4
- package/docs/api/interfaces/ProgressProps.md +1 -1
- package/docs/api/interfaces/ProtectedRouteProps.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/QuickFix.md +1 -1
- package/docs/api/interfaces/RBACAccessValidateParams.md +1 -1
- package/docs/api/interfaces/RBACAccessValidateResult.md +1 -1
- package/docs/api/interfaces/RBACAuditLogParams.md +1 -1
- package/docs/api/interfaces/RBACAuditLogResult.md +1 -1
- package/docs/api/interfaces/RBACConfig.md +2 -2
- package/docs/api/interfaces/RBACContext.md +1 -1
- package/docs/api/interfaces/RBACLogger.md +1 -1
- package/docs/api/interfaces/RBACPageAccessCheckParams.md +1 -1
- package/docs/api/interfaces/RBACPerformanceMetrics.md +1 -1
- package/docs/api/interfaces/RBACPermissionCheckParams.md +1 -1
- package/docs/api/interfaces/RBACPermissionCheckResult.md +2 -2
- package/docs/api/interfaces/RBACPermissionsGetParams.md +1 -1
- package/docs/api/interfaces/RBACPermissionsGetResult.md +1 -1
- package/docs/api/interfaces/RBACResult.md +1 -1
- package/docs/api/interfaces/RBACRoleGrantParams.md +2 -2
- package/docs/api/interfaces/RBACRoleGrantResult.md +1 -1
- package/docs/api/interfaces/RBACRoleRevokeParams.md +2 -2
- package/docs/api/interfaces/RBACRoleRevokeResult.md +1 -1
- package/docs/api/interfaces/RBACRoleValidateParams.md +2 -2
- package/docs/api/interfaces/RBACRoleValidateResult.md +1 -1
- package/docs/api/interfaces/RBACRolesListParams.md +1 -1
- package/docs/api/interfaces/RBACRolesListResult.md +2 -2
- package/docs/api/interfaces/RBACSessionTrackParams.md +1 -1
- package/docs/api/interfaces/RBACSessionTrackResult.md +1 -1
- package/docs/api/interfaces/ResourcePermissions.md +1 -1
- package/docs/api/interfaces/RevokeEventAppRoleParams.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
- package/docs/api/interfaces/RoleManagementResult.md +1 -1
- package/docs/api/interfaces/RouteAccessRecord.md +2 -2
- package/docs/api/interfaces/RouteConfig.md +2 -2
- package/docs/api/interfaces/RuntimeComplianceResult.md +1 -1
- package/docs/api/interfaces/SecureDataContextType.md +1 -1
- package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
- package/docs/api/interfaces/SessionRestorationLoaderProps.md +1 -1
- package/docs/api/interfaces/SetupIssue.md +1 -1
- 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/TabsContentProps.md +1 -1
- package/docs/api/interfaces/TabsListProps.md +1 -1
- package/docs/api/interfaces/TabsProps.md +1 -1
- package/docs/api/interfaces/TabsTriggerProps.md +1 -1
- package/docs/api/interfaces/TextareaProps.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 +60 -38
- package/docs/api/interfaces/UnifiedAuthProviderProps.md +13 -13
- package/docs/api/interfaces/UseFormDialogOptions.md +1 -1
- package/docs/api/interfaces/UseFormDialogReturn.md +1 -1
- package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
- package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
- package/docs/api/interfaces/UsePublicEventLogoOptions.md +2 -2
- package/docs/api/interfaces/UsePublicEventLogoReturn.md +1 -1
- package/docs/api/interfaces/UsePublicEventOptions.md +1 -1
- package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
- package/docs/api/interfaces/UsePublicFileDisplayOptions.md +2 -2
- package/docs/api/interfaces/UsePublicFileDisplayReturn.md +1 -1
- package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
- package/docs/api/interfaces/UseResolvedScopeOptions.md +2 -2
- package/docs/api/interfaces/UseResolvedScopeReturn.md +1 -1
- package/docs/api/interfaces/UseResourcePermissionsOptions.md +1 -1
- package/docs/api/interfaces/UserEventAccess.md +1 -1
- package/docs/api/interfaces/UserMenuProps.md +1 -1
- package/docs/api/interfaces/UserProfile.md +1 -1
- package/docs/api/modules.md +194 -209
- package/docs/getting-started/cursor-rules.md +262 -0
- package/docs/getting-started/installation-guide.md +6 -1
- package/docs/getting-started/quick-start.md +6 -1
- package/docs/migration/MIGRATION_GUIDE.md +4 -4
- package/docs/migration/REACT_19_MIGRATION.md +227 -0
- package/docs/migration/database-changes-december-2025.md +2 -1
- package/docs/rbac/event-based-apps.md +124 -6
- package/docs/standards/README.md +39 -0
- package/docs/troubleshooting/migration.md +4 -4
- package/examples/PublicPages/PublicEventPage.tsx +1 -1
- package/package.json +11 -6
- package/scripts/audit-consuming-app.cjs +961 -0
- package/scripts/check-pace-core-compliance.cjs +315 -61
- package/scripts/install-cursor-rules.cjs +236 -0
- package/src/__tests__/helpers/test-providers.tsx +1 -1
- package/src/__tests__/helpers/test-utils.tsx +1 -1
- package/src/__tests__/rls-policies.test.ts +3 -1
- package/src/components/Badge/Badge.tsx +2 -4
- package/src/components/Button/Button.tsx +5 -4
- package/src/components/Calendar/Calendar.tsx +1 -1
- package/src/components/DataTable/DataTable.test.tsx +57 -93
- package/src/components/DataTable/DataTable.tsx +2 -2
- package/src/components/DataTable/__tests__/DataTable.default-state.test.tsx +172 -45
- package/src/components/DataTable/__tests__/DataTable.grouping-aggregation.test.tsx +121 -28
- package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +9 -8
- package/src/components/DataTable/__tests__/DataTableCore.test.tsx +20 -52
- package/src/components/DataTable/__tests__/a11y.basic.test.tsx +170 -34
- package/src/components/DataTable/__tests__/keyboard.test.tsx +75 -12
- package/src/components/DataTable/__tests__/pagination.modes.test.tsx +88 -16
- package/src/components/DataTable/__tests__/ssr.strict-mode.test.tsx +12 -12
- package/src/components/DataTable/components/AccessDeniedPage.tsx +1 -1
- package/src/components/DataTable/components/BulkOperationsDropdown.tsx +1 -1
- package/src/components/DataTable/components/DataTableCore.tsx +4 -7
- package/src/components/DataTable/components/DataTableModals.tsx +1 -1
- package/src/components/DataTable/components/EditableRow.tsx +1 -1
- package/src/components/DataTable/components/UnifiedTableBody.tsx +86 -17
- package/src/components/DataTable/components/__tests__/DataTableModals.test.tsx +23 -23
- package/src/components/DataTable/components/__tests__/EditableRow.test.tsx +11 -11
- package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +36 -36
- package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +27 -27
- package/src/components/DataTable/components/__tests__/ImportModal.test.tsx +39 -39
- package/src/components/DataTable/components/__tests__/UnifiedTableBody.test.tsx +33 -33
- package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +29 -29
- package/src/components/DataTable/hooks/useColumnReordering.ts +2 -2
- package/src/components/DataTable/hooks/useDataTablePermissions.ts +75 -10
- package/src/components/DataTable/hooks/useKeyboardNavigation.ts +2 -2
- package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +8 -14
- package/src/components/Dialog/Dialog.tsx +6 -5
- package/src/components/ErrorBoundary/ErrorBoundary.tsx +1 -1
- package/src/components/EventSelector/EventSelector.tsx +1 -1
- package/src/components/FileDisplay/FileDisplay.test.tsx +4 -3
- package/src/components/FileDisplay/FileDisplay.tsx +16 -4
- package/src/components/Footer/Footer.tsx +1 -1
- package/src/components/Form/Form.test.tsx +36 -15
- package/src/components/Form/Form.tsx +30 -26
- package/src/components/Header/Header.tsx +1 -1
- package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +40 -40
- package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +1 -1
- package/src/components/Input/Input.tsx +28 -30
- package/src/components/Label/Label.tsx +1 -1
- package/src/components/LoadingSpinner/LoadingSpinner.tsx +1 -1
- package/src/components/LoginForm/LoginForm.test.tsx +42 -42
- package/src/components/LoginForm/LoginForm.tsx +8 -8
- package/src/components/NavigationMenu/NavigationMenu.test.tsx +6 -4
- package/src/components/NavigationMenu/NavigationMenu.tsx +2 -11
- package/src/components/OrganisationSelector/OrganisationSelector.tsx +0 -1
- package/src/components/PaceAppLayout/PaceAppLayout.performance.test.tsx +1 -1
- package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +75 -52
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +98 -69
- package/src/components/PaceAppLayout/README.md +1 -1
- package/src/components/PaceLoginPage/PaceLoginPage.tsx +1 -8
- package/src/components/PasswordChange/PasswordChangeForm.test.tsx +33 -33
- package/src/components/PasswordChange/PasswordChangeForm.tsx +1 -1
- package/src/components/Progress/Progress.tsx +1 -1
- package/src/components/ProtectedRoute/ProtectedRoute.test.tsx +5 -9
- package/src/components/ProtectedRoute/ProtectedRoute.tsx +0 -1
- package/src/components/PublicLayout/PublicPageLayout.tsx +1 -1
- package/src/components/PublicLayout/PublicPageProvider.tsx +0 -1
- package/src/components/Select/Select.tsx +33 -22
- package/src/components/SessionRestorationLoader/SessionRestorationLoader.tsx +1 -1
- package/src/components/Table/Table.tsx +1 -1
- package/src/components/Textarea/Textarea.tsx +27 -29
- package/src/components/Toast/Toast.tsx +1 -1
- package/src/components/Tooltip/Tooltip.tsx +1 -1
- package/src/components/UserMenu/UserMenu.tsx +1 -1
- package/src/hooks/__tests__/hooks.integration.test.tsx +80 -55
- package/src/hooks/__tests__/useSecureDataAccess.unit.test.tsx +14 -7
- package/src/hooks/__tests__/useStorage.unit.test.ts +36 -36
- package/src/hooks/public/usePublicEvent.ts +1 -1
- package/src/hooks/public/usePublicEventLogo.ts +1 -1
- package/src/hooks/public/usePublicRouteParams.ts +1 -1
- package/src/hooks/services/useAuthService.ts +21 -3
- package/src/hooks/services/useEventService.ts +21 -3
- package/src/hooks/services/useInactivityService.ts +21 -3
- package/src/hooks/services/useOrganisationService.ts +21 -3
- package/src/hooks/useDataTableState.ts +8 -18
- package/src/hooks/useFileDisplay.ts +10 -17
- package/src/hooks/useFocusManagement.ts +2 -2
- package/src/hooks/useFocusTrap.ts +4 -4
- package/src/hooks/useFormDialog.ts +8 -7
- package/src/hooks/useInactivityTracker.ts +1 -1
- package/src/hooks/usePermissionCache.ts +1 -1
- package/src/hooks/useSecureDataAccess.test.ts +16 -9
- package/src/hooks/useSecureDataAccess.ts +22 -6
- package/src/hooks/useToast.ts +2 -2
- package/src/providers/__tests__/OrganisationProvider.test.tsx +57 -13
- package/src/providers/__tests__/ProviderLifecycle.test.tsx +21 -6
- package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +10 -10
- package/src/providers/services/EventServiceProvider.tsx +0 -8
- package/src/providers/services/UnifiedAuthProvider.tsx +196 -46
- package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +13 -3
- package/src/rbac/__tests__/adapters.comprehensive.test.tsx +34 -40
- package/src/rbac/__tests__/isSuperAdmin.real.test.ts +82 -0
- package/src/rbac/adapters.tsx +3 -22
- package/src/rbac/api.test.ts +2 -2
- package/src/rbac/api.ts +7 -1
- package/src/rbac/components/EnhancedNavigationMenu.tsx +3 -16
- package/src/rbac/components/NavigationGuard.tsx +2 -11
- package/src/rbac/components/NavigationProvider.tsx +1 -2
- package/src/rbac/components/PagePermissionGuard.tsx +1 -1
- package/src/rbac/components/PagePermissionProvider.tsx +1 -1
- package/src/rbac/components/PermissionEnforcer.tsx +46 -13
- package/src/rbac/components/RoleBasedRouter.tsx +1 -1
- package/src/rbac/components/SecureDataProvider.tsx +1 -2
- package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +7 -43
- package/src/rbac/components/__tests__/NavigationGuard.test.tsx +4 -11
- package/src/rbac/components/__tests__/NavigationProvider.test.tsx +3 -3
- package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +1 -1
- package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +1 -1
- package/src/rbac/engine.ts +14 -2
- package/src/rbac/hooks/index.ts +0 -3
- package/src/rbac/hooks/usePermissions.ts +51 -11
- package/src/rbac/hooks/useRBAC.ts +3 -13
- package/src/rbac/hooks/useResolvedScope.test.ts +75 -54
- package/src/rbac/hooks/useResolvedScope.ts +58 -33
- package/src/rbac/hooks/useSecureSupabase.ts +4 -9
- package/src/rbac/secureClient.ts +43 -0
- package/src/services/EventService.ts +4 -57
- package/src/services/InactivityService.ts +127 -34
- package/src/services/OrganisationService.ts +68 -10
- package/src/utils/security/secureDataAccess.test.ts +31 -20
- package/src/utils/security/secureDataAccess.ts +4 -3
- package/dist/chunk-6C4YBBJM.js.map +0 -1
- package/dist/chunk-6LTQQAT6.js.map +0 -1
- package/dist/chunk-6TQDD426.js.map +0 -1
- package/dist/chunk-LOMZXPSN.js.map +0 -1
- package/dist/chunk-OETXORNB.js.map +0 -1
- package/dist/chunk-ULHIJK66.js.map +0 -1
- package/dist/chunk-VKB2CO4Z.js.map +0 -1
- package/dist/chunk-VRGWKHDB.js.map +0 -1
- package/dist/chunk-XNYQOL3Z.js.map +0 -1
- package/dist/chunk-XYXSXPUK.js.map +0 -1
- package/scripts/check-pace-core-compliance.js +0 -512
- package/src/rbac/hooks/useSuperAdminBypass.ts +0 -126
- package/src/utils/context/superAdminOverride.ts +0 -58
- /package/dist/{DataTable-WKRZD47S.js.map → DataTable-DQ7RSOHE.js.map} +0 -0
- /package/dist/{UnifiedAuthProvider-FTSG5XH7.js.map → UnifiedAuthProvider-ATAP5UTR.js.map} +0 -0
- /package/dist/{api-IHKALJZD.js.map → api-N774RPUA.js.map} +0 -0
- /package/dist/{chunk-QWWZ5CAQ.js.map → chunk-LXQLPRQ2.js.map} +0 -0
- /package/examples/{rbac → RBAC}/CompleteRBACExample.tsx +0 -0
- /package/examples/{rbac → RBAC}/EventBasedApp.tsx +0 -0
- /package/examples/{rbac → RBAC}/PermissionExample.tsx +0 -0
- /package/examples/{rbac → RBAC}/index.ts +0 -0
|
@@ -3,23 +3,23 @@ import {
|
|
|
3
3
|
useAccessLevel,
|
|
4
4
|
useCan,
|
|
5
5
|
useMultiplePermissions
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-XM25TVIE.js";
|
|
7
7
|
import {
|
|
8
8
|
useSecureDataAccess
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-EXUD6RNJ.js";
|
|
10
10
|
import {
|
|
11
11
|
useResolvedScope
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-3XTALGJF.js";
|
|
13
13
|
import {
|
|
14
14
|
useUnifiedAuth
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-BYFSK72L.js";
|
|
16
16
|
import {
|
|
17
17
|
RBACCache,
|
|
18
18
|
RBACNotInitializedError,
|
|
19
19
|
getRBACConfig,
|
|
20
20
|
getRBACLogger,
|
|
21
21
|
rbacCache
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-KNC55RTG.js";
|
|
23
23
|
import {
|
|
24
24
|
createLogger,
|
|
25
25
|
logger
|
|
@@ -435,7 +435,6 @@ function SecureDataProvider({
|
|
|
435
435
|
useEffect3(() => {
|
|
436
436
|
if (enforceRLS && auditLog) {
|
|
437
437
|
const logger2 = getRBACLogger();
|
|
438
|
-
logger2.debug("RLS enforcement enabled - all queries will include organisation context");
|
|
439
438
|
}
|
|
440
439
|
}, [enforceRLS, auditLog]);
|
|
441
440
|
return /* @__PURE__ */ jsx3(SecureDataContext.Provider, { value: contextValue, children });
|
|
@@ -449,7 +448,7 @@ function useSecureData() {
|
|
|
449
448
|
}
|
|
450
449
|
|
|
451
450
|
// src/rbac/components/PermissionEnforcer.tsx
|
|
452
|
-
import { useMemo as useMemo4, useEffect as useEffect4, useState as useState4 } from "react";
|
|
451
|
+
import { useMemo as useMemo4, useEffect as useEffect4, useState as useState4, useRef as useRef2 } from "react";
|
|
453
452
|
import { Fragment as Fragment2, jsx as jsx4, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
454
453
|
var log2 = createLogger("PermissionEnforcer");
|
|
455
454
|
function PermissionEnforcer({
|
|
@@ -471,7 +470,23 @@ function PermissionEnforcer({
|
|
|
471
470
|
selectedOrganisationId: selectedOrganisation?.id || null,
|
|
472
471
|
selectedEventId: selectedEvent?.event_id || null
|
|
473
472
|
});
|
|
474
|
-
const
|
|
473
|
+
const scopeToUse = scope || resolvedScope;
|
|
474
|
+
const scopeOrgId = scopeToUse?.organisationId || "";
|
|
475
|
+
const scopeEventId = scopeToUse?.eventId || void 0;
|
|
476
|
+
const scopeAppId = scopeToUse?.appId || void 0;
|
|
477
|
+
const effectiveScope = useMemo4(() => {
|
|
478
|
+
const newScope = {};
|
|
479
|
+
if (scopeOrgId) {
|
|
480
|
+
newScope.organisationId = scopeOrgId;
|
|
481
|
+
}
|
|
482
|
+
if (scopeEventId) {
|
|
483
|
+
newScope.eventId = scopeEventId;
|
|
484
|
+
}
|
|
485
|
+
if (scopeAppId) {
|
|
486
|
+
newScope.appId = scopeAppId;
|
|
487
|
+
}
|
|
488
|
+
return newScope;
|
|
489
|
+
}, [scopeOrgId, scopeEventId, scopeAppId]);
|
|
475
490
|
const checkError = scopeError;
|
|
476
491
|
const { results: permissionResults, isLoading: permissionsLoading, error: permissionsError } = useMultiplePermissions(
|
|
477
492
|
user?.id || "",
|
|
@@ -503,19 +518,25 @@ function PermissionEnforcer({
|
|
|
503
518
|
setHasChecked(true);
|
|
504
519
|
}
|
|
505
520
|
}, [hasRequiredPermissions, isLoading, error, permissions, operation, onDenied]);
|
|
521
|
+
const permissionsKey = permissions.join(",");
|
|
522
|
+
const lastLoggedKeyRef = useRef2(null);
|
|
506
523
|
useEffect4(() => {
|
|
507
524
|
if (auditLog && hasChecked && !isLoading) {
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
525
|
+
const logKey = `${operation}-${user?.id}-${permissionsKey}-${hasRequiredPermissions}-${scopeOrgId}-${scopeEventId}-${scopeAppId}`;
|
|
526
|
+
if (lastLoggedKeyRef.current !== logKey) {
|
|
527
|
+
lastLoggedKeyRef.current = logKey;
|
|
528
|
+
log2.debug("Permission check attempt:", {
|
|
529
|
+
permissions,
|
|
530
|
+
operation,
|
|
531
|
+
userId: user?.id,
|
|
532
|
+
scope: effectiveScope,
|
|
533
|
+
allowed: hasRequiredPermissions,
|
|
534
|
+
requireAll,
|
|
535
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
536
|
+
});
|
|
537
|
+
}
|
|
517
538
|
}
|
|
518
|
-
}, [auditLog, hasChecked, isLoading,
|
|
539
|
+
}, [auditLog, hasChecked, isLoading, permissionsKey, operation, user?.id, scopeOrgId, scopeEventId, scopeAppId, hasRequiredPermissions]);
|
|
519
540
|
useEffect4(() => {
|
|
520
541
|
if (strictMode && hasChecked && !isLoading && !hasRequiredPermissions) {
|
|
521
542
|
const logger2 = getRBACLogger();
|
|
@@ -849,7 +870,6 @@ function NavigationProvider({
|
|
|
849
870
|
useEffect6(() => {
|
|
850
871
|
if (strictMode && auditLog) {
|
|
851
872
|
const logger2 = getRBACLogger();
|
|
852
|
-
logger2.debug("Strict mode enabled - all navigation access attempts will be logged and enforced");
|
|
853
873
|
}
|
|
854
874
|
}, [strictMode, auditLog]);
|
|
855
875
|
return /* @__PURE__ */ jsx6(NavigationContext.Provider, { value: contextValue, children });
|
|
@@ -914,16 +934,6 @@ function NavigationGuard({
|
|
|
914
934
|
}, [hasRequiredPermissions, isLoading, error, navigationItem, onDenied]);
|
|
915
935
|
useEffect7(() => {
|
|
916
936
|
if (auditLog && hasChecked && !isLoading) {
|
|
917
|
-
const logger2 = getRBACLogger();
|
|
918
|
-
logger2.debug("Navigation access attempt:", {
|
|
919
|
-
navigationItem: navigationItem.id,
|
|
920
|
-
permissions: navigationItem.permissions,
|
|
921
|
-
userId: user?.id,
|
|
922
|
-
scope: effectiveScope,
|
|
923
|
-
allowed: hasRequiredPermissions,
|
|
924
|
-
requireAll,
|
|
925
|
-
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
926
|
-
});
|
|
927
937
|
}
|
|
928
938
|
}, [auditLog, hasChecked, isLoading, navigationItem, user?.id, effectiveScope, hasRequiredPermissions, requireAll]);
|
|
929
939
|
useEffect7(() => {
|
|
@@ -1031,13 +1041,6 @@ function EnhancedNavigationMenu({
|
|
|
1031
1041
|
onItemClick(item);
|
|
1032
1042
|
}
|
|
1033
1043
|
if (auditLog) {
|
|
1034
|
-
const logger2 = getRBACLogger();
|
|
1035
|
-
logger2.debug("Navigation item clicked:", {
|
|
1036
|
-
item: item.id,
|
|
1037
|
-
path: item.path,
|
|
1038
|
-
permissions: item.permissions,
|
|
1039
|
-
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
1040
|
-
});
|
|
1041
1044
|
}
|
|
1042
1045
|
setNavigationHistory((prev) => {
|
|
1043
1046
|
const newHistory = [item, ...prev.filter((i) => i.id !== item.id)];
|
|
@@ -1089,18 +1092,10 @@ function EnhancedNavigationMenu({
|
|
|
1089
1092
|
useEffect8(() => {
|
|
1090
1093
|
if (strictMode && auditLog) {
|
|
1091
1094
|
const logger2 = getRBACLogger();
|
|
1092
|
-
logger2.debug("Strict mode enabled - all navigation access attempts will be logged and enforced");
|
|
1093
1095
|
}
|
|
1094
1096
|
}, [strictMode, auditLog]);
|
|
1095
1097
|
useEffect8(() => {
|
|
1096
1098
|
if (auditLog) {
|
|
1097
|
-
const logger2 = getRBACLogger();
|
|
1098
|
-
logger2.debug("Navigation menu initialized:", {
|
|
1099
|
-
totalItems: items.length,
|
|
1100
|
-
filteredItems: filteredItems.length,
|
|
1101
|
-
strictMode,
|
|
1102
|
-
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
1103
|
-
});
|
|
1104
1099
|
}
|
|
1105
1100
|
}, [items.length, filteredItems.length, strictMode, auditLog]);
|
|
1106
1101
|
return /* @__PURE__ */ jsx8("nav", { className, children: filteredItems.map((item) => {
|
|
@@ -1151,26 +1146,11 @@ function PermissionGuard({
|
|
|
1151
1146
|
if (error) {
|
|
1152
1147
|
logger2.error("Permission check failed:", error);
|
|
1153
1148
|
if (auditLog) {
|
|
1154
|
-
logger2.info(`[PermissionGuard] Permission check failed:`, {
|
|
1155
|
-
userId: effectiveUserId,
|
|
1156
|
-
scope,
|
|
1157
|
-
permission,
|
|
1158
|
-
pageId,
|
|
1159
|
-
error: error.message,
|
|
1160
|
-
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
1161
|
-
});
|
|
1162
1149
|
}
|
|
1163
1150
|
return fallback;
|
|
1164
1151
|
}
|
|
1165
1152
|
if (!can) {
|
|
1166
1153
|
if (auditLog) {
|
|
1167
|
-
logger2.info(`[PermissionGuard] Permission denied:`, {
|
|
1168
|
-
userId: effectiveUserId,
|
|
1169
|
-
scope,
|
|
1170
|
-
permission,
|
|
1171
|
-
pageId,
|
|
1172
|
-
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
1173
|
-
});
|
|
1174
1154
|
}
|
|
1175
1155
|
if (strictMode) {
|
|
1176
1156
|
logger2.error(`[PermissionGuard] STRICT MODE VIOLATION: User attempted to access protected resource without permission`, {
|
|
@@ -1187,13 +1167,6 @@ function PermissionGuard({
|
|
|
1187
1167
|
return /* @__PURE__ */ jsx9(Fragment4, { children: fallback });
|
|
1188
1168
|
}
|
|
1189
1169
|
if (auditLog) {
|
|
1190
|
-
logger2.info(`[PermissionGuard] Permission granted:`, {
|
|
1191
|
-
userId: effectiveUserId,
|
|
1192
|
-
scope,
|
|
1193
|
-
permission,
|
|
1194
|
-
pageId,
|
|
1195
|
-
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
1196
|
-
});
|
|
1197
1170
|
}
|
|
1198
1171
|
return /* @__PURE__ */ jsx9(Fragment4, { children });
|
|
1199
1172
|
}
|
|
@@ -1247,7 +1220,7 @@ function withPermissionGuard(config, handler) {
|
|
|
1247
1220
|
if (!userId || !organisationId) {
|
|
1248
1221
|
throw new Error("User context required for permission check");
|
|
1249
1222
|
}
|
|
1250
|
-
const { isPermitted: isPermitted2 } = await import("./api-
|
|
1223
|
+
const { isPermitted: isPermitted2 } = await import("./api-N774RPUA.js");
|
|
1251
1224
|
const hasPermission2 = await isPermitted2({
|
|
1252
1225
|
userId,
|
|
1253
1226
|
scope: { organisationId, eventId, appId },
|
|
@@ -1270,7 +1243,7 @@ function withAccessLevelGuard(minLevel, handler) {
|
|
|
1270
1243
|
if (!userId || !organisationId) {
|
|
1271
1244
|
throw new Error("User context required for access level check");
|
|
1272
1245
|
}
|
|
1273
|
-
const { getAccessLevel: getAccessLevel2 } = await import("./api-
|
|
1246
|
+
const { getAccessLevel: getAccessLevel2 } = await import("./api-N774RPUA.js");
|
|
1274
1247
|
const accessLevel = await getAccessLevel2({
|
|
1275
1248
|
userId,
|
|
1276
1249
|
scope: { organisationId, eventId, appId }
|
|
@@ -1295,7 +1268,7 @@ function withRoleGuard(config, handler) {
|
|
|
1295
1268
|
throw new Error("User context required for role check");
|
|
1296
1269
|
}
|
|
1297
1270
|
if (config.globalRoles && config.globalRoles.length > 0) {
|
|
1298
|
-
const { isSuperAdmin } = await import("./api-
|
|
1271
|
+
const { isSuperAdmin } = await import("./api-N774RPUA.js");
|
|
1299
1272
|
const isSuper = await isSuperAdmin(userId);
|
|
1300
1273
|
if (isSuper) {
|
|
1301
1274
|
if (organisationId) {
|
|
@@ -1321,14 +1294,14 @@ function withRoleGuard(config, handler) {
|
|
|
1321
1294
|
}
|
|
1322
1295
|
}
|
|
1323
1296
|
if (config.organisationRoles && config.organisationRoles.length > 0) {
|
|
1324
|
-
const { isOrganisationAdmin } = await import("./api-
|
|
1297
|
+
const { isOrganisationAdmin } = await import("./api-N774RPUA.js");
|
|
1325
1298
|
const isOrgAdmin = await isOrganisationAdmin(userId, organisationId);
|
|
1326
1299
|
if (!isOrgAdmin && config.requireAll !== false) {
|
|
1327
1300
|
throw new Error(`Organisation admin role required`);
|
|
1328
1301
|
}
|
|
1329
1302
|
}
|
|
1330
1303
|
if (config.eventAppRoles && config.eventAppRoles.length > 0 && eventId && appId) {
|
|
1331
|
-
const { isEventAdmin } = await import("./api-
|
|
1304
|
+
const { isEventAdmin } = await import("./api-N774RPUA.js");
|
|
1332
1305
|
const isEventAdminUser = await isEventAdmin(userId, { organisationId, eventId, appId });
|
|
1333
1306
|
if (!isEventAdminUser && config.requireAll !== false) {
|
|
1334
1307
|
throw new Error(`Event admin role required`);
|
|
@@ -1368,7 +1341,7 @@ function createRBACMiddleware(config) {
|
|
|
1368
1341
|
);
|
|
1369
1342
|
if (protectedRoute) {
|
|
1370
1343
|
try {
|
|
1371
|
-
const { isPermitted: isPermitted2 } = await import("./api-
|
|
1344
|
+
const { isPermitted: isPermitted2 } = await import("./api-N774RPUA.js");
|
|
1372
1345
|
const hasPermission2 = await isPermitted2({
|
|
1373
1346
|
userId,
|
|
1374
1347
|
scope: { organisationId },
|
|
@@ -1395,7 +1368,7 @@ function createRBACExpressMiddleware(config) {
|
|
|
1395
1368
|
return res.status(401).json({ error: "User context required" });
|
|
1396
1369
|
}
|
|
1397
1370
|
try {
|
|
1398
|
-
const { isPermitted: isPermitted2 } = await import("./api-
|
|
1371
|
+
const { isPermitted: isPermitted2 } = await import("./api-N774RPUA.js");
|
|
1399
1372
|
const hasPermission2 = await isPermitted2({
|
|
1400
1373
|
userId,
|
|
1401
1374
|
scope: { organisationId, eventId, appId },
|
|
@@ -1924,4 +1897,4 @@ export {
|
|
|
1924
1897
|
getDirectSupabaseAuthFixes,
|
|
1925
1898
|
getQuickFixes
|
|
1926
1899
|
};
|
|
1927
|
-
//# sourceMappingURL=chunk-
|
|
1900
|
+
//# sourceMappingURL=chunk-4ZC4GX36.js.map
|