@jmruthers/pace-core 0.4.1 → 0.5.3
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 +26 -1
- package/README.md +231 -229
- package/dist/{DataTable-2LB6HI6V.js → DataTable-ZQDRE46Q.js} +15 -17
- package/dist/{DataTable-BDBqkU-i.d.ts → DataTable-ltTFXHS3.d.ts} +25 -51
- package/dist/{Table-CIm9IWqk.d.ts → PublicLoadingSpinner-Bq_-BeK-.d.ts} +635 -122
- package/dist/{UnifiedAuthProvider-V7y63NjT.d.ts → RBACProvider-BO4ilsQB.d.ts} +11 -36
- package/dist/UnifiedAuthProvider-DGQsy-vY.d.ts +103 -0
- package/dist/{api-AIJ3IJX3.js → api-H5A3H4IR.js} +6 -4
- package/dist/{appConfig-fB1pP_v3.d.ts → appConfig-BVGyuvI7.d.ts} +1 -1
- package/dist/appNameResolver-7GHF5ED2.js +22 -0
- package/dist/{audit-PD5L5ZSC.js → audit-BUW3LMJB.js} +3 -3
- package/dist/chunk-5H3C2SWM.js +3293 -0
- package/dist/chunk-5H3C2SWM.js.map +1 -0
- package/dist/chunk-5SIXIV7R.js +1925 -0
- package/dist/chunk-5SIXIV7R.js.map +1 -0
- package/dist/{chunk-YNU5QJ4S.js → chunk-7BNPOCLL.js} +22 -5
- package/dist/chunk-7BNPOCLL.js.map +1 -0
- package/dist/{chunk-4ZTIEYU2.js → chunk-CDQ3PX7L.js} +1 -1
- package/dist/chunk-CDQ3PX7L.js.map +1 -0
- package/dist/chunk-GNTALZV3.js +17 -0
- package/dist/chunk-GNTALZV3.js.map +1 -0
- package/dist/chunk-GWSBHC4J.js +1349 -0
- package/dist/chunk-GWSBHC4J.js.map +1 -0
- package/dist/{chunk-JUUNUW3O.js → chunk-HD7PYDUV.js} +14 -5
- package/dist/chunk-HD7PYDUV.js.map +1 -0
- package/dist/{chunk-H4PZ4B3Y.js → chunk-HXX35Q2M.js} +113 -27
- package/dist/chunk-HXX35Q2M.js.map +1 -0
- package/dist/chunk-K6B7BLSE.js +388 -0
- package/dist/chunk-K6B7BLSE.js.map +1 -0
- package/dist/chunk-M4RW7PIP.js +5441 -0
- package/dist/chunk-M4RW7PIP.js.map +1 -0
- package/dist/chunk-MZBUOP4P.js +119 -0
- package/dist/chunk-MZBUOP4P.js.map +1 -0
- package/dist/chunk-N2EUGZRW.js +98 -0
- package/dist/chunk-N2EUGZRW.js.map +1 -0
- package/dist/chunk-NQ4TOOO6.js +20 -0
- package/dist/chunk-NQ4TOOO6.js.map +1 -0
- package/dist/{chunk-DC5AMYBS.js → chunk-PLDDJCW6.js} +15 -5
- package/dist/chunk-PLDDJCW6.js.map +1 -0
- package/dist/{chunk-IOX76PSM.js → chunk-PVMYVQSM.js} +270 -28
- package/dist/chunk-PVMYVQSM.js.map +1 -0
- package/dist/{chunk-4MCJAK7J.js → chunk-QKHFMQ5R.js} +2155 -4853
- package/dist/chunk-QKHFMQ5R.js.map +1 -0
- package/dist/chunk-QVYBYGT2.js +428 -0
- package/dist/chunk-QVYBYGT2.js.map +1 -0
- package/dist/{chunk-WHLSWC6W.js → chunk-SS3E6QLB.js} +16 -61
- package/dist/chunk-SS3E6QLB.js.map +1 -0
- package/dist/chunk-WJARTBCT.js +128 -0
- package/dist/chunk-WJARTBCT.js.map +1 -0
- package/dist/chunk-YDJW5XTN.js +84 -0
- package/dist/chunk-YDJW5XTN.js.map +1 -0
- package/dist/components.d.ts +907 -10
- package/dist/components.js +3237 -204
- package/dist/components.js.map +1 -1
- package/dist/{database-CAMsquLm.d.ts → database-C3Szpi5J.d.ts} +28 -11
- package/dist/hooks.d.ts +7 -6
- package/dist/hooks.js +33 -11
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +247 -111
- package/dist/index.js +330 -185
- package/dist/index.js.map +1 -1
- package/dist/{organisation-DLNNQhPB.d.ts → organisation-CO3Sh3_D.d.ts} +1 -1
- package/dist/providers.d.ts +5 -4
- package/dist/providers.js +14 -5
- package/dist/rbac/index.d.ts +964 -839
- package/dist/rbac/index.js +58 -1970
- package/dist/rbac/index.js.map +1 -1
- package/dist/styles/core.css +364 -0
- package/dist/styles/fonts/georama-italic.woff2 +0 -0
- package/dist/styles/fonts/georama.woff2 +0 -0
- package/dist/styles/fonts/open-sans-italic.woff2 +0 -0
- package/dist/styles/fonts/open-sans.woff2 +0 -0
- package/dist/styles/fonts/reddit-mono.woff2 +0 -0
- package/dist/styles/index.d.ts +36 -0
- package/dist/styles/index.js +24 -0
- package/dist/styles/index.js.map +1 -0
- package/dist/theming/runtime.d.ts +73 -0
- package/dist/theming/runtime.js +16 -0
- package/dist/theming/runtime.js.map +1 -0
- package/dist/{types-Bavn44NW.d.ts → types-BRDU7N6w.d.ts} +79 -33
- package/dist/types.d.ts +5 -5
- package/dist/types.js +7 -2
- package/dist/types.js.map +1 -1
- package/dist/{unified-BtRpPbmp.d.ts → unified-CMPjE_fv.d.ts} +0 -1
- package/dist/usePublicRouteParams-B2OcAsur.d.ts +477 -0
- package/dist/utils.d.ts +83 -60
- package/dist/utils.js +293 -55651
- package/dist/utils.js.map +1 -1
- package/dist/validation.d.ts +1 -1
- package/dist/validation.js +1 -1
- package/docs/INDEX.md +192 -0
- package/docs/README.md +46 -32
- package/docs/api/README.md +231 -229
- package/docs/api/classes/ErrorBoundary.md +1 -1
- package/docs/api/classes/InvalidScopeError.md +73 -0
- package/docs/api/classes/MissingUserContextError.md +66 -0
- package/docs/api/classes/OrganisationContextRequiredError.md +66 -0
- package/docs/api/classes/PermissionDeniedError.md +73 -0
- package/docs/api/classes/PublicErrorBoundary.md +132 -0
- package/docs/api/classes/RBACAuditManager.md +270 -0
- package/docs/api/classes/RBACCache.md +284 -0
- package/docs/api/classes/RBACEngine.md +141 -0
- package/docs/api/classes/RBACError.md +76 -0
- package/docs/api/classes/RBACNotInitializedError.md +66 -0
- package/docs/api/classes/SecureSupabaseClient.md +135 -0
- package/docs/api/interfaces/AggregateConfig.md +4 -4
- package/docs/api/interfaces/ButtonProps.md +2 -2
- package/docs/api/interfaces/CardProps.md +2 -2
- package/docs/api/interfaces/ColorPalette.md +1 -1
- package/docs/api/interfaces/ColorShade.md +1 -1
- package/docs/api/interfaces/DataAccessRecord.md +96 -0
- package/docs/api/interfaces/DataTableAction.md +98 -7
- package/docs/api/interfaces/DataTableColumn.md +131 -12
- package/docs/api/interfaces/DataTableProps.md +77 -274
- package/docs/api/interfaces/DataTableToolbarButton.md +7 -7
- package/docs/api/interfaces/EmptyStateConfig.md +5 -5
- package/docs/api/interfaces/EnhancedNavigationMenuProps.md +235 -0
- package/docs/api/interfaces/EventContextType.md +7 -7
- package/docs/api/interfaces/EventLogoProps.md +152 -0
- package/docs/api/interfaces/EventProviderProps.md +2 -2
- package/docs/api/interfaces/FileSizeLimits.md +7 -0
- package/docs/api/interfaces/FileUploadProps.md +154 -0
- package/docs/api/interfaces/FooterProps.md +1 -1
- package/docs/api/interfaces/InactivityWarningModalProps.md +115 -0
- package/docs/api/interfaces/InputProps.md +2 -2
- package/docs/api/interfaces/LabelProps.md +1 -1
- package/docs/api/interfaces/LoginFormProps.md +1 -1
- package/docs/api/interfaces/NavigationAccessRecord.md +107 -0
- package/docs/api/interfaces/NavigationContextType.md +164 -0
- package/docs/api/interfaces/NavigationGuardProps.md +139 -0
- package/docs/api/interfaces/NavigationItem.md +1 -1
- package/docs/api/interfaces/NavigationMenuProps.md +1 -1
- package/docs/api/interfaces/NavigationProviderProps.md +117 -0
- 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 +26 -26
- package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
- package/docs/api/interfaces/PageAccessRecord.md +85 -0
- package/docs/api/interfaces/PagePermissionContextType.md +140 -0
- package/docs/api/interfaces/PagePermissionGuardProps.md +153 -0
- package/docs/api/interfaces/PagePermissionProviderProps.md +119 -0
- package/docs/api/interfaces/PaletteData.md +1 -1
- package/docs/api/interfaces/PermissionEnforcerProps.md +153 -0
- package/docs/api/interfaces/PublicErrorBoundaryProps.md +94 -0
- package/docs/api/interfaces/PublicErrorBoundaryState.md +68 -0
- package/docs/api/interfaces/PublicLoadingSpinnerProps.md +86 -0
- package/docs/api/interfaces/PublicPageFooterProps.md +112 -0
- package/docs/api/interfaces/PublicPageHeaderProps.md +138 -0
- package/docs/api/interfaces/PublicPageLayoutProps.md +138 -0
- package/docs/api/interfaces/RBACConfig.md +99 -0
- package/docs/api/interfaces/RBACContextType.md +474 -0
- package/docs/api/interfaces/RBACLogger.md +112 -0
- package/docs/api/interfaces/RBACProviderProps.md +107 -0
- package/docs/api/interfaces/RoleBasedRouterContextType.md +151 -0
- package/docs/api/interfaces/RoleBasedRouterProps.md +156 -0
- package/docs/api/interfaces/RouteAccessRecord.md +107 -0
- package/docs/api/interfaces/RouteConfig.md +121 -0
- package/docs/api/interfaces/SecureDataContextType.md +168 -0
- package/docs/api/interfaces/SecureDataProviderProps.md +132 -0
- package/docs/api/interfaces/StorageConfig.md +41 -0
- package/docs/api/interfaces/StorageFileInfo.md +74 -0
- package/docs/api/interfaces/StorageFileMetadata.md +140 -0
- package/docs/api/interfaces/StorageListOptions.md +86 -0
- package/docs/api/interfaces/StorageListResult.md +41 -0
- package/docs/api/interfaces/StorageUploadOptions.md +88 -0
- package/docs/api/interfaces/StorageUploadResult.md +63 -0
- package/docs/api/interfaces/StorageUrlOptions.md +47 -0
- package/docs/api/interfaces/StyleImport.md +2 -2
- package/docs/api/interfaces/ToastActionElement.md +1 -1
- package/docs/api/interfaces/ToastProps.md +1 -1
- package/docs/api/interfaces/UnifiedAuthContextType.md +465 -64
- package/docs/api/interfaces/UnifiedAuthProviderProps.md +95 -9
- package/docs/api/interfaces/UseInactivityTrackerOptions.md +136 -0
- package/docs/api/interfaces/UseInactivityTrackerReturn.md +123 -0
- package/docs/api/interfaces/UsePublicEventLogoOptions.md +87 -0
- package/docs/api/interfaces/UsePublicEventLogoReturn.md +81 -0
- package/docs/api/interfaces/UsePublicEventOptions.md +34 -0
- package/docs/api/interfaces/UsePublicEventReturn.md +68 -0
- package/docs/api/interfaces/UsePublicRouteParamsReturn.md +94 -0
- package/docs/api/interfaces/UserEventAccess.md +14 -14
- package/docs/api/interfaces/UserMenuProps.md +6 -6
- package/docs/api/interfaces/UserProfile.md +1 -1
- package/docs/api/modules.md +4233 -1134
- package/docs/api-reference/components.md +761 -43
- package/docs/api-reference/hooks.md +126 -0
- package/docs/api-reference/providers.md +141 -65
- package/docs/api-reference/types.md +66 -36
- package/docs/api-reference/utilities.md +1 -1
- package/docs/architecture/README.md +1 -2
- package/docs/best-practices/README.md +400 -0
- package/docs/consuming-app-example.md +42 -96
- package/docs/consuming-app-vite-config.md +233 -0
- package/docs/core-concepts/events.md +3 -3
- package/docs/core-concepts/organisations.md +0 -1
- package/docs/core-concepts/rbac-system.md +23 -10
- package/docs/documentation-style-checklist.md +8 -2
- package/docs/examples/navigation-menu-auth-fix.md +344 -0
- package/docs/getting-started/examples/README.md +15 -1
- package/docs/getting-started/examples/basic-auth-app.md +444 -119
- package/docs/getting-started/examples/full-featured-app.md +6 -6
- package/docs/getting-started/installation.md +231 -52
- package/docs/getting-started/quick-start.md +121 -24
- package/docs/implementation-guides/app-layout.md +133 -108
- package/docs/implementation-guides/data-tables.md +1011 -29
- package/docs/implementation-guides/forms.md +3 -3
- package/docs/implementation-guides/hierarchical-datatable.md +850 -0
- package/docs/implementation-guides/large-datasets.md +2 -2
- package/docs/implementation-guides/navigation.md +1 -1
- package/docs/implementation-guides/permission-enforcement.md +4 -4
- package/docs/implementation-guides/public-pages.md +752 -0
- package/docs/migration/README.md +18 -8
- package/docs/migration/quick-migration-guide.md +320 -0
- package/docs/migration/rbac-migration.md +50 -0
- package/docs/migration/v0.4.15-tailwind-scanning.md +272 -0
- package/docs/migration/v0.4.16-css-first-approach.md +306 -0
- package/docs/migration/v0.4.17-source-path-fix.md +229 -0
- package/docs/migration-guide.md +77 -105
- package/docs/performance/README.md +1 -4
- package/docs/print-components/README.md +258 -0
- package/docs/print-components/api-reference.md +636 -0
- package/docs/print-components/examples/README.md +204 -0
- package/docs/print-components/examples/basic-report.tsx +92 -0
- package/docs/print-components/examples/card-catalog.tsx +149 -0
- package/docs/print-components/examples/cover-page-report.tsx +163 -0
- package/docs/print-components/quick-start.md +363 -0
- package/docs/quick-reference.md +53 -36
- package/docs/rbac/README.md +136 -69
- package/docs/rbac/api-reference.md +39 -8
- package/docs/rbac/examples.md +237 -66
- package/docs/rbac/getting-started.md +131 -16
- package/docs/rbac/quick-start.md +499 -323
- package/docs/rbac/troubleshooting.md +240 -262
- package/docs/security/README.md +50 -1
- package/docs/styles/README.md +226 -111
- package/docs/testing/README.md +6 -10
- package/docs/troubleshooting/README.md +497 -0
- package/docs/troubleshooting/common-issues.md +604 -14
- package/docs/troubleshooting/styling-issues.md +219 -0
- package/docs/troubleshooting/tailwind-content-scanning.md +213 -0
- package/docs/usage.md +54 -91
- package/docs/visual-testing.md +0 -7
- package/package.json +47 -25
- package/src/__mocks__/lucide-react.ts +181 -0
- package/src/__tests__/REBUILD_PLAN.md +223 -0
- package/src/__tests__/TESTING_GUIDELINES.md +341 -0
- package/src/__tests__/fixtures/mocks.ts +93 -0
- package/src/__tests__/helpers/component-test-utils.tsx +145 -0
- package/src/__tests__/helpers/test-utils.tsx +117 -0
- package/src/__tests__/integration/UserProfile.test.tsx +128 -0
- package/src/__tests__/setup.ts +71 -0
- package/src/__tests__/templates/accessibility.test.template.tsx +279 -0
- package/src/__tests__/templates/component.test.template.tsx +144 -0
- package/src/__tests__/templates/hook.test.template.ts +173 -0
- package/src/__tests__/templates/integration.test.template.tsx +199 -0
- package/src/__tests__/types/test.types.ts +106 -0
- package/src/components/Alert/Alert.test.tsx +496 -0
- package/src/components/Alert/Alert.tsx +134 -0
- package/src/components/Alert/index.ts +2 -0
- package/src/components/Avatar/Avatar.test.tsx +484 -0
- package/src/components/Avatar/Avatar.tsx +84 -0
- package/src/components/Avatar/index.ts +2 -0
- package/src/components/Button/Button.test.tsx +662 -0
- package/src/components/Button/Button.tsx +270 -0
- package/src/components/Button/index.ts +2 -0
- package/src/components/Card/Card.test.tsx +593 -0
- package/src/components/Card/Card.tsx +271 -0
- package/src/components/Card/index.ts +1 -0
- package/src/components/Checkbox/Checkbox.test.tsx +461 -0
- package/src/components/Checkbox/Checkbox.tsx +75 -0
- package/src/components/Checkbox/__mocks__/Checkbox.tsx +2 -0
- package/src/components/Checkbox/index.ts +2 -0
- package/src/components/DataTable/DataTable.tsx +446 -0
- package/src/components/DataTable/__tests__/README.md +145 -0
- package/src/components/DataTable/__tests__/mocks/MockRBACProvider.tsx +66 -0
- package/src/components/DataTable/__tests__/test-utils/dataFactories.ts +103 -0
- package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +381 -0
- package/src/components/DataTable/__tests__/test-utils.ts +94 -0
- package/src/components/DataTable/components/AccessDeniedPage.tsx +168 -0
- package/src/components/DataTable/components/ActionButtons.tsx +194 -0
- package/src/components/DataTable/components/BulkOperationsDropdown.tsx +160 -0
- package/src/components/DataTable/components/ColumnFilter.tsx +114 -0
- package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +100 -0
- package/src/components/DataTable/components/DataTableBody.tsx +461 -0
- package/src/components/DataTable/components/DataTableCore.tsx +1027 -0
- package/src/components/DataTable/components/DataTableErrorBoundary.tsx +214 -0
- package/src/components/DataTable/components/DataTableModals.tsx +87 -0
- package/src/components/DataTable/components/DataTableToolbar.tsx +262 -0
- package/src/components/DataTable/components/DraggableColumnHeader.tsx +144 -0
- package/src/components/DataTable/components/EditableRow.tsx +159 -0
- package/src/components/DataTable/components/EmptyState.tsx +64 -0
- package/src/components/DataTable/components/ExpandButton.tsx +113 -0
- package/src/components/DataTable/components/FilterRow.tsx +100 -0
- package/src/components/DataTable/components/GroupHeader.tsx +42 -0
- package/src/components/DataTable/components/GroupingDropdown.tsx +96 -0
- package/src/components/DataTable/components/ImportModal.tsx +345 -0
- package/src/components/DataTable/components/LoadingState.tsx +12 -0
- package/src/components/DataTable/components/PaginationControls.tsx +332 -0
- package/src/components/DataTable/components/UnifiedTableBody.tsx +742 -0
- package/src/components/DataTable/components/ViewRowModal.tsx +68 -0
- package/src/components/DataTable/components/VirtualizedDataTable.tsx +513 -0
- package/src/components/DataTable/components/index.ts +16 -0
- package/src/components/DataTable/context/DataTableContext.tsx +97 -0
- package/src/components/DataTable/core/ActionManager.ts +235 -0
- package/src/components/DataTable/core/ColumnFactory.ts +268 -0
- package/src/components/DataTable/core/ColumnManager.ts +205 -0
- package/src/components/DataTable/core/DataManager.ts +188 -0
- package/src/components/DataTable/core/DataTableContext.tsx +181 -0
- package/src/components/DataTable/core/LocalDataAdapter.ts +264 -0
- package/src/components/DataTable/core/PluginRegistry.ts +229 -0
- package/src/components/DataTable/core/StateManager.ts +311 -0
- package/src/components/DataTable/core/index.ts +8 -0
- package/src/components/DataTable/core/interfaces.ts +338 -0
- package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +419 -0
- package/src/components/DataTable/examples/HierarchicalExample.tsx +475 -0
- package/src/components/DataTable/examples/InitialPageSizeExample.tsx +176 -0
- package/src/components/DataTable/examples/PerformanceExample.tsx +505 -0
- package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +95 -0
- package/src/components/DataTable/hooks/useColumnReordering.ts +110 -0
- package/src/components/DataTable/hooks/useDataTableState.ts +325 -0
- package/src/components/DataTable/hooks/useHierarchicalState.ts +174 -0
- package/src/components/DataTable/index.ts +68 -0
- package/src/components/DataTable/styles.ts +171 -0
- package/src/components/DataTable/types.ts +511 -0
- package/src/components/DataTable/utils/debugTools.ts +583 -0
- package/src/components/DataTable/utils/errorHandling.ts +494 -0
- package/src/components/DataTable/utils/exportUtils.ts +126 -0
- package/src/components/DataTable/utils/flexibleImport.ts +510 -0
- package/src/components/DataTable/utils/hierarchicalSorting.ts +151 -0
- package/src/components/DataTable/utils/hierarchicalUtils.ts +218 -0
- package/src/components/DataTable/utils/index.ts +1 -0
- package/src/components/DataTable/utils/performanceUtils.ts +351 -0
- package/src/components/Dialog/Dialog.test.tsx +1139 -0
- package/src/components/Dialog/Dialog.tsx +782 -0
- package/src/components/Dialog/README.md +804 -0
- package/src/components/Dialog/examples/BasicHtmlTest.tsx +55 -0
- package/src/components/Dialog/examples/DebugHtmlExample.tsx +68 -0
- package/src/components/Dialog/examples/HtmlDialogExample.tsx +202 -0
- package/src/components/Dialog/examples/SimpleHtmlTest.tsx +61 -0
- package/src/components/Dialog/examples/SmartDialogExample.tsx +322 -0
- package/src/components/Dialog/index.ts +12 -0
- package/src/components/Dialog/utils/safeHtml.ts +185 -0
- package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +752 -0
- package/src/components/ErrorBoundary/ErrorBoundary.tsx +312 -0
- package/src/components/ErrorBoundary/index.ts +8 -0
- package/src/components/EventSelector/EventSelector.tsx +360 -0
- package/src/components/EventSelector/index.ts +3 -0
- package/src/components/EventSelector/types.ts +79 -0
- package/src/components/FileUpload/FileUpload.example.tsx +218 -0
- package/src/components/FileUpload/FileUpload.test.tsx +665 -0
- package/src/components/FileUpload/FileUpload.tsx +237 -0
- package/src/components/FileUpload/index.ts +6 -0
- package/src/components/Footer/Footer.test.tsx +482 -0
- package/src/components/Footer/Footer.tsx +197 -0
- package/src/components/Footer/index.ts +17 -0
- package/src/components/Form/Form.test.tsx +1158 -0
- package/src/components/Form/Form.tsx +166 -0
- package/src/components/Form/FormErrorSummary.tsx +113 -0
- package/src/components/Form/FormField.tsx +249 -0
- package/src/components/Form/FormFieldset.tsx +127 -0
- package/src/components/Form/FormLiveRegion.tsx +198 -0
- package/src/components/Form/index.ts +26 -0
- package/src/components/Header/Header.test.tsx +582 -0
- package/src/components/Header/Header.tsx +301 -0
- package/src/components/Header/index.ts +4 -0
- package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +489 -0
- package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +164 -0
- package/src/components/InactivityWarningModal/index.ts +9 -0
- package/src/components/Input/Input.test.tsx +466 -0
- package/src/components/Input/Input.tsx +201 -0
- package/src/components/Input/__mocks__/Input.tsx +2 -0
- package/src/components/Input/index.ts +9 -0
- package/src/components/Label/Label.tsx +186 -0
- package/src/components/Label/index.ts +2 -0
- package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +450 -0
- package/src/components/LoadingSpinner/LoadingSpinner.tsx +98 -0
- package/src/components/LoadingSpinner/index.ts +3 -0
- package/src/components/LoginForm/LoginForm.test.tsx +816 -0
- package/src/components/LoginForm/LoginForm.tsx +273 -0
- package/src/components/LoginForm/index.ts +3 -0
- package/src/components/NavigationMenu/NavigationMenu.test.tsx +883 -0
- package/src/components/NavigationMenu/NavigationMenu.tsx +698 -0
- package/src/components/NavigationMenu/index.ts +10 -0
- package/src/components/NavigationMenu/types.ts +85 -0
- package/src/components/OrganisationSelector/OrganisationSelector.test.tsx +748 -0
- package/src/components/OrganisationSelector/OrganisationSelector.tsx +304 -0
- package/src/components/OrganisationSelector/index.ts +9 -0
- package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +891 -0
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +699 -0
- package/src/components/PaceAppLayout/README.md +278 -0
- package/src/components/PaceAppLayout/index.ts +1 -0
- package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +475 -0
- package/src/components/PaceLoginPage/PaceLoginPage.tsx +221 -0
- package/src/components/PaceLoginPage/index.ts +1 -0
- package/src/components/PasswordReset/PasswordChangeForm.test.tsx +621 -0
- package/src/components/PasswordReset/PasswordChangeForm.tsx +186 -0
- package/src/components/PasswordReset/PasswordResetForm.test.tsx +605 -0
- package/src/components/PasswordReset/PasswordResetForm.tsx +201 -0
- package/src/components/PasswordReset/index.ts +4 -0
- package/src/components/PrintButton/PrintButton.tsx +321 -0
- package/src/components/PrintButton/PrintButtonGroup.tsx +84 -0
- package/src/components/PrintButton/PrintToolbar.tsx +94 -0
- package/src/components/PrintButton/examples/PrintButtonShowcase.tsx +438 -0
- package/src/components/PrintButton/index.ts +33 -0
- package/src/components/PrintButton/types.ts +173 -0
- package/src/components/PrintCard/PrintCard.tsx +154 -0
- package/src/components/PrintCard/PrintCardContent.tsx +57 -0
- package/src/components/PrintCard/PrintCardFooter.tsx +60 -0
- package/src/components/PrintCard/PrintCardGrid.tsx +91 -0
- package/src/components/PrintCard/PrintCardHeader.tsx +78 -0
- package/src/components/PrintCard/PrintCardImage.tsx +81 -0
- package/src/components/PrintCard/examples/PrintCardShowcase.tsx +239 -0
- package/src/components/PrintCard/index.ts +34 -0
- package/src/components/PrintCard/types.ts +171 -0
- package/src/components/PrintDataTable/PrintDataTable.tsx +215 -0
- package/src/components/PrintDataTable/PrintTableGroup.tsx +90 -0
- package/src/components/PrintDataTable/PrintTableRow.tsx +76 -0
- package/src/components/PrintDataTable/index.ts +25 -0
- package/src/components/PrintDataTable/types.ts +67 -0
- package/src/components/PrintFooter/PrintFooter.tsx +183 -0
- package/src/components/PrintFooter/PrintFooterContent.tsx +71 -0
- package/src/components/PrintFooter/PrintFooterInfo.tsx +86 -0
- package/src/components/PrintFooter/PrintPageNumber.tsx +90 -0
- package/src/components/PrintFooter/examples/PrintFooterShowcase.tsx +390 -0
- package/src/components/PrintFooter/index.ts +30 -0
- package/src/components/PrintFooter/types.ts +149 -0
- package/src/components/PrintGrid/PrintGrid.tsx +180 -0
- package/src/components/PrintGrid/PrintGridBreakpoint.tsx +109 -0
- package/src/components/PrintGrid/PrintGridContainer.tsx +128 -0
- package/src/components/PrintGrid/PrintGridItem.tsx +220 -0
- package/src/components/PrintGrid/examples/PrintGridShowcase.tsx +359 -0
- package/src/components/PrintGrid/index.ts +31 -0
- package/src/components/PrintGrid/types.ts +159 -0
- package/src/components/PrintHeader/PrintCoverHeader.tsx +230 -0
- package/src/components/PrintHeader/PrintHeader.tsx +150 -0
- package/src/components/PrintHeader/index.ts +17 -0
- package/src/components/PrintHeader/types.ts +42 -0
- package/src/components/PrintLayout/PrintLayout.tsx +122 -0
- package/src/components/PrintLayout/PrintLayoutContext.tsx +66 -0
- package/src/components/PrintLayout/PrintPageBreak.tsx +52 -0
- package/src/components/PrintLayout/examples/PrintShowcase.tsx +230 -0
- package/src/components/PrintLayout/index.ts +19 -0
- package/src/components/PrintLayout/types.ts +37 -0
- package/src/components/PrintPageBreak/PrintPageBreak.tsx +120 -0
- package/src/components/PrintPageBreak/PrintPageBreakGroup.tsx +90 -0
- package/src/components/PrintPageBreak/PrintPageBreakIndicator.tsx +112 -0
- package/src/components/PrintPageBreak/examples/PrintPageBreakShowcase.tsx +279 -0
- package/src/components/PrintPageBreak/index.ts +23 -0
- package/src/components/PrintPageBreak/types.ts +94 -0
- package/src/components/PrintSection/PrintColumn.tsx +104 -0
- package/src/components/PrintSection/PrintDivider.tsx +101 -0
- package/src/components/PrintSection/PrintSection.tsx +129 -0
- package/src/components/PrintSection/PrintSectionContent.tsx +75 -0
- package/src/components/PrintSection/PrintSectionHeader.tsx +97 -0
- package/src/components/PrintSection/examples/PrintSectionShowcase.tsx +258 -0
- package/src/components/PrintSection/index.ts +33 -0
- package/src/components/PrintSection/types.ts +155 -0
- package/src/components/PrintText/PrintText.tsx +116 -0
- package/src/components/PrintText/index.ts +16 -0
- package/src/components/PrintText/types.ts +24 -0
- package/src/components/Progress/Progress.tsx +116 -0
- package/src/components/Progress/index.ts +3 -0
- package/src/components/PublicLayout/EventLogo.tsx +287 -0
- package/src/components/PublicLayout/PublicErrorBoundary.tsx +279 -0
- package/src/components/PublicLayout/PublicLoadingSpinner.tsx +208 -0
- package/src/components/PublicLayout/PublicPageContextChecker.tsx +130 -0
- package/src/components/PublicLayout/PublicPageDebugger.tsx +104 -0
- package/src/components/PublicLayout/PublicPageDiagnostic.tsx +162 -0
- package/src/components/PublicLayout/PublicPageFooter.tsx +124 -0
- package/src/components/PublicLayout/PublicPageHeader.tsx +178 -0
- package/src/components/PublicLayout/PublicPageLayout.tsx +232 -0
- package/src/components/PublicLayout/PublicPageProvider.tsx +137 -0
- package/src/components/PublicLayout/index.ts +51 -0
- package/src/components/Select/Select.test.tsx +948 -0
- package/src/components/Select/Select.tsx +660 -0
- package/src/components/Select/index.ts +1 -0
- package/src/components/SuperAdminGuard.tsx +116 -0
- package/src/components/Table/Table.tsx +222 -0
- package/src/components/Table/index.ts +11 -0
- package/src/components/Toast/Toast.test.tsx +586 -0
- package/src/components/Toast/Toast.tsx +339 -0
- package/src/components/Toast/index.ts +14 -0
- package/src/components/Tooltip/Tooltip.test.tsx +852 -0
- package/src/components/Tooltip/Tooltip.tsx +167 -0
- package/src/components/Tooltip/index.ts +7 -0
- package/src/components/UserMenu/UserMenu.test.tsx +702 -0
- package/src/components/UserMenu/UserMenu.tsx +243 -0
- package/src/components/UserMenu/index.ts +3 -0
- package/src/components/examples/PermissionExample.tsx +150 -0
- package/src/components/index.ts +434 -0
- package/src/components.ts +19 -0
- package/src/constants/performance.ts +14 -0
- package/src/examples/CorrectPublicPageImplementation.tsx +301 -0
- package/src/examples/PublicEventPage.tsx +274 -0
- package/src/examples/PublicPageApp.tsx +308 -0
- package/src/examples/PublicPageUsageExample.tsx +216 -0
- package/src/hooks/index.ts +56 -0
- package/src/hooks/public/index.ts +34 -0
- package/src/hooks/public/usePublicEvent.ts +261 -0
- package/src/hooks/public/usePublicEventLogo.ts +285 -0
- package/src/hooks/public/usePublicRouteParams.ts +259 -0
- package/src/hooks/useAppConfig.ts +94 -0
- package/src/hooks/useComponentPerformance.ts +39 -0
- package/src/hooks/useCounter.test.ts +135 -0
- package/src/hooks/useDataTablePerformance.ts +387 -0
- package/src/hooks/useDataTableState.ts +110 -0
- package/src/hooks/useDebounce.test.ts +375 -0
- package/src/hooks/useDebounce.ts +18 -0
- package/src/hooks/useFocusManagement.ts +161 -0
- package/src/hooks/useFocusTrap.ts +155 -0
- package/src/hooks/useInactivityTracker.ts +372 -0
- package/src/hooks/useIsMobile.ts +42 -0
- package/src/hooks/useKeyboardShortcuts.ts +237 -0
- package/src/hooks/useOrganisationPermissions.test.ts +528 -0
- package/src/hooks/useOrganisationPermissions.ts +208 -0
- package/src/hooks/useOrganisationSecurity.test.ts +734 -0
- package/src/hooks/useOrganisationSecurity.ts +262 -0
- package/src/hooks/usePerformanceMonitor.ts +128 -0
- package/src/hooks/usePermissionCache.test.ts +542 -0
- package/src/hooks/usePermissionCache.ts +455 -0
- package/src/hooks/useSecureDataAccess.ts +586 -0
- package/src/hooks/useStorage.ts +274 -0
- package/src/hooks/useToast.ts +242 -0
- package/src/hooks/useZodForm.ts +28 -0
- package/src/index.ts +199 -0
- package/src/providers/AuthProvider.tsx +369 -0
- package/src/providers/EventProvider.tsx +324 -0
- package/src/providers/InactivityProvider.tsx +238 -0
- package/src/providers/OrganisationProvider.tsx +588 -0
- package/src/providers/UnifiedAuthProvider.tsx +327 -0
- package/src/providers/index.ts +17 -0
- package/src/rbac/README.md +885 -0
- package/src/rbac/__tests__/integration.test.tsx +218 -0
- package/src/rbac/adapters.tsx +726 -0
- package/src/rbac/api.test.ts +441 -0
- package/src/rbac/api.ts +339 -0
- package/src/rbac/audit-enhanced.ts +339 -0
- package/src/rbac/audit.ts +338 -0
- package/src/rbac/cache.ts +215 -0
- package/src/rbac/components/EnhancedNavigationMenu.tsx +294 -0
- package/src/rbac/components/NavigationGuard.tsx +294 -0
- package/src/rbac/components/NavigationProvider.tsx +314 -0
- package/src/rbac/components/PagePermissionGuard.tsx +430 -0
- package/src/rbac/components/PagePermissionProvider.tsx +274 -0
- package/src/rbac/components/PermissionEnforcer.tsx +307 -0
- package/src/rbac/components/RoleBasedRouter.tsx +425 -0
- package/src/rbac/components/SecureDataProvider.tsx +319 -0
- package/src/rbac/components/index.ts +64 -0
- package/src/rbac/config.ts +133 -0
- package/src/rbac/docs/event-based-apps.md +285 -0
- package/src/rbac/engine.ts +1026 -0
- package/src/rbac/eslint-rules.js +285 -0
- package/src/rbac/examples/CompleteRBACExample.tsx +323 -0
- package/src/rbac/examples/EventBasedApp.tsx +238 -0
- package/src/rbac/hooks/index.ts +21 -0
- package/src/rbac/hooks/useCan.test.ts +461 -0
- package/src/rbac/hooks/usePermissions.test.ts +359 -0
- package/src/rbac/hooks/usePermissions.ts +567 -0
- package/src/rbac/hooks/useRBAC.simple.test.ts +90 -0
- package/src/rbac/hooks/useRBAC.test.ts +503 -0
- package/src/rbac/hooks/useRBAC.ts +262 -0
- package/src/rbac/index.ts +109 -0
- package/src/rbac/permissions.ts +293 -0
- package/src/rbac/providers/RBACProvider.tsx +634 -0
- package/src/rbac/providers/__tests__/RBACProvider.test.tsx +687 -0
- package/src/rbac/providers/index.ts +11 -0
- package/src/rbac/secureClient.ts +244 -0
- package/src/rbac/security.ts +346 -0
- package/src/rbac/testing/index.tsx +340 -0
- package/src/rbac/types.ts +343 -0
- package/src/rbac/utils/eventContext.ts +83 -0
- package/src/styles/core.css +364 -0
- package/src/styles/index.ts +51 -0
- package/src/theming/runtime.ts +187 -0
- package/src/types/database.ts +472 -0
- package/src/types/guards.ts +30 -0
- package/src/types/index.ts +25 -0
- package/src/types/organisation.ts +184 -0
- package/src/types/security.ts +70 -0
- package/src/types/supabase.ts +166 -0
- package/src/types/theme.ts +6 -0
- package/src/types/unified.ts +262 -0
- package/src/types/validation.ts +164 -0
- package/src/types/vitest-globals.d.ts +43 -0
- package/src/utils/__mocks__/supabaseMock.ts +75 -0
- package/src/utils/__mocks__/supabaseMock.tsx +198 -0
- package/src/utils/appConfig.ts +47 -0
- package/src/utils/appIdResolver.ts +130 -0
- package/src/utils/appNameResolver.ts +190 -0
- package/src/utils/audit.ts +127 -0
- package/src/utils/auth-utils.ts +96 -0
- package/src/utils/bundleAnalysis.ts +129 -0
- package/src/utils/cn.ts +7 -0
- package/src/utils/debugLogger.ts +46 -0
- package/src/utils/deviceFingerprint.ts +215 -0
- package/src/utils/dynamicUtils.ts +105 -0
- package/src/utils/formatDate.test.ts +241 -0
- package/src/utils/formatting.ts +77 -0
- package/src/utils/index.ts +145 -0
- package/src/utils/lazyLoad.tsx +44 -0
- package/src/utils/organisationContext.ts +135 -0
- package/src/utils/performanceBenchmark.ts +64 -0
- package/src/utils/performanceBudgets.ts +111 -0
- package/src/utils/permissionTypes.ts +37 -0
- package/src/utils/permissionUtils.ts +31 -0
- package/src/utils/print/PrintDataProcessor.ts +390 -0
- package/src/utils/print/examples/PrintUtilitiesShowcase.tsx +397 -0
- package/src/utils/print/index.ts +29 -0
- package/src/utils/print/types.ts +196 -0
- package/src/utils/print/usePrintOptimization.ts +272 -0
- package/src/utils/sanitization.ts +264 -0
- package/src/utils/schemaUtils.ts +37 -0
- package/src/utils/secureDataAccess.ts +361 -0
- package/src/utils/secureErrors.ts +79 -0
- package/src/utils/secureStorage.ts +244 -0
- package/src/utils/security.ts +156 -0
- package/src/utils/securityMonitor.ts +45 -0
- package/src/utils/sessionTracking.ts +170 -0
- package/src/utils/storage/README.md +348 -0
- package/src/utils/storage/config.ts +100 -0
- package/src/utils/storage/helpers.ts +359 -0
- package/src/utils/storage/index.ts +36 -0
- package/src/utils/storage/types.ts +90 -0
- package/src/utils/validation.ts +111 -0
- package/src/utils/validationUtils.ts +120 -0
- package/src/validation/common.ts +53 -0
- package/src/validation/csrf.ts +214 -0
- package/src/validation/index.ts +43 -0
- package/src/validation/passwordSchema.ts +125 -0
- package/src/validation/sanitization.ts +96 -0
- package/src/validation/schemaUtils.ts +42 -0
- package/src/validation/sqlInjectionProtection.ts +242 -0
- package/src/validation/user.ts +34 -0
- package/dist/chunk-4MCJAK7J.js.map +0 -1
- package/dist/chunk-4ZTIEYU2.js.map +0 -1
- package/dist/chunk-H4PZ4B3Y.js.map +0 -1
- package/dist/chunk-IOX76PSM.js.map +0 -1
- package/dist/chunk-JUUNUW3O.js.map +0 -1
- package/dist/chunk-KK6WIDK6.js +0 -63
- package/dist/chunk-KK6WIDK6.js.map +0 -1
- package/dist/chunk-U7DY5T33.js +0 -11
- package/dist/chunk-U7DY5T33.js.map +0 -1
- package/dist/chunk-WHLSWC6W.js.map +0 -1
- package/dist/chunk-XI7QFSSC.js +0 -790
- package/dist/chunk-XI7QFSSC.js.map +0 -1
- package/dist/chunk-XIJMMBDD.js +0 -73
- package/dist/chunk-XIJMMBDD.js.map +0 -1
- package/dist/chunk-YNU5QJ4S.js.map +0 -1
- package/dist/chunk-YWYCNGWH.js +0 -2070
- package/dist/chunk-YWYCNGWH.js.map +0 -1
- package/dist/chunk-ZJ3UKPIW.js +0 -952
- package/dist/chunk-ZJ3UKPIW.js.map +0 -1
- package/dist/useAppConfig-CZNJJsT_.d.ts +0 -148
- package/dist/{DataTable-2LB6HI6V.js.map → DataTable-ZQDRE46Q.js.map} +0 -0
- package/dist/{api-AIJ3IJX3.js.map → api-H5A3H4IR.js.map} +0 -0
- package/dist/{audit-PD5L5ZSC.js.map → appNameResolver-7GHF5ED2.js.map} +0 -0
- package/dist/{chunk-DC5AMYBS.js.map → audit-BUW3LMJB.js.map} +0 -0
- package/dist/{validation-D2-NNCCE.d.ts → validation-PM_iOaTI.d.ts} +6 -6
package/dist/rbac/index.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { SupabaseClient } from '@supabase/supabase-js';
|
|
2
|
-
import { D as Database } from '../database-
|
|
3
|
-
import React__default, { ReactNode } from 'react';
|
|
2
|
+
import { D as Database } from '../database-C3Szpi5J.js';
|
|
4
3
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
4
|
+
import React__default, { ReactNode } from 'react';
|
|
5
|
+
export { R as RBACContextType, a as RBACProvider, b as RBACProviderProps, U as UserEventAccess, u as useRBACProvider } from '../RBACProvider-BO4ilsQB.js';
|
|
6
|
+
import '../unified-CMPjE_fv.js';
|
|
5
7
|
|
|
6
8
|
/**
|
|
7
9
|
* RBAC (Role-Based Access Control) Types - Build Contract Compliant
|
|
@@ -26,13 +28,13 @@ type PermissionCheck = {
|
|
|
26
28
|
userId: UUID;
|
|
27
29
|
scope: Scope;
|
|
28
30
|
permission: Permission;
|
|
29
|
-
pageId?: UUID;
|
|
31
|
+
pageId?: UUID | string;
|
|
30
32
|
};
|
|
31
33
|
type PermissionMap = Record<string, Operation[]>;
|
|
32
34
|
type GlobalRole = 'super_admin';
|
|
33
35
|
type OrganisationRole = 'supporter' | 'member' | 'leader' | 'org_admin';
|
|
34
36
|
type EventAppRole = 'viewer' | 'participant' | 'planner' | 'event_admin';
|
|
35
|
-
type AuditEventType = 'permission_check' | 'permission_denied' | 'role_granted' | '
|
|
37
|
+
type AuditEventType = 'permission_check' | 'permission_denied' | 'role_granted' | 'role_denied' | 'rls_denied';
|
|
36
38
|
type AuditEventSource = 'api' | 'ui' | 'middleware' | 'rls';
|
|
37
39
|
interface RBACAuditEvent {
|
|
38
40
|
id: UUID;
|
|
@@ -55,18 +57,23 @@ interface PermissionCacheKey {
|
|
|
55
57
|
organisationId?: UUID;
|
|
56
58
|
eventId?: string;
|
|
57
59
|
appId?: UUID;
|
|
60
|
+
permission?: Permission;
|
|
61
|
+
pageId?: UUID | string;
|
|
58
62
|
}
|
|
59
|
-
interface
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
63
|
+
interface UserRBACContext {
|
|
64
|
+
user: any;
|
|
65
|
+
globalRole: GlobalRole | null;
|
|
66
|
+
organisationRole: OrganisationRole | null;
|
|
67
|
+
eventAppRole: EventAppRole | null;
|
|
68
|
+
hasPermission: (operation: Operation, targetPageId?: string) => Promise<boolean>;
|
|
69
|
+
hasGlobalPermission: (permission: Permission) => boolean;
|
|
70
|
+
isSuperAdmin: boolean;
|
|
71
|
+
isOrgAdmin: boolean;
|
|
72
|
+
isEventAdmin: boolean;
|
|
73
|
+
canManageOrganisation: boolean;
|
|
74
|
+
canManageEvent: boolean;
|
|
67
75
|
isLoading: boolean;
|
|
68
76
|
error: Error | null;
|
|
69
|
-
check: () => Promise<void>;
|
|
70
77
|
}
|
|
71
78
|
declare class RBACError extends Error {
|
|
72
79
|
code: string;
|
|
@@ -391,7 +398,7 @@ interface RoleGrantedAuditEvent {
|
|
|
391
398
|
* Audit event payload for role revoked
|
|
392
399
|
*/
|
|
393
400
|
interface RoleRevokedAuditEvent {
|
|
394
|
-
type: '
|
|
401
|
+
type: 'role_denied';
|
|
395
402
|
userId: UUID;
|
|
396
403
|
organisationId: UUID;
|
|
397
404
|
eventId?: string;
|
|
@@ -516,6 +523,26 @@ declare function getGlobalAuditManager(): RBACAuditManager | null;
|
|
|
516
523
|
*/
|
|
517
524
|
declare function emitAuditEvent(event: AuditEventPayload): Promise<void>;
|
|
518
525
|
|
|
526
|
+
/**
|
|
527
|
+
* RBAC Security Enhancements
|
|
528
|
+
* @package @jmruthers/pace-core
|
|
529
|
+
* @module RBAC/Security
|
|
530
|
+
* @since 1.0.0
|
|
531
|
+
*
|
|
532
|
+
* Additional security measures for the RBAC system
|
|
533
|
+
*/
|
|
534
|
+
|
|
535
|
+
/**
|
|
536
|
+
* Security context for RBAC operations
|
|
537
|
+
*/
|
|
538
|
+
interface SecurityContext {
|
|
539
|
+
userId: UUID;
|
|
540
|
+
organisationId: UUID;
|
|
541
|
+
ipAddress?: string;
|
|
542
|
+
userAgent?: string;
|
|
543
|
+
timestamp: Date;
|
|
544
|
+
}
|
|
545
|
+
|
|
519
546
|
/**
|
|
520
547
|
* RBAC Core Engine
|
|
521
548
|
* @package @jmruthers/pace-core
|
|
@@ -532,14 +559,16 @@ declare function emitAuditEvent(event: AuditEventPayload): Promise<void>;
|
|
|
532
559
|
*/
|
|
533
560
|
declare class RBACEngine {
|
|
534
561
|
private supabase;
|
|
562
|
+
private securityMiddleware;
|
|
535
563
|
constructor(supabase: SupabaseClient<Database>);
|
|
536
564
|
/**
|
|
537
565
|
* Check if a user has a specific permission
|
|
538
566
|
*
|
|
539
567
|
* @param input - Permission check input
|
|
568
|
+
* @param securityContext - Optional security context for enhanced validation
|
|
540
569
|
* @returns Promise resolving to permission result
|
|
541
570
|
*/
|
|
542
|
-
isPermitted(input: PermissionCheck): Promise<boolean>;
|
|
571
|
+
isPermitted(input: PermissionCheck, securityContext?: SecurityContext): Promise<boolean>;
|
|
543
572
|
/**
|
|
544
573
|
* Get user's access level in a scope
|
|
545
574
|
*
|
|
@@ -567,6 +596,30 @@ declare class RBACEngine {
|
|
|
567
596
|
* @returns Promise resolving to super admin status
|
|
568
597
|
*/
|
|
569
598
|
private checkSuperAdmin;
|
|
599
|
+
/**
|
|
600
|
+
* Get app configuration including requires_event setting
|
|
601
|
+
*
|
|
602
|
+
* @param appId - App ID
|
|
603
|
+
* @returns Promise resolving to app configuration
|
|
604
|
+
*/
|
|
605
|
+
getAppConfig(appId: UUID): Promise<{
|
|
606
|
+
requires_event: boolean;
|
|
607
|
+
} | null>;
|
|
608
|
+
/**
|
|
609
|
+
* Resolve organisation ID from event ID
|
|
610
|
+
*
|
|
611
|
+
* @param eventId - Event ID
|
|
612
|
+
* @returns Promise resolving to organisation ID
|
|
613
|
+
*/
|
|
614
|
+
private resolveOrganisationFromEvent;
|
|
615
|
+
/**
|
|
616
|
+
* Validate context requirements based on app configuration
|
|
617
|
+
*
|
|
618
|
+
* @param scope - Permission scope
|
|
619
|
+
* @param appId - Optional app ID
|
|
620
|
+
* @returns Promise resolving to validated scope with resolved organisation ID
|
|
621
|
+
*/
|
|
622
|
+
private validateContextRequirements;
|
|
570
623
|
/**
|
|
571
624
|
* Collect active grants for a user in a scope
|
|
572
625
|
*
|
|
@@ -627,6 +680,14 @@ declare class RBACEngine {
|
|
|
627
680
|
* @returns True if permissions match
|
|
628
681
|
*/
|
|
629
682
|
private permissionMatches;
|
|
683
|
+
/**
|
|
684
|
+
* Resolve a page ID to UUID if it's a page name
|
|
685
|
+
*
|
|
686
|
+
* @param pageId - Page ID (UUID) or page name (string)
|
|
687
|
+
* @param appId - App ID to look up the page
|
|
688
|
+
* @returns Resolved page ID (UUID) or original pageId if it's already a UUID or can't be resolved
|
|
689
|
+
*/
|
|
690
|
+
private resolvePageId;
|
|
630
691
|
}
|
|
631
692
|
/**
|
|
632
693
|
* Create an RBAC engine instance
|
|
@@ -636,950 +697,1014 @@ declare class RBACEngine {
|
|
|
636
697
|
*/
|
|
637
698
|
declare function createRBACEngine(supabase: SupabaseClient<Database>): RBACEngine;
|
|
638
699
|
|
|
700
|
+
interface PagePermissionContextType {
|
|
701
|
+
/** Check if user has permission for a page */
|
|
702
|
+
hasPagePermission: (pageName: string, operation: string, pageId?: string, scope?: Scope) => boolean;
|
|
703
|
+
/** Get all page permissions for current user */
|
|
704
|
+
getPagePermissions: () => Record<string, string[]>;
|
|
705
|
+
/** Check if page permission checking is enabled */
|
|
706
|
+
isEnabled: boolean;
|
|
707
|
+
/** Check if strict mode is enabled */
|
|
708
|
+
isStrictMode: boolean;
|
|
709
|
+
/** Check if audit logging is enabled */
|
|
710
|
+
isAuditLogEnabled: boolean;
|
|
711
|
+
/** Get page access history */
|
|
712
|
+
getPageAccessHistory: () => PageAccessRecord[];
|
|
713
|
+
/** Clear page access history */
|
|
714
|
+
clearPageAccessHistory: () => void;
|
|
715
|
+
}
|
|
716
|
+
interface PageAccessRecord {
|
|
717
|
+
pageName: string;
|
|
718
|
+
operation: string;
|
|
719
|
+
userId: UUID;
|
|
720
|
+
scope: Scope;
|
|
721
|
+
allowed: boolean;
|
|
722
|
+
timestamp: string;
|
|
723
|
+
pageId?: string;
|
|
724
|
+
}
|
|
725
|
+
interface PagePermissionProviderProps {
|
|
726
|
+
/** Child components */
|
|
727
|
+
children: React__default.ReactNode;
|
|
728
|
+
/** Enable strict mode to prevent bypassing (default: true) */
|
|
729
|
+
strictMode?: boolean;
|
|
730
|
+
/** Enable audit logging (default: true) */
|
|
731
|
+
auditLog?: boolean;
|
|
732
|
+
/** Callback when page access is attempted */
|
|
733
|
+
onPageAccess?: (pageName: string, operation: string, allowed: boolean, record: PageAccessRecord) => void;
|
|
734
|
+
/** Callback when strict mode violation occurs */
|
|
735
|
+
onStrictModeViolation?: (pageName: string, operation: string, record: PageAccessRecord) => void;
|
|
736
|
+
/** Maximum number of access records to keep in history */
|
|
737
|
+
maxHistorySize?: number;
|
|
738
|
+
}
|
|
639
739
|
/**
|
|
640
|
-
*
|
|
641
|
-
* @package @jmruthers/pace-core
|
|
642
|
-
* @module RBAC/Hooks
|
|
643
|
-
* @since 1.0.0
|
|
644
|
-
*
|
|
645
|
-
* This module provides React hooks for RBAC functionality.
|
|
646
|
-
*/
|
|
647
|
-
|
|
648
|
-
/**
|
|
649
|
-
* Hook to get user's permissions in a scope
|
|
650
|
-
*
|
|
651
|
-
* @param userId - User ID
|
|
652
|
-
* @param scope - Permission scope
|
|
653
|
-
* @returns Permission data and loading state
|
|
654
|
-
*
|
|
655
|
-
* @example
|
|
656
|
-
* ```tsx
|
|
657
|
-
* function MyComponent() {
|
|
658
|
-
* const { permissions, isLoading, error } = usePermissions(
|
|
659
|
-
* 'user-123',
|
|
660
|
-
* { organisationId: 'org-456' }
|
|
661
|
-
* );
|
|
740
|
+
* PagePermissionProvider - Manages page-level permissions across the app
|
|
662
741
|
*
|
|
663
|
-
*
|
|
664
|
-
*
|
|
742
|
+
* This provider ensures that all pages are properly protected and provides
|
|
743
|
+
* centralized page permission management with strict enforcement.
|
|
665
744
|
*
|
|
666
|
-
*
|
|
667
|
-
*
|
|
668
|
-
* {permissions['page-1']?.includes('read') && <ReadButton />}
|
|
669
|
-
* {permissions['page-1']?.includes('manage') && <ManageButton />}
|
|
670
|
-
* </div>
|
|
671
|
-
* );
|
|
672
|
-
* }
|
|
673
|
-
* ```
|
|
745
|
+
* @param props - Provider props
|
|
746
|
+
* @returns React element with page permission context
|
|
674
747
|
*/
|
|
675
|
-
declare function
|
|
748
|
+
declare function PagePermissionProvider({ children, strictMode, auditLog, onPageAccess, onStrictModeViolation, maxHistorySize }: PagePermissionProviderProps): react_jsx_runtime.JSX.Element;
|
|
676
749
|
/**
|
|
677
|
-
* Hook to
|
|
678
|
-
*
|
|
679
|
-
* @param userId - User ID
|
|
680
|
-
* @param scope - Permission scope
|
|
681
|
-
* @param permission - Permission to check
|
|
682
|
-
* @param pageId - Optional page ID
|
|
683
|
-
* @param useCache - Whether to use cached results (default: true)
|
|
684
|
-
* @returns Permission check result and loading state
|
|
685
|
-
*
|
|
686
|
-
* @example
|
|
687
|
-
* ```tsx
|
|
688
|
-
* function MyComponent() {
|
|
689
|
-
* const { can, isLoading } = useCan(
|
|
690
|
-
* 'user-123',
|
|
691
|
-
* { organisationId: 'org-456' },
|
|
692
|
-
* 'manage:events',
|
|
693
|
-
* 'page-789'
|
|
694
|
-
* );
|
|
695
|
-
*
|
|
696
|
-
* if (isLoading) return <div>Checking permission...</div>;
|
|
750
|
+
* Hook to use page permission context
|
|
697
751
|
*
|
|
698
|
-
*
|
|
699
|
-
*
|
|
700
|
-
* {can ? <AdminPanel /> : <AccessDenied />}
|
|
701
|
-
* </div>
|
|
702
|
-
* );
|
|
703
|
-
* }
|
|
704
|
-
* ```
|
|
752
|
+
* @returns Page permission context
|
|
753
|
+
* @throws Error if used outside of PagePermissionProvider
|
|
705
754
|
*/
|
|
706
|
-
declare function
|
|
755
|
+
declare function usePagePermissions(): PagePermissionContextType;
|
|
756
|
+
|
|
757
|
+
interface PagePermissionGuardProps {
|
|
758
|
+
/** Name of the page being protected */
|
|
759
|
+
pageName: string;
|
|
760
|
+
/** Operation being performed on the page */
|
|
761
|
+
operation: 'read' | 'create' | 'update' | 'delete';
|
|
762
|
+
/** Content to render when user has permission */
|
|
763
|
+
children: React__default.ReactNode;
|
|
764
|
+
/** Content to render when user lacks permission */
|
|
765
|
+
fallback?: React__default.ReactNode;
|
|
766
|
+
/** Enable strict mode to prevent bypassing (default: true) */
|
|
767
|
+
strictMode?: boolean;
|
|
768
|
+
/** Force audit logging for this page access (default: true) */
|
|
769
|
+
auditLog?: boolean;
|
|
770
|
+
/** Custom page ID for permission checking */
|
|
771
|
+
pageId?: string;
|
|
772
|
+
/** Custom scope for permission checking */
|
|
773
|
+
scope?: Scope;
|
|
774
|
+
/** Callback when access is denied */
|
|
775
|
+
onDenied?: (pageName: string, operation: string) => void;
|
|
776
|
+
/** Loading state content */
|
|
777
|
+
loading?: React__default.ReactNode;
|
|
778
|
+
}
|
|
707
779
|
/**
|
|
708
|
-
*
|
|
709
|
-
*
|
|
710
|
-
* @param userId - User ID
|
|
711
|
-
* @param scope - Permission scope
|
|
712
|
-
* @returns Access level and loading state
|
|
713
|
-
*
|
|
714
|
-
* @example
|
|
715
|
-
* ```tsx
|
|
716
|
-
* function MyComponent() {
|
|
717
|
-
* const { accessLevel, isLoading } = useAccessLevel(
|
|
718
|
-
* 'user-123',
|
|
719
|
-
* { organisationId: 'org-456' }
|
|
720
|
-
* );
|
|
780
|
+
* PagePermissionGuard - Enforces page-level permissions
|
|
721
781
|
*
|
|
722
|
-
*
|
|
782
|
+
* This component ensures that users can only access pages they have permission for.
|
|
783
|
+
* It integrates with the existing RBAC system and provides strict enforcement to
|
|
784
|
+
* prevent apps from bypassing permission checks.
|
|
723
785
|
*
|
|
724
|
-
*
|
|
725
|
-
*
|
|
726
|
-
* {accessLevel === 'super' && <SuperAdminPanel />}
|
|
727
|
-
* {accessLevel === 'admin' && <AdminPanel />}
|
|
728
|
-
* {accessLevel === 'planner' && <PlannerPanel />}
|
|
729
|
-
* </div>
|
|
730
|
-
* );
|
|
731
|
-
* }
|
|
732
|
-
* ```
|
|
786
|
+
* @param props - Component props
|
|
787
|
+
* @returns React element with permission enforcement
|
|
733
788
|
*/
|
|
734
|
-
declare function
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
789
|
+
declare function PagePermissionGuard({ pageName, operation, children, fallback, strictMode, auditLog, pageId, scope, onDenied, loading }: PagePermissionGuardProps): react_jsx_runtime.JSX.Element;
|
|
790
|
+
|
|
791
|
+
interface DataAccessRecord {
|
|
792
|
+
table: string;
|
|
793
|
+
operation: string;
|
|
794
|
+
userId: UUID;
|
|
795
|
+
scope: Scope;
|
|
796
|
+
allowed: boolean;
|
|
797
|
+
timestamp: string;
|
|
798
|
+
query?: string;
|
|
799
|
+
filters?: Record<string, any>;
|
|
800
|
+
}
|
|
801
|
+
interface SecureDataContextType {
|
|
802
|
+
/** Check if data access is allowed for a table and operation */
|
|
803
|
+
isDataAccessAllowed: (table: string, operation: string, scope?: Scope) => boolean;
|
|
804
|
+
/** Get all data access permissions for current user */
|
|
805
|
+
getDataAccessPermissions: () => Record<string, string[]>;
|
|
806
|
+
/** Check if secure data access is enabled */
|
|
807
|
+
isEnabled: boolean;
|
|
808
|
+
/** Check if strict mode is enabled */
|
|
809
|
+
isStrictMode: boolean;
|
|
810
|
+
/** Check if audit logging is enabled */
|
|
811
|
+
isAuditLogEnabled: boolean;
|
|
812
|
+
/** Get data access history */
|
|
813
|
+
getDataAccessHistory: () => DataAccessRecord[];
|
|
814
|
+
/** Clear data access history */
|
|
815
|
+
clearDataAccessHistory: () => void;
|
|
816
|
+
/** Validate data access attempt */
|
|
817
|
+
validateDataAccess: (table: string, operation: string, scope?: Scope) => boolean;
|
|
818
|
+
}
|
|
819
|
+
interface SecureDataProviderProps {
|
|
820
|
+
/** Child components */
|
|
821
|
+
children: React__default.ReactNode;
|
|
822
|
+
/** Enable strict mode to prevent bypassing (default: true) */
|
|
823
|
+
strictMode?: boolean;
|
|
824
|
+
/** Enable audit logging (default: true) */
|
|
825
|
+
auditLog?: boolean;
|
|
826
|
+
/** Callback when data access is attempted */
|
|
827
|
+
onDataAccess?: (table: string, operation: string, allowed: boolean, record: DataAccessRecord) => void;
|
|
828
|
+
/** Callback when strict mode violation occurs */
|
|
829
|
+
onStrictModeViolation?: (table: string, operation: string, record: DataAccessRecord) => void;
|
|
830
|
+
/** Maximum number of access records to keep in history */
|
|
831
|
+
maxHistorySize?: number;
|
|
832
|
+
/** Enable RLS enforcement (default: true) */
|
|
833
|
+
enforceRLS?: boolean;
|
|
834
|
+
}
|
|
740
835
|
/**
|
|
741
|
-
*
|
|
742
|
-
*
|
|
743
|
-
* @param userId - User ID
|
|
744
|
-
* @param scope - Permission scope
|
|
745
|
-
* @param permissions - Array of permissions to check
|
|
746
|
-
* @param pageId - Optional page ID
|
|
747
|
-
* @param useCache - Whether to use cached results (default: true)
|
|
748
|
-
* @returns Object with permission results and loading state
|
|
836
|
+
* SecureDataProvider - Prevents direct Supabase access and enforces secure data patterns
|
|
749
837
|
*
|
|
750
|
-
*
|
|
751
|
-
*
|
|
752
|
-
* function MyComponent() {
|
|
753
|
-
* const { permissions, isLoading } = useMultiplePermissions(
|
|
754
|
-
* 'user-123',
|
|
755
|
-
* { organisationId: 'org-456' },
|
|
756
|
-
* ['read:events', 'manage:events', 'delete:events']
|
|
757
|
-
* );
|
|
838
|
+
* This provider ensures that all data access goes through the secure RBAC system
|
|
839
|
+
* and prevents apps from bypassing data access controls.
|
|
758
840
|
*
|
|
759
|
-
*
|
|
760
|
-
*
|
|
761
|
-
* {permissions['read:events'] && <ReadButton />}
|
|
762
|
-
* {permissions['manage:events'] && <ManageButton />}
|
|
763
|
-
* {permissions['delete:events'] && <DeleteButton />}
|
|
764
|
-
* </div>
|
|
765
|
-
* );
|
|
766
|
-
* }
|
|
767
|
-
* ```
|
|
841
|
+
* @param props - Provider props
|
|
842
|
+
* @returns React element with secure data context
|
|
768
843
|
*/
|
|
769
|
-
declare function
|
|
770
|
-
permissions: Record<Permission, boolean>;
|
|
771
|
-
isLoading: boolean;
|
|
772
|
-
error: Error | null;
|
|
773
|
-
refetch: () => Promise<void>;
|
|
774
|
-
};
|
|
844
|
+
declare function SecureDataProvider({ children, strictMode, auditLog, onDataAccess, onStrictModeViolation, maxHistorySize, enforceRLS }: SecureDataProviderProps): react_jsx_runtime.JSX.Element;
|
|
775
845
|
/**
|
|
776
|
-
* Hook to
|
|
846
|
+
* Hook to use secure data context
|
|
777
847
|
*
|
|
778
|
-
* @
|
|
779
|
-
* @
|
|
780
|
-
* @param permissions - Array of permissions to check
|
|
781
|
-
* @param pageId - Optional page ID
|
|
782
|
-
* @returns True if user has any permission and loading state
|
|
783
|
-
*
|
|
784
|
-
* @example
|
|
785
|
-
* ```tsx
|
|
786
|
-
* function MyComponent() {
|
|
787
|
-
* const { hasAny, isLoading } = useHasAnyPermission(
|
|
788
|
-
* 'user-123',
|
|
789
|
-
* { organisationId: 'org-456' },
|
|
790
|
-
* ['read:events', 'manage:events']
|
|
791
|
-
* );
|
|
792
|
-
*
|
|
793
|
-
* return (
|
|
794
|
-
* <div>
|
|
795
|
-
* {hasAny ? <EventContent /> : <AccessDenied />}
|
|
796
|
-
* </div>
|
|
797
|
-
* );
|
|
798
|
-
* }
|
|
799
|
-
* ```
|
|
848
|
+
* @returns Secure data context
|
|
849
|
+
* @throws Error if used outside of SecureDataProvider
|
|
800
850
|
*/
|
|
801
|
-
declare function
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
851
|
+
declare function useSecureData(): SecureDataContextType;
|
|
852
|
+
|
|
853
|
+
interface PermissionEnforcerProps {
|
|
854
|
+
/** Permissions required for access */
|
|
855
|
+
permissions: Permission[];
|
|
856
|
+
/** Operation being performed */
|
|
857
|
+
operation: string;
|
|
858
|
+
/** Content to render when user has permission */
|
|
859
|
+
children: React__default.ReactNode;
|
|
860
|
+
/** Content to render when user lacks permission */
|
|
861
|
+
fallback?: React__default.ReactNode;
|
|
862
|
+
/** Enable strict mode to prevent bypassing (default: true) */
|
|
863
|
+
strictMode?: boolean;
|
|
864
|
+
/** Force audit logging for this operation (default: true) */
|
|
865
|
+
auditLog?: boolean;
|
|
866
|
+
/** Custom scope for permission checking */
|
|
867
|
+
scope?: Scope;
|
|
868
|
+
/** Callback when access is denied */
|
|
869
|
+
onDenied?: (permissions: Permission[], operation: string) => void;
|
|
870
|
+
/** Loading state content */
|
|
871
|
+
loading?: React__default.ReactNode;
|
|
872
|
+
/** Require all permissions (AND) or any permission (OR) */
|
|
873
|
+
requireAll?: boolean;
|
|
874
|
+
}
|
|
807
875
|
/**
|
|
808
|
-
*
|
|
809
|
-
*
|
|
810
|
-
* @param userId - User ID
|
|
811
|
-
* @param scope - Permission scope
|
|
812
|
-
* @param permissions - Array of permissions to check
|
|
813
|
-
* @param pageId - Optional page ID
|
|
814
|
-
* @returns True if user has all permissions and loading state
|
|
876
|
+
* PermissionEnforcer - Enforces permissions for operations
|
|
815
877
|
*
|
|
816
|
-
*
|
|
817
|
-
*
|
|
818
|
-
*
|
|
819
|
-
* const { hasAll, isLoading } = useHasAllPermissions(
|
|
820
|
-
* 'user-123',
|
|
821
|
-
* { organisationId: 'org-456' },
|
|
822
|
-
* ['read:events', 'manage:events']
|
|
823
|
-
* );
|
|
878
|
+
* This component ensures that users can only perform operations they have permission for.
|
|
879
|
+
* It integrates with the existing RBAC system and provides strict enforcement to
|
|
880
|
+
* prevent apps from bypassing permission checks.
|
|
824
881
|
*
|
|
825
|
-
*
|
|
826
|
-
*
|
|
827
|
-
* {hasAll ? <FullAccessPanel /> : <LimitedAccessPanel />}
|
|
828
|
-
* </div>
|
|
829
|
-
* );
|
|
830
|
-
* }
|
|
831
|
-
* ```
|
|
882
|
+
* @param props - Component props
|
|
883
|
+
* @returns React element with permission enforcement
|
|
832
884
|
*/
|
|
833
|
-
declare function
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
885
|
+
declare function PermissionEnforcer({ permissions, operation, children, fallback, strictMode, auditLog, scope, onDenied, loading, requireAll }: PermissionEnforcerProps): react_jsx_runtime.JSX.Element;
|
|
886
|
+
|
|
887
|
+
interface RouteConfig {
|
|
888
|
+
/** Route path */
|
|
889
|
+
path: string;
|
|
890
|
+
/** React component to render */
|
|
891
|
+
component: React__default.ComponentType;
|
|
892
|
+
/** Permissions required for this route */
|
|
893
|
+
permissions: Permission[];
|
|
894
|
+
/** Roles that can access this route */
|
|
895
|
+
roles?: string[];
|
|
896
|
+
/** Minimum access level required */
|
|
897
|
+
accessLevel?: AccessLevel;
|
|
898
|
+
/** Page ID for permission checking */
|
|
899
|
+
pageId?: string;
|
|
900
|
+
/** Enable strict mode for this route */
|
|
901
|
+
strictMode?: boolean;
|
|
902
|
+
/** Route metadata */
|
|
903
|
+
meta?: {
|
|
904
|
+
title?: string;
|
|
905
|
+
description?: string;
|
|
906
|
+
requiresAuth?: boolean;
|
|
907
|
+
hidden?: boolean;
|
|
908
|
+
};
|
|
909
|
+
}
|
|
910
|
+
interface RouteAccessRecord {
|
|
911
|
+
route: string;
|
|
912
|
+
permissions: Permission[];
|
|
913
|
+
userId: UUID;
|
|
914
|
+
scope: Scope;
|
|
915
|
+
allowed: boolean;
|
|
916
|
+
timestamp: string;
|
|
917
|
+
pageId?: string;
|
|
918
|
+
roles?: string[];
|
|
919
|
+
accessLevel?: AccessLevel;
|
|
920
|
+
}
|
|
921
|
+
interface RoleBasedRouterContextType {
|
|
922
|
+
/** Get all accessible routes for current user */
|
|
923
|
+
getAccessibleRoutes: () => RouteConfig[];
|
|
924
|
+
/** Check if user can access a specific route */
|
|
925
|
+
canAccessRoute: (path: string) => boolean;
|
|
926
|
+
/** Get route configuration for a path */
|
|
927
|
+
getRouteConfig: (path: string) => RouteConfig | null;
|
|
928
|
+
/** Get route access history */
|
|
929
|
+
getRouteAccessHistory: () => RouteAccessRecord[];
|
|
930
|
+
/** Clear route access history */
|
|
931
|
+
clearRouteAccessHistory: () => void;
|
|
932
|
+
/** Check if strict mode is enabled */
|
|
933
|
+
isStrictMode: boolean;
|
|
934
|
+
/** Check if audit logging is enabled */
|
|
935
|
+
isAuditLogEnabled: boolean;
|
|
936
|
+
}
|
|
937
|
+
interface RoleBasedRouterProps {
|
|
938
|
+
/** Route configuration */
|
|
939
|
+
routes: RouteConfig[];
|
|
940
|
+
/** Fallback route for unauthorized access */
|
|
941
|
+
fallbackRoute?: string;
|
|
942
|
+
/** Child components */
|
|
943
|
+
children: React__default.ReactNode;
|
|
944
|
+
/** Enable strict mode to prevent bypassing (default: true) */
|
|
945
|
+
strictMode?: boolean;
|
|
946
|
+
/** Enable audit logging (default: true) */
|
|
947
|
+
auditLog?: boolean;
|
|
948
|
+
/** Callback when route access is attempted */
|
|
949
|
+
onRouteAccess?: (route: string, allowed: boolean, record: RouteAccessRecord) => void;
|
|
950
|
+
/** Callback when strict mode violation occurs */
|
|
951
|
+
onStrictModeViolation?: (route: string, record: RouteAccessRecord) => void;
|
|
952
|
+
/** Maximum number of access records to keep in history */
|
|
953
|
+
maxHistorySize?: number;
|
|
954
|
+
/** Custom unauthorized component */
|
|
955
|
+
unauthorizedComponent?: React__default.ComponentType<{
|
|
956
|
+
route: string;
|
|
957
|
+
reason: string;
|
|
958
|
+
}>;
|
|
959
|
+
}
|
|
839
960
|
/**
|
|
840
|
-
*
|
|
841
|
-
*
|
|
842
|
-
* This hook only reads from the core cache and does not perform
|
|
843
|
-
* any bespoke caching as per the contract requirements.
|
|
844
|
-
*
|
|
845
|
-
* @param userId - User ID
|
|
846
|
-
* @param scope - Permission scope
|
|
847
|
-
* @returns Cached permission data and loading state
|
|
848
|
-
*
|
|
849
|
-
* @example
|
|
850
|
-
* ```tsx
|
|
851
|
-
* function MyComponent() {
|
|
852
|
-
* const { permissions, isLoading, error } = useCachedPermissions(
|
|
853
|
-
* 'user-123',
|
|
854
|
-
* { organisationId: 'org-456' }
|
|
855
|
-
* );
|
|
961
|
+
* RoleBasedRouter - Centralized routing control with role-based protection
|
|
856
962
|
*
|
|
857
|
-
*
|
|
858
|
-
*
|
|
963
|
+
* This component ensures that all routes are properly protected and provides
|
|
964
|
+
* centralized routing control to prevent apps from bypassing route protection.
|
|
859
965
|
*
|
|
860
|
-
*
|
|
861
|
-
*
|
|
862
|
-
* {permissions['page-1']?.includes('read') && <ReadButton />}
|
|
863
|
-
* {permissions['page-1']?.includes('manage') && <ManageButton />}
|
|
864
|
-
* </div>
|
|
865
|
-
* );
|
|
866
|
-
* }
|
|
867
|
-
* ```
|
|
966
|
+
* @param props - Router props
|
|
967
|
+
* @returns React element with role-based routing
|
|
868
968
|
*/
|
|
869
|
-
declare function
|
|
870
|
-
permissions: PermissionMap;
|
|
871
|
-
isLoading: boolean;
|
|
872
|
-
error: Error | null;
|
|
873
|
-
refetch: () => Promise<void>;
|
|
874
|
-
};
|
|
875
|
-
|
|
969
|
+
declare function RoleBasedRouter({ routes, fallbackRoute, children, strictMode, auditLog, onRouteAccess, onStrictModeViolation, maxHistorySize, unauthorizedComponent: UnauthorizedComponent }: RoleBasedRouterProps): react_jsx_runtime.JSX.Element;
|
|
876
970
|
/**
|
|
877
|
-
*
|
|
878
|
-
* @package @jmruthers/pace-core
|
|
879
|
-
* @module RBAC/Adapters
|
|
880
|
-
* @since 1.0.0
|
|
971
|
+
* Hook to use role-based router context
|
|
881
972
|
*
|
|
882
|
-
*
|
|
973
|
+
* @returns Role-based router context
|
|
974
|
+
* @throws Error if used outside of RoleBasedRouter
|
|
883
975
|
*/
|
|
976
|
+
declare function useRoleBasedRouter(): RoleBasedRouterContextType;
|
|
884
977
|
|
|
978
|
+
interface NavigationItem {
|
|
979
|
+
/** Unique identifier for the navigation item */
|
|
980
|
+
id: string;
|
|
981
|
+
/** Display label for the navigation item */
|
|
982
|
+
label: string;
|
|
983
|
+
/** Navigation path/URL */
|
|
984
|
+
path: string;
|
|
985
|
+
/** Permissions required for this navigation item */
|
|
986
|
+
permissions: Permission[];
|
|
987
|
+
/** Roles that can access this navigation item */
|
|
988
|
+
roles?: string[];
|
|
989
|
+
/** Minimum access level required */
|
|
990
|
+
accessLevel?: 'viewer' | 'participant' | 'planner' | 'admin' | 'super';
|
|
991
|
+
/** Page ID for permission checking */
|
|
992
|
+
pageId?: string;
|
|
993
|
+
/** Enable strict mode for this navigation item */
|
|
994
|
+
strictMode?: boolean;
|
|
995
|
+
/** Navigation item metadata */
|
|
996
|
+
meta?: {
|
|
997
|
+
icon?: string;
|
|
998
|
+
description?: string;
|
|
999
|
+
hidden?: boolean;
|
|
1000
|
+
order?: number;
|
|
1001
|
+
};
|
|
1002
|
+
}
|
|
1003
|
+
interface NavigationAccessRecord {
|
|
1004
|
+
navigationItem: string;
|
|
1005
|
+
permissions: Permission[];
|
|
1006
|
+
userId: UUID;
|
|
1007
|
+
scope: Scope;
|
|
1008
|
+
allowed: boolean;
|
|
1009
|
+
timestamp: string;
|
|
1010
|
+
pageId?: string;
|
|
1011
|
+
roles?: string[];
|
|
1012
|
+
accessLevel?: string;
|
|
1013
|
+
}
|
|
1014
|
+
interface NavigationContextType {
|
|
1015
|
+
/** Check if user has permission for a navigation item */
|
|
1016
|
+
hasNavigationPermission: (item: NavigationItem) => boolean;
|
|
1017
|
+
/** Get all navigation permissions for current user */
|
|
1018
|
+
getNavigationPermissions: () => Record<string, string[]>;
|
|
1019
|
+
/** Get filtered navigation items based on permissions */
|
|
1020
|
+
getFilteredNavigationItems: (items: NavigationItem[]) => NavigationItem[];
|
|
1021
|
+
/** Check if navigation permission checking is enabled */
|
|
1022
|
+
isEnabled: boolean;
|
|
1023
|
+
/** Check if strict mode is enabled */
|
|
1024
|
+
isStrictMode: boolean;
|
|
1025
|
+
/** Check if audit logging is enabled */
|
|
1026
|
+
isAuditLogEnabled: boolean;
|
|
1027
|
+
/** Get navigation access history */
|
|
1028
|
+
getNavigationAccessHistory: () => NavigationAccessRecord[];
|
|
1029
|
+
/** Clear navigation access history */
|
|
1030
|
+
clearNavigationAccessHistory: () => void;
|
|
1031
|
+
}
|
|
1032
|
+
interface NavigationProviderProps {
|
|
1033
|
+
/** Child components */
|
|
1034
|
+
children: React__default.ReactNode;
|
|
1035
|
+
/** Enable strict mode to prevent bypassing (default: true) */
|
|
1036
|
+
strictMode?: boolean;
|
|
1037
|
+
/** Enable audit logging (default: true) */
|
|
1038
|
+
auditLog?: boolean;
|
|
1039
|
+
/** Callback when navigation access is attempted */
|
|
1040
|
+
onNavigationAccess?: (item: NavigationItem, allowed: boolean, record: NavigationAccessRecord) => void;
|
|
1041
|
+
/** Callback when strict mode violation occurs */
|
|
1042
|
+
onStrictModeViolation?: (item: NavigationItem, record: NavigationAccessRecord) => void;
|
|
1043
|
+
/** Maximum number of access records to keep in history */
|
|
1044
|
+
maxHistorySize?: number;
|
|
1045
|
+
}
|
|
885
1046
|
/**
|
|
886
|
-
*
|
|
1047
|
+
* NavigationProvider - Manages navigation-level permissions across the app
|
|
887
1048
|
*
|
|
888
|
-
*
|
|
889
|
-
*
|
|
1049
|
+
* This provider ensures that all navigation items are properly protected and provides
|
|
1050
|
+
* centralized navigation permission management with strict enforcement.
|
|
890
1051
|
*
|
|
891
|
-
* @
|
|
892
|
-
*
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
*
|
|
897
|
-
* permission="manage:events"
|
|
898
|
-
* pageId="page-789"
|
|
899
|
-
* fallback={<AccessDenied />}
|
|
900
|
-
* >
|
|
901
|
-
* <AdminPanel />
|
|
902
|
-
* </PermissionGuard>
|
|
1052
|
+
* @param props - Provider props
|
|
1053
|
+
* @returns React element with navigation permission context
|
|
1054
|
+
*/
|
|
1055
|
+
declare function NavigationProvider({ children, strictMode, auditLog, onNavigationAccess, onStrictModeViolation, maxHistorySize }: NavigationProviderProps): react_jsx_runtime.JSX.Element;
|
|
1056
|
+
/**
|
|
1057
|
+
* Hook to use navigation permission context
|
|
903
1058
|
*
|
|
904
|
-
*
|
|
905
|
-
*
|
|
906
|
-
* permission="manage:events"
|
|
907
|
-
* scope={{ organisationId: 'org-456' }}
|
|
908
|
-
* fallback={<AccessDenied />}
|
|
909
|
-
* >
|
|
910
|
-
* <AdminPanel />
|
|
911
|
-
* </PermissionGuard>
|
|
912
|
-
* ```
|
|
1059
|
+
* @returns Navigation permission context
|
|
1060
|
+
* @throws Error if used outside of NavigationProvider
|
|
913
1061
|
*/
|
|
914
|
-
declare function
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
permission
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
fallback?: ReactNode;
|
|
925
|
-
onDenied?: () => void;
|
|
926
|
-
loading?: ReactNode;
|
|
1062
|
+
declare function useNavigationPermissions(): NavigationContextType;
|
|
1063
|
+
|
|
1064
|
+
interface NavigationGuardProps {
|
|
1065
|
+
/** Navigation item being protected */
|
|
1066
|
+
navigationItem: NavigationItem;
|
|
1067
|
+
/** Content to render when user has permission */
|
|
1068
|
+
children: React__default.ReactNode;
|
|
1069
|
+
/** Content to render when user lacks permission */
|
|
1070
|
+
fallback?: React__default.ReactNode;
|
|
1071
|
+
/** Enable strict mode to prevent bypassing (default: true) */
|
|
927
1072
|
strictMode?: boolean;
|
|
1073
|
+
/** Force audit logging for this navigation access (default: true) */
|
|
928
1074
|
auditLog?: boolean;
|
|
929
|
-
|
|
930
|
-
|
|
1075
|
+
/** Custom scope for permission checking */
|
|
1076
|
+
scope?: Scope;
|
|
1077
|
+
/** Callback when access is denied */
|
|
1078
|
+
onDenied?: (item: NavigationItem) => void;
|
|
1079
|
+
/** Loading state content */
|
|
1080
|
+
loading?: React__default.ReactNode;
|
|
1081
|
+
/** Require all permissions (AND) or any permission (OR) */
|
|
1082
|
+
requireAll?: boolean;
|
|
1083
|
+
}
|
|
931
1084
|
/**
|
|
932
|
-
*
|
|
933
|
-
*
|
|
934
|
-
* A React component that conditionally renders children based on access level.
|
|
935
|
-
* Can auto-infer userId from context if not provided.
|
|
1085
|
+
* NavigationGuard - Enforces navigation-level permissions
|
|
936
1086
|
*
|
|
937
|
-
*
|
|
938
|
-
*
|
|
939
|
-
*
|
|
940
|
-
* <AccessLevelGuard
|
|
941
|
-
* userId="user-123"
|
|
942
|
-
* scope={{ organisationId: 'org-456' }}
|
|
943
|
-
* minLevel="admin"
|
|
944
|
-
* fallback={<AccessDenied />}
|
|
945
|
-
* >
|
|
946
|
-
* <AdminPanel />
|
|
947
|
-
* </AccessLevelGuard>
|
|
1087
|
+
* This component ensures that users can only access navigation items they have permission for.
|
|
1088
|
+
* It integrates with the existing RBAC system and provides strict enforcement to
|
|
1089
|
+
* prevent apps from bypassing navigation permission checks.
|
|
948
1090
|
*
|
|
949
|
-
*
|
|
950
|
-
*
|
|
951
|
-
* minLevel="admin"
|
|
952
|
-
* scope={{ organisationId: 'org-456' }}
|
|
953
|
-
* fallback={<AccessDenied />}
|
|
954
|
-
* >
|
|
955
|
-
* <AdminPanel />
|
|
956
|
-
* </AccessLevelGuard>
|
|
957
|
-
* ```
|
|
1091
|
+
* @param props - Component props
|
|
1092
|
+
* @returns React element with navigation permission enforcement
|
|
958
1093
|
*/
|
|
959
|
-
declare function
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
1094
|
+
declare function NavigationGuard({ navigationItem, children, fallback, strictMode, auditLog, scope, onDenied, loading, requireAll }: NavigationGuardProps): react_jsx_runtime.JSX.Element;
|
|
1095
|
+
|
|
1096
|
+
interface EnhancedNavigationMenuProps {
|
|
1097
|
+
/** Navigation items to display */
|
|
1098
|
+
items: NavigationItem[];
|
|
1099
|
+
/** Enable strict mode to prevent bypassing (default: true) */
|
|
1100
|
+
strictMode?: boolean;
|
|
1101
|
+
/** Enable audit logging (default: true) */
|
|
1102
|
+
auditLog?: boolean;
|
|
1103
|
+
/** Callback when navigation access is attempted */
|
|
1104
|
+
onNavigationAccess?: (item: NavigationItem, allowed: boolean) => void;
|
|
1105
|
+
/** Callback when strict mode violation occurs */
|
|
1106
|
+
onStrictModeViolation?: (item: NavigationItem) => void;
|
|
1107
|
+
/** Custom className for the navigation menu */
|
|
1108
|
+
className?: string;
|
|
1109
|
+
/** Custom className for navigation items */
|
|
1110
|
+
itemClassName?: string;
|
|
1111
|
+
/** Custom className for active navigation items */
|
|
1112
|
+
activeItemClassName?: string;
|
|
1113
|
+
/** Custom className for disabled navigation items */
|
|
1114
|
+
disabledItemClassName?: string;
|
|
1115
|
+
/** Show/hide navigation items that user doesn't have permission for */
|
|
1116
|
+
hideUnauthorizedItems?: boolean;
|
|
1117
|
+
/** Custom render function for navigation items */
|
|
1118
|
+
renderItem?: (item: NavigationItem, isAuthorized: boolean) => React__default.ReactNode;
|
|
1119
|
+
/** Current active path for highlighting */
|
|
1120
|
+
activePath?: string;
|
|
1121
|
+
/** Navigation item click handler */
|
|
1122
|
+
onItemClick?: (item: NavigationItem) => void;
|
|
1123
|
+
}
|
|
971
1124
|
/**
|
|
972
|
-
*
|
|
973
|
-
*
|
|
974
|
-
* Wraps a server handler with permission checking.
|
|
1125
|
+
* EnhancedNavigationMenu - Secure navigation menu with RBAC integration
|
|
975
1126
|
*
|
|
976
|
-
*
|
|
977
|
-
*
|
|
978
|
-
* @returns Wrapped handler function
|
|
1127
|
+
* This component provides a navigation menu that automatically filters items based on
|
|
1128
|
+
* user permissions and enforces strict security controls.
|
|
979
1129
|
*
|
|
980
|
-
* @
|
|
981
|
-
*
|
|
982
|
-
* const protectedHandler = withPermissionGuard(
|
|
983
|
-
* { permission: 'manage:events', pageId: 'page-789' },
|
|
984
|
-
* async (req, res) => {
|
|
985
|
-
* // Handler logic here
|
|
986
|
-
* res.json({ success: true });
|
|
987
|
-
* }
|
|
988
|
-
* );
|
|
989
|
-
* ```
|
|
1130
|
+
* @param props - Component props
|
|
1131
|
+
* @returns React element with enhanced navigation menu
|
|
990
1132
|
*/
|
|
991
|
-
declare function
|
|
992
|
-
|
|
993
|
-
pageId?: UUID;
|
|
994
|
-
}, handler: (...args: T) => Promise<any>): (...args: T) => Promise<any>;
|
|
1133
|
+
declare function EnhancedNavigationMenu({ items, strictMode, auditLog, onNavigationAccess, onStrictModeViolation, className, itemClassName, activeItemClassName, disabledItemClassName, hideUnauthorizedItems, renderItem, activePath, onItemClick }: EnhancedNavigationMenuProps): react_jsx_runtime.JSX.Element;
|
|
1134
|
+
|
|
995
1135
|
/**
|
|
996
|
-
*
|
|
1136
|
+
* @file RBAC Hook
|
|
1137
|
+
* @package @jmruthers/pace-core
|
|
1138
|
+
* @module RBAC/Hooks
|
|
1139
|
+
* @since 0.3.0
|
|
997
1140
|
*
|
|
998
|
-
*
|
|
1141
|
+
* A React hook that provides access to the new RBAC (Role-Based Access Control) system.
|
|
1142
|
+
* This hook integrates with the database to provide real-time role and permission information.
|
|
999
1143
|
*
|
|
1000
|
-
*
|
|
1001
|
-
*
|
|
1002
|
-
*
|
|
1144
|
+
* Features:
|
|
1145
|
+
* - Real-time role detection (global, organisation, event-app)
|
|
1146
|
+
* - Permission checking with database validation
|
|
1147
|
+
* - Hierarchical permission resolution
|
|
1148
|
+
* - Loading states and error handling
|
|
1149
|
+
* - Type-safe permission operations
|
|
1150
|
+
* - Automatic context detection
|
|
1003
1151
|
*
|
|
1004
1152
|
* @example
|
|
1005
|
-
* ```
|
|
1006
|
-
*
|
|
1007
|
-
*
|
|
1008
|
-
*
|
|
1009
|
-
*
|
|
1010
|
-
*
|
|
1011
|
-
*
|
|
1012
|
-
*
|
|
1153
|
+
* ```tsx
|
|
1154
|
+
* import { useRBAC } from '@jmruthers/pace-core/rbac';
|
|
1155
|
+
*
|
|
1156
|
+
* function MyComponent() {
|
|
1157
|
+
* const {
|
|
1158
|
+
* globalRole,
|
|
1159
|
+
* organisationRole,
|
|
1160
|
+
* eventAppRole,
|
|
1161
|
+
* hasPermission,
|
|
1162
|
+
* isSuperAdmin,
|
|
1163
|
+
* isLoading,
|
|
1164
|
+
* error
|
|
1165
|
+
* } = useRBAC();
|
|
1166
|
+
*
|
|
1167
|
+
* if (isLoading) return <div>Loading permissions...</div>;
|
|
1168
|
+
* if (error) return <div>Error: {error.message}</div>;
|
|
1169
|
+
*
|
|
1170
|
+
* return (
|
|
1171
|
+
* <div>
|
|
1172
|
+
* {isSuperAdmin && <AdminPanel />}
|
|
1173
|
+
* {hasPermission('read', 'dashboard') && <Dashboard />}
|
|
1174
|
+
* {hasPermission('create', 'events') && <CreateEventButton />}
|
|
1175
|
+
* </div>
|
|
1176
|
+
* );
|
|
1177
|
+
* }
|
|
1013
1178
|
* ```
|
|
1014
|
-
*/
|
|
1015
|
-
declare function withAccessLevelGuard<T extends any[]>(minLevel: 'viewer' | 'participant' | 'planner' | 'admin' | 'super', handler: (...args: T) => Promise<any>): (...args: T) => Promise<any>;
|
|
1016
|
-
/**
|
|
1017
|
-
* Role Guard for Server Handlers
|
|
1018
1179
|
*
|
|
1019
|
-
*
|
|
1020
|
-
*
|
|
1180
|
+
* @accessibility
|
|
1181
|
+
* - No direct accessibility concerns (hook)
|
|
1182
|
+
* - Enables accessible permission-based UI rendering
|
|
1183
|
+
* - Supports screen reader friendly conditional content
|
|
1021
1184
|
*
|
|
1022
|
-
* @
|
|
1023
|
-
*
|
|
1024
|
-
*
|
|
1185
|
+
* @security
|
|
1186
|
+
* - Database-backed permission validation
|
|
1187
|
+
* - Hierarchical permission resolution
|
|
1188
|
+
* - Organisation context enforcement
|
|
1189
|
+
* - Real-time permission updates
|
|
1025
1190
|
*
|
|
1026
|
-
* @
|
|
1027
|
-
*
|
|
1028
|
-
*
|
|
1029
|
-
*
|
|
1030
|
-
*
|
|
1031
|
-
*
|
|
1032
|
-
*
|
|
1033
|
-
*
|
|
1034
|
-
*
|
|
1035
|
-
*
|
|
1036
|
-
* res.json({ success: true });
|
|
1037
|
-
* }
|
|
1038
|
-
* );
|
|
1039
|
-
* ```
|
|
1191
|
+
* @performance
|
|
1192
|
+
* - Optimized with useMemo and useCallback
|
|
1193
|
+
* - Permission caching
|
|
1194
|
+
* - Minimal re-renders
|
|
1195
|
+
* - Lazy loading of permissions
|
|
1196
|
+
*
|
|
1197
|
+
* @dependencies
|
|
1198
|
+
* - React 18+ - Hooks and effects
|
|
1199
|
+
* - @supabase/supabase-js - Database integration
|
|
1200
|
+
* - RBAC types - Type definitions
|
|
1040
1201
|
*/
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
eventAppRoles?: string[];
|
|
1045
|
-
requireAll?: boolean;
|
|
1046
|
-
}, handler: (...args: T) => Promise<any>): (...args: T) => Promise<any>;
|
|
1202
|
+
|
|
1203
|
+
declare function useRBAC(pageId?: string): UserRBACContext;
|
|
1204
|
+
|
|
1047
1205
|
/**
|
|
1048
|
-
*
|
|
1206
|
+
* @file RBAC Permission Hooks
|
|
1207
|
+
* @package @jmruthers/pace-core
|
|
1208
|
+
* @module RBAC/Hooks
|
|
1209
|
+
* @since 1.0.0
|
|
1049
1210
|
*
|
|
1050
|
-
*
|
|
1211
|
+
* This module provides React hooks for RBAC functionality.
|
|
1212
|
+
*/
|
|
1213
|
+
|
|
1214
|
+
/**
|
|
1215
|
+
* Hook to get user's permissions in a scope
|
|
1051
1216
|
*
|
|
1052
|
-
* @param
|
|
1053
|
-
* @
|
|
1217
|
+
* @param userId - User ID
|
|
1218
|
+
* @param scope - Scope for permission checking
|
|
1219
|
+
* @returns Permission state and methods
|
|
1054
1220
|
*
|
|
1055
1221
|
* @example
|
|
1056
|
-
* ```
|
|
1057
|
-
*
|
|
1058
|
-
*
|
|
1222
|
+
* ```tsx
|
|
1223
|
+
* function MyComponent() {
|
|
1224
|
+
* const { permissions, isLoading, error } = usePermissions(userId, scope);
|
|
1059
1225
|
*
|
|
1060
|
-
*
|
|
1061
|
-
*
|
|
1062
|
-
*
|
|
1063
|
-
*
|
|
1064
|
-
*
|
|
1065
|
-
*
|
|
1066
|
-
* }
|
|
1226
|
+
* if (isLoading) return <div>Loading...</div>;
|
|
1227
|
+
* if (error) return <div>Error: {error.message}</div>;
|
|
1228
|
+
*
|
|
1229
|
+
* return (
|
|
1230
|
+
* <div>
|
|
1231
|
+
* {permissions['read:users'] && <UserList />}
|
|
1232
|
+
* {permissions['create:users'] && <CreateUserButton />}
|
|
1233
|
+
* </div>
|
|
1234
|
+
* );
|
|
1235
|
+
* }
|
|
1067
1236
|
* ```
|
|
1068
1237
|
*/
|
|
1069
|
-
declare function
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
pathname: string;
|
|
1079
|
-
};
|
|
1080
|
-
user?: {
|
|
1081
|
-
id: string;
|
|
1082
|
-
};
|
|
1083
|
-
organisationId?: string;
|
|
1084
|
-
}, res: {
|
|
1085
|
-
redirect: (url: string) => void;
|
|
1086
|
-
}, next: () => void) => Promise<void>;
|
|
1238
|
+
declare function usePermissions(userId: UUID, scope: Scope): {
|
|
1239
|
+
permissions: PermissionMap;
|
|
1240
|
+
isLoading: boolean;
|
|
1241
|
+
error: Error | null;
|
|
1242
|
+
hasPermission: (permission: Permission) => boolean;
|
|
1243
|
+
hasAnyPermission: (permissionList: Permission[]) => boolean;
|
|
1244
|
+
hasAllPermissions: (permissionList: Permission[]) => boolean;
|
|
1245
|
+
refetch: () => Promise<void>;
|
|
1246
|
+
};
|
|
1087
1247
|
/**
|
|
1088
|
-
*
|
|
1089
|
-
*
|
|
1090
|
-
* Middleware that checks permissions for Express routes.
|
|
1248
|
+
* Hook to check if user can perform an action
|
|
1091
1249
|
*
|
|
1092
|
-
* @param
|
|
1093
|
-
* @
|
|
1250
|
+
* @param userId - User ID
|
|
1251
|
+
* @param scope - Scope for permission checking
|
|
1252
|
+
* @param permission - Permission to check
|
|
1253
|
+
* @param pageId - Optional page ID
|
|
1254
|
+
* @param useCache - Whether to use cached results
|
|
1255
|
+
* @returns Permission check state and methods
|
|
1094
1256
|
*
|
|
1095
1257
|
* @example
|
|
1096
|
-
* ```
|
|
1097
|
-
*
|
|
1258
|
+
* ```tsx
|
|
1259
|
+
* function MyComponent() {
|
|
1260
|
+
* const { can, isLoading, error } = useCan(userId, scope, 'read:users');
|
|
1098
1261
|
*
|
|
1099
|
-
*
|
|
1100
|
-
*
|
|
1101
|
-
*
|
|
1102
|
-
*
|
|
1262
|
+
* if (isLoading) return <div>Checking permission...</div>;
|
|
1263
|
+
* if (error) return <div>Error: {error.message}</div>;
|
|
1264
|
+
*
|
|
1265
|
+
* return can ? <UserList /> : <div>Access denied</div>;
|
|
1266
|
+
* }
|
|
1103
1267
|
* ```
|
|
1104
1268
|
*/
|
|
1105
|
-
declare function
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
};
|
|
1112
|
-
organisationId?: string;
|
|
1113
|
-
eventId?: string;
|
|
1114
|
-
appId?: string;
|
|
1115
|
-
}, res: {
|
|
1116
|
-
status: (code: number) => {
|
|
1117
|
-
json: (data: object) => void;
|
|
1118
|
-
};
|
|
1119
|
-
}, next: () => void) => Promise<void>;
|
|
1269
|
+
declare function useCan(userId: UUID, scope: Scope, permission: Permission, pageId?: UUID, useCache?: boolean): {
|
|
1270
|
+
can: boolean;
|
|
1271
|
+
isLoading: boolean;
|
|
1272
|
+
error: Error | null;
|
|
1273
|
+
refetch: () => Promise<void>;
|
|
1274
|
+
};
|
|
1120
1275
|
/**
|
|
1121
|
-
*
|
|
1276
|
+
* Hook to get user's access level in a scope
|
|
1122
1277
|
*
|
|
1123
1278
|
* @param userId - User ID
|
|
1124
|
-
* @param scope -
|
|
1125
|
-
* @
|
|
1126
|
-
*
|
|
1127
|
-
* @
|
|
1279
|
+
* @param scope - Scope for access level checking
|
|
1280
|
+
* @returns Access level state and methods
|
|
1281
|
+
*
|
|
1282
|
+
* @example
|
|
1283
|
+
* ```tsx
|
|
1284
|
+
* function MyComponent() {
|
|
1285
|
+
* const { accessLevel, isLoading, error } = useAccessLevel(userId, scope);
|
|
1286
|
+
*
|
|
1287
|
+
* if (isLoading) return <div>Loading access level...</div>;
|
|
1288
|
+
* if (error) return <div>Error: {error.message}</div>;
|
|
1289
|
+
*
|
|
1290
|
+
* return (
|
|
1291
|
+
* <div>
|
|
1292
|
+
* Access Level: {accessLevel}
|
|
1293
|
+
* {accessLevel >= AccessLevel.ADMIN && <AdminPanel />}
|
|
1294
|
+
* </div>
|
|
1295
|
+
* );
|
|
1296
|
+
* }
|
|
1297
|
+
* ```
|
|
1128
1298
|
*/
|
|
1129
|
-
declare function
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1299
|
+
declare function useAccessLevel(userId: UUID, scope: Scope): {
|
|
1300
|
+
accessLevel: AccessLevel;
|
|
1301
|
+
isLoading: boolean;
|
|
1302
|
+
error: Error | null;
|
|
1303
|
+
refetch: () => Promise<void>;
|
|
1304
|
+
};
|
|
1134
1305
|
/**
|
|
1135
|
-
*
|
|
1306
|
+
* Hook to check multiple permissions at once
|
|
1136
1307
|
*
|
|
1137
1308
|
* @param userId - User ID
|
|
1138
|
-
* @param scope -
|
|
1309
|
+
* @param scope - Scope for permission checking
|
|
1139
1310
|
* @param permissions - Array of permissions to check
|
|
1140
|
-
* @param
|
|
1141
|
-
* @returns
|
|
1311
|
+
* @param useCache - Whether to use cached results
|
|
1312
|
+
* @returns Multiple permission check results
|
|
1313
|
+
*
|
|
1314
|
+
* @example
|
|
1315
|
+
* ```tsx
|
|
1316
|
+
* function MyComponent() {
|
|
1317
|
+
* const { results, isLoading, error } = useMultiplePermissions(
|
|
1318
|
+
* userId,
|
|
1319
|
+
* scope,
|
|
1320
|
+
* ['read:users', 'create:users', 'update:users']
|
|
1321
|
+
* );
|
|
1322
|
+
*
|
|
1323
|
+
* if (isLoading) return <div>Checking permissions...</div>;
|
|
1324
|
+
* if (error) return <div>Error: {error.message}</div>;
|
|
1325
|
+
*
|
|
1326
|
+
* return (
|
|
1327
|
+
* <div>
|
|
1328
|
+
* {results['read:users'] && <UserList />}
|
|
1329
|
+
* {results['create:users'] && <CreateUserButton />}
|
|
1330
|
+
* {results['update:users'] && <EditUserButton />}
|
|
1331
|
+
* </div>
|
|
1332
|
+
* );
|
|
1333
|
+
* }
|
|
1334
|
+
* ```
|
|
1142
1335
|
*/
|
|
1143
|
-
declare function
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
interface PagePermissionContextType {
|
|
1150
|
-
/** Check if user has permission for a page */
|
|
1151
|
-
hasPagePermission: (pageName: string, operation: string, pageId?: string, scope?: Scope) => boolean;
|
|
1152
|
-
/** Get all page permissions for current user */
|
|
1153
|
-
getPagePermissions: () => Record<string, string[]>;
|
|
1154
|
-
/** Check if page permission checking is enabled */
|
|
1155
|
-
isEnabled: boolean;
|
|
1156
|
-
/** Check if strict mode is enabled */
|
|
1157
|
-
isStrictMode: boolean;
|
|
1158
|
-
/** Check if audit logging is enabled */
|
|
1159
|
-
isAuditLogEnabled: boolean;
|
|
1160
|
-
/** Get page access history */
|
|
1161
|
-
getPageAccessHistory: () => PageAccessRecord[];
|
|
1162
|
-
/** Clear page access history */
|
|
1163
|
-
clearPageAccessHistory: () => void;
|
|
1164
|
-
}
|
|
1165
|
-
interface PageAccessRecord {
|
|
1166
|
-
pageName: string;
|
|
1167
|
-
operation: string;
|
|
1168
|
-
userId: UUID;
|
|
1169
|
-
scope: Scope;
|
|
1170
|
-
allowed: boolean;
|
|
1171
|
-
timestamp: string;
|
|
1172
|
-
pageId?: string;
|
|
1173
|
-
}
|
|
1174
|
-
interface PagePermissionProviderProps {
|
|
1175
|
-
/** Child components */
|
|
1176
|
-
children: React__default.ReactNode;
|
|
1177
|
-
/** Enable strict mode to prevent bypassing (default: true) */
|
|
1178
|
-
strictMode?: boolean;
|
|
1179
|
-
/** Enable audit logging (default: true) */
|
|
1180
|
-
auditLog?: boolean;
|
|
1181
|
-
/** Callback when page access is attempted */
|
|
1182
|
-
onPageAccess?: (pageName: string, operation: string, allowed: boolean, record: PageAccessRecord) => void;
|
|
1183
|
-
/** Callback when strict mode violation occurs */
|
|
1184
|
-
onStrictModeViolation?: (pageName: string, operation: string, record: PageAccessRecord) => void;
|
|
1185
|
-
/** Maximum number of access records to keep in history */
|
|
1186
|
-
maxHistorySize?: number;
|
|
1187
|
-
}
|
|
1336
|
+
declare function useMultiplePermissions(userId: UUID, scope: Scope, permissions: Permission[], useCache?: boolean): {
|
|
1337
|
+
results: Record<Permission, boolean>;
|
|
1338
|
+
isLoading: boolean;
|
|
1339
|
+
error: Error | null;
|
|
1340
|
+
refetch: () => Promise<void>;
|
|
1341
|
+
};
|
|
1188
1342
|
/**
|
|
1189
|
-
*
|
|
1343
|
+
* Hook to check if user has any of the specified permissions
|
|
1190
1344
|
*
|
|
1191
|
-
*
|
|
1192
|
-
*
|
|
1345
|
+
* @param userId - User ID
|
|
1346
|
+
* @param scope - Scope for permission checking
|
|
1347
|
+
* @param permissions - Array of permissions to check
|
|
1348
|
+
* @param useCache - Whether to use cached results
|
|
1349
|
+
* @returns Whether user has any of the permissions
|
|
1193
1350
|
*
|
|
1194
|
-
* @
|
|
1195
|
-
*
|
|
1351
|
+
* @example
|
|
1352
|
+
* ```tsx
|
|
1353
|
+
* function MyComponent() {
|
|
1354
|
+
* const { hasAny, isLoading, error } = useHasAnyPermission(
|
|
1355
|
+
* userId,
|
|
1356
|
+
* scope,
|
|
1357
|
+
* ['read:users', 'create:users']
|
|
1358
|
+
* );
|
|
1359
|
+
*
|
|
1360
|
+
* if (isLoading) return <div>Checking permissions...</div>;
|
|
1361
|
+
* if (error) return <div>Error: {error.message}</div>;
|
|
1362
|
+
*
|
|
1363
|
+
* return hasAny ? <UserManagementPanel /> : <div>No user permissions</div>;
|
|
1364
|
+
* }
|
|
1365
|
+
* ```
|
|
1196
1366
|
*/
|
|
1197
|
-
declare function
|
|
1367
|
+
declare function useHasAnyPermission(userId: UUID, scope: Scope, permissions: Permission[], useCache?: boolean): {
|
|
1368
|
+
hasAny: boolean;
|
|
1369
|
+
isLoading: boolean;
|
|
1370
|
+
error: Error | null;
|
|
1371
|
+
refetch: () => Promise<void>;
|
|
1372
|
+
};
|
|
1198
1373
|
/**
|
|
1199
|
-
* Hook to
|
|
1374
|
+
* Hook to check if user has all of the specified permissions
|
|
1200
1375
|
*
|
|
1201
|
-
* @
|
|
1202
|
-
* @
|
|
1376
|
+
* @param userId - User ID
|
|
1377
|
+
* @param scope - Scope for permission checking
|
|
1378
|
+
* @param permissions - Array of permissions to check
|
|
1379
|
+
* @param useCache - Whether to use cached results
|
|
1380
|
+
* @returns Whether user has all of the permissions
|
|
1381
|
+
*
|
|
1382
|
+
* @example
|
|
1383
|
+
* ```tsx
|
|
1384
|
+
* function MyComponent() {
|
|
1385
|
+
* const { hasAll, isLoading, error } = useHasAllPermissions(
|
|
1386
|
+
* userId,
|
|
1387
|
+
* scope,
|
|
1388
|
+
* ['read:users', 'create:users', 'update:users']
|
|
1389
|
+
* );
|
|
1390
|
+
*
|
|
1391
|
+
* if (isLoading) return <div>Checking permissions...</div>;
|
|
1392
|
+
* if (error) return <div>Error: {error.message}</div>;
|
|
1393
|
+
*
|
|
1394
|
+
* return hasAll ? <FullUserManagementPanel /> : <div>Insufficient permissions</div>;
|
|
1395
|
+
* }
|
|
1396
|
+
* ```
|
|
1203
1397
|
*/
|
|
1204
|
-
declare function
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
operation: 'read' | 'create' | 'update' | 'delete';
|
|
1211
|
-
/** Content to render when user has permission */
|
|
1212
|
-
children: React__default.ReactNode;
|
|
1213
|
-
/** Content to render when user lacks permission */
|
|
1214
|
-
fallback?: React__default.ReactNode;
|
|
1215
|
-
/** Enable strict mode to prevent bypassing (default: true) */
|
|
1216
|
-
strictMode?: boolean;
|
|
1217
|
-
/** Force audit logging for this page access (default: true) */
|
|
1218
|
-
auditLog?: boolean;
|
|
1219
|
-
/** Custom page ID for permission checking */
|
|
1220
|
-
pageId?: string;
|
|
1221
|
-
/** Custom scope for permission checking */
|
|
1222
|
-
scope?: Scope;
|
|
1223
|
-
/** Callback when access is denied */
|
|
1224
|
-
onDenied?: (pageName: string, operation: string) => void;
|
|
1225
|
-
/** Loading state content */
|
|
1226
|
-
loading?: React__default.ReactNode;
|
|
1227
|
-
}
|
|
1398
|
+
declare function useHasAllPermissions(userId: UUID, scope: Scope, permissions: Permission[], useCache?: boolean): {
|
|
1399
|
+
hasAll: boolean;
|
|
1400
|
+
isLoading: boolean;
|
|
1401
|
+
error: Error | null;
|
|
1402
|
+
refetch: () => Promise<void>;
|
|
1403
|
+
};
|
|
1228
1404
|
/**
|
|
1229
|
-
*
|
|
1405
|
+
* Hook to get cached permissions with TTL management
|
|
1230
1406
|
*
|
|
1231
|
-
*
|
|
1232
|
-
*
|
|
1233
|
-
*
|
|
1407
|
+
* @param userId - User ID
|
|
1408
|
+
* @param scope - Scope for permission checking
|
|
1409
|
+
* @returns Cached permission state and methods
|
|
1234
1410
|
*
|
|
1235
|
-
* @
|
|
1236
|
-
*
|
|
1411
|
+
* @example
|
|
1412
|
+
* ```tsx
|
|
1413
|
+
* function MyComponent() {
|
|
1414
|
+
* const { permissions, isLoading, error, invalidateCache } = useCachedPermissions(userId, scope);
|
|
1415
|
+
*
|
|
1416
|
+
* if (isLoading) return <div>Loading cached permissions...</div>;
|
|
1417
|
+
* if (error) return <div>Error: {error.message}</div>;
|
|
1418
|
+
*
|
|
1419
|
+
* return (
|
|
1420
|
+
* <div>
|
|
1421
|
+
* {permissions['read:users'] && <UserList />}
|
|
1422
|
+
* <button onClick={invalidateCache}>Refresh Permissions</button>
|
|
1423
|
+
* </div>
|
|
1424
|
+
* );
|
|
1425
|
+
* }
|
|
1426
|
+
* ```
|
|
1237
1427
|
*/
|
|
1238
|
-
declare function
|
|
1428
|
+
declare function useCachedPermissions(userId: UUID, scope: Scope): {
|
|
1429
|
+
permissions: PermissionMap;
|
|
1430
|
+
isLoading: boolean;
|
|
1431
|
+
error: Error | null;
|
|
1432
|
+
invalidateCache: () => void;
|
|
1433
|
+
refetch: () => Promise<void>;
|
|
1434
|
+
};
|
|
1239
1435
|
|
|
1240
|
-
interface DataAccessRecord {
|
|
1241
|
-
table: string;
|
|
1242
|
-
operation: string;
|
|
1243
|
-
userId: UUID;
|
|
1244
|
-
scope: Scope;
|
|
1245
|
-
allowed: boolean;
|
|
1246
|
-
timestamp: string;
|
|
1247
|
-
query?: string;
|
|
1248
|
-
filters?: Record<string, any>;
|
|
1249
|
-
}
|
|
1250
|
-
interface SecureDataContextType {
|
|
1251
|
-
/** Check if data access is allowed for a table and operation */
|
|
1252
|
-
isDataAccessAllowed: (table: string, operation: string, scope?: Scope) => boolean;
|
|
1253
|
-
/** Get all data access permissions for current user */
|
|
1254
|
-
getDataAccessPermissions: () => Record<string, string[]>;
|
|
1255
|
-
/** Check if secure data access is enabled */
|
|
1256
|
-
isEnabled: boolean;
|
|
1257
|
-
/** Check if strict mode is enabled */
|
|
1258
|
-
isStrictMode: boolean;
|
|
1259
|
-
/** Check if audit logging is enabled */
|
|
1260
|
-
isAuditLogEnabled: boolean;
|
|
1261
|
-
/** Get data access history */
|
|
1262
|
-
getDataAccessHistory: () => DataAccessRecord[];
|
|
1263
|
-
/** Clear data access history */
|
|
1264
|
-
clearDataAccessHistory: () => void;
|
|
1265
|
-
/** Validate data access attempt */
|
|
1266
|
-
validateDataAccess: (table: string, operation: string, scope?: Scope) => boolean;
|
|
1267
|
-
}
|
|
1268
|
-
interface SecureDataProviderProps {
|
|
1269
|
-
/** Child components */
|
|
1270
|
-
children: React__default.ReactNode;
|
|
1271
|
-
/** Enable strict mode to prevent bypassing (default: true) */
|
|
1272
|
-
strictMode?: boolean;
|
|
1273
|
-
/** Enable audit logging (default: true) */
|
|
1274
|
-
auditLog?: boolean;
|
|
1275
|
-
/** Callback when data access is attempted */
|
|
1276
|
-
onDataAccess?: (table: string, operation: string, allowed: boolean, record: DataAccessRecord) => void;
|
|
1277
|
-
/** Callback when strict mode violation occurs */
|
|
1278
|
-
onStrictModeViolation?: (table: string, operation: string, record: DataAccessRecord) => void;
|
|
1279
|
-
/** Maximum number of access records to keep in history */
|
|
1280
|
-
maxHistorySize?: number;
|
|
1281
|
-
/** Enable RLS enforcement (default: true) */
|
|
1282
|
-
enforceRLS?: boolean;
|
|
1283
|
-
}
|
|
1284
1436
|
/**
|
|
1285
|
-
*
|
|
1286
|
-
*
|
|
1287
|
-
*
|
|
1288
|
-
*
|
|
1437
|
+
* RBAC Adapters
|
|
1438
|
+
* @package @jmruthers/pace-core
|
|
1439
|
+
* @module RBAC/Adapters
|
|
1440
|
+
* @since 1.0.0
|
|
1289
1441
|
*
|
|
1290
|
-
*
|
|
1291
|
-
* @returns React element with secure data context
|
|
1442
|
+
* This module provides adapters for different frameworks and server runtimes.
|
|
1292
1443
|
*/
|
|
1293
|
-
|
|
1444
|
+
|
|
1294
1445
|
/**
|
|
1295
|
-
*
|
|
1446
|
+
* Permission Guard Component
|
|
1296
1447
|
*
|
|
1297
|
-
*
|
|
1298
|
-
*
|
|
1448
|
+
* A React component that conditionally renders children based on permissions.
|
|
1449
|
+
* Can auto-infer userId from context if not provided.
|
|
1450
|
+
*
|
|
1451
|
+
* @example
|
|
1452
|
+
* ```tsx
|
|
1453
|
+
* // With explicit userId and scope
|
|
1454
|
+
* <PermissionGuard
|
|
1455
|
+
* userId="user-123"
|
|
1456
|
+
* scope={{ organisationId: 'org-456' }}
|
|
1457
|
+
* permission="manage:events"
|
|
1458
|
+
* pageId="page-789"
|
|
1459
|
+
* fallback={<AccessDenied />}
|
|
1460
|
+
* >
|
|
1461
|
+
* <AdminPanel />
|
|
1462
|
+
* </PermissionGuard>
|
|
1463
|
+
*
|
|
1464
|
+
* // With context inference (requires auth context)
|
|
1465
|
+
* <PermissionGuard
|
|
1466
|
+
* permission="manage:events"
|
|
1467
|
+
* scope={{ organisationId: 'org-456' }}
|
|
1468
|
+
* fallback={<AccessDenied />}
|
|
1469
|
+
* >
|
|
1470
|
+
* <AdminPanel />
|
|
1471
|
+
* </PermissionGuard>
|
|
1472
|
+
* ```
|
|
1299
1473
|
*/
|
|
1300
|
-
declare function
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
fallback?:
|
|
1311
|
-
|
|
1474
|
+
declare function PermissionGuard({ userId, scope, permission, pageId, children, fallback, onDenied, loading, strictMode, auditLog, enforceAudit, }: {
|
|
1475
|
+
userId?: UUID;
|
|
1476
|
+
scope: {
|
|
1477
|
+
organisationId: UUID;
|
|
1478
|
+
eventId?: string;
|
|
1479
|
+
appId?: UUID;
|
|
1480
|
+
};
|
|
1481
|
+
permission: Permission;
|
|
1482
|
+
pageId?: UUID;
|
|
1483
|
+
children: ReactNode;
|
|
1484
|
+
fallback?: ReactNode;
|
|
1485
|
+
onDenied?: () => void;
|
|
1486
|
+
loading?: ReactNode;
|
|
1312
1487
|
strictMode?: boolean;
|
|
1313
|
-
/** Force audit logging for this operation (default: true) */
|
|
1314
1488
|
auditLog?: boolean;
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
/** Callback when access is denied */
|
|
1318
|
-
onDenied?: (permissions: Permission[], operation: string) => void;
|
|
1319
|
-
/** Loading state content */
|
|
1320
|
-
loading?: React__default.ReactNode;
|
|
1321
|
-
/** Require all permissions (AND) or any permission (OR) */
|
|
1322
|
-
requireAll?: boolean;
|
|
1323
|
-
}
|
|
1489
|
+
enforceAudit?: boolean;
|
|
1490
|
+
}): React__default.ReactNode;
|
|
1324
1491
|
/**
|
|
1325
|
-
*
|
|
1492
|
+
* Access Level Guard Component
|
|
1326
1493
|
*
|
|
1327
|
-
*
|
|
1328
|
-
*
|
|
1329
|
-
* prevent apps from bypassing permission checks.
|
|
1494
|
+
* A React component that conditionally renders children based on access level.
|
|
1495
|
+
* Can auto-infer userId from context if not provided.
|
|
1330
1496
|
*
|
|
1331
|
-
* @
|
|
1332
|
-
*
|
|
1497
|
+
* @example
|
|
1498
|
+
* ```tsx
|
|
1499
|
+
* // With explicit userId and scope
|
|
1500
|
+
* <AccessLevelGuard
|
|
1501
|
+
* userId="user-123"
|
|
1502
|
+
* scope={{ organisationId: 'org-456' }}
|
|
1503
|
+
* minLevel="admin"
|
|
1504
|
+
* fallback={<AccessDenied />}
|
|
1505
|
+
* >
|
|
1506
|
+
* <AdminPanel />
|
|
1507
|
+
* </AccessLevelGuard>
|
|
1508
|
+
*
|
|
1509
|
+
* // With context inference (requires auth context)
|
|
1510
|
+
* <AccessLevelGuard
|
|
1511
|
+
* minLevel="admin"
|
|
1512
|
+
* scope={{ organisationId: 'org-456' }}
|
|
1513
|
+
* fallback={<AccessDenied />}
|
|
1514
|
+
* >
|
|
1515
|
+
* <AdminPanel />
|
|
1516
|
+
* </AccessLevelGuard>
|
|
1517
|
+
* ```
|
|
1333
1518
|
*/
|
|
1334
|
-
declare function
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
component: React__default.ComponentType;
|
|
1341
|
-
/** Permissions required for this route */
|
|
1342
|
-
permissions: Permission[];
|
|
1343
|
-
/** Roles that can access this route */
|
|
1344
|
-
roles?: string[];
|
|
1345
|
-
/** Minimum access level required */
|
|
1346
|
-
accessLevel?: AccessLevel;
|
|
1347
|
-
/** Page ID for permission checking */
|
|
1348
|
-
pageId?: string;
|
|
1349
|
-
/** Enable strict mode for this route */
|
|
1350
|
-
strictMode?: boolean;
|
|
1351
|
-
/** Route metadata */
|
|
1352
|
-
meta?: {
|
|
1353
|
-
title?: string;
|
|
1354
|
-
description?: string;
|
|
1355
|
-
requiresAuth?: boolean;
|
|
1356
|
-
hidden?: boolean;
|
|
1519
|
+
declare function AccessLevelGuard({ userId, scope, minLevel, children, fallback, loading, }: {
|
|
1520
|
+
userId?: UUID;
|
|
1521
|
+
scope: {
|
|
1522
|
+
organisationId: UUID;
|
|
1523
|
+
eventId?: string;
|
|
1524
|
+
appId?: UUID;
|
|
1357
1525
|
};
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1526
|
+
minLevel: 'viewer' | 'participant' | 'planner' | 'admin' | 'super';
|
|
1527
|
+
children: ReactNode;
|
|
1528
|
+
fallback?: ReactNode;
|
|
1529
|
+
loading?: ReactNode;
|
|
1530
|
+
}): React__default.ReactNode;
|
|
1531
|
+
/**
|
|
1532
|
+
* Permission Guard for Server Handlers
|
|
1533
|
+
*
|
|
1534
|
+
* Wraps a server handler with permission checking.
|
|
1535
|
+
*
|
|
1536
|
+
* @param config - Permission guard configuration
|
|
1537
|
+
* @param handler - Handler function to wrap
|
|
1538
|
+
* @returns Wrapped handler function
|
|
1539
|
+
*
|
|
1540
|
+
* @example
|
|
1541
|
+
* ```typescript
|
|
1542
|
+
* const protectedHandler = withPermissionGuard(
|
|
1543
|
+
* { permission: 'manage:events', pageId: 'page-789' },
|
|
1544
|
+
* async (req, res) => {
|
|
1545
|
+
* // Handler logic here
|
|
1546
|
+
* res.json({ success: true });
|
|
1547
|
+
* }
|
|
1548
|
+
* );
|
|
1549
|
+
* ```
|
|
1550
|
+
*/
|
|
1551
|
+
declare function withPermissionGuard<T extends any[]>(config: {
|
|
1552
|
+
permission: Permission;
|
|
1553
|
+
pageId?: UUID;
|
|
1554
|
+
}, handler: (...args: T) => Promise<any>): (...args: T) => Promise<any>;
|
|
1555
|
+
/**
|
|
1556
|
+
* Access Level Guard for Server Handlers
|
|
1557
|
+
*
|
|
1558
|
+
* Wraps a server handler with access level checking.
|
|
1559
|
+
*
|
|
1560
|
+
* @param minLevel - Minimum access level required
|
|
1561
|
+
* @param handler - Handler function to wrap
|
|
1562
|
+
* @returns Wrapped handler function
|
|
1563
|
+
*
|
|
1564
|
+
* @example
|
|
1565
|
+
* ```typescript
|
|
1566
|
+
* const adminHandler = withAccessLevelGuard(
|
|
1567
|
+
* 'admin',
|
|
1568
|
+
* async (req, res) => {
|
|
1569
|
+
* // Admin-only logic here
|
|
1570
|
+
* res.json({ success: true });
|
|
1571
|
+
* }
|
|
1572
|
+
* );
|
|
1573
|
+
* ```
|
|
1574
|
+
*/
|
|
1575
|
+
declare function withAccessLevelGuard<T extends any[]>(minLevel: 'viewer' | 'participant' | 'planner' | 'admin' | 'super', handler: (...args: T) => Promise<any>): (...args: T) => Promise<any>;
|
|
1576
|
+
/**
|
|
1577
|
+
* Role Guard for Server Handlers
|
|
1578
|
+
*
|
|
1579
|
+
* Wraps a server handler with role-based access control.
|
|
1580
|
+
* This is the primary middleware for routing protection as specified in the contract.
|
|
1581
|
+
*
|
|
1582
|
+
* @param config - Role guard configuration
|
|
1583
|
+
* @param handler - Handler function to wrap
|
|
1584
|
+
* @returns Wrapped handler function
|
|
1585
|
+
*
|
|
1586
|
+
* @example
|
|
1587
|
+
* ```typescript
|
|
1588
|
+
* const adminHandler = withRoleGuard(
|
|
1589
|
+
* {
|
|
1590
|
+
* globalRoles: ['super_admin'],
|
|
1591
|
+
* organisationRoles: ['org_admin', 'leader'],
|
|
1592
|
+
* eventAppRoles: ['event_admin', 'planner']
|
|
1593
|
+
* },
|
|
1594
|
+
* async (req, res) => {
|
|
1595
|
+
* // Admin-only logic here
|
|
1596
|
+
* res.json({ success: true });
|
|
1597
|
+
* }
|
|
1598
|
+
* );
|
|
1599
|
+
* ```
|
|
1600
|
+
*/
|
|
1601
|
+
declare function withRoleGuard<T extends any[]>(config: {
|
|
1602
|
+
globalRoles?: string[];
|
|
1603
|
+
organisationRoles?: string[];
|
|
1604
|
+
eventAppRoles?: string[];
|
|
1605
|
+
requireAll?: boolean;
|
|
1606
|
+
}, handler: (...args: T) => Promise<any>): (...args: T) => Promise<any>;
|
|
1409
1607
|
/**
|
|
1410
|
-
*
|
|
1608
|
+
* Next.js Middleware for RBAC
|
|
1411
1609
|
*
|
|
1412
|
-
*
|
|
1413
|
-
* centralized routing control to prevent apps from bypassing route protection.
|
|
1610
|
+
* Middleware that checks permissions before allowing access to pages.
|
|
1414
1611
|
*
|
|
1415
|
-
* @param
|
|
1416
|
-
* @returns
|
|
1417
|
-
*/
|
|
1418
|
-
declare function RoleBasedRouter({ routes, fallbackRoute, children, strictMode, auditLog, onRouteAccess, onStrictModeViolation, maxHistorySize, unauthorizedComponent: UnauthorizedComponent }: RoleBasedRouterProps): react_jsx_runtime.JSX.Element;
|
|
1419
|
-
/**
|
|
1420
|
-
* Hook to use role-based router context
|
|
1612
|
+
* @param config - Middleware configuration
|
|
1613
|
+
* @returns Next.js middleware function
|
|
1421
1614
|
*
|
|
1422
|
-
* @
|
|
1423
|
-
*
|
|
1615
|
+
* @example
|
|
1616
|
+
* ```typescript
|
|
1617
|
+
* // middleware.ts
|
|
1618
|
+
* import { createRBACMiddleware } from '@jmruthers/pace-core/rbac';
|
|
1619
|
+
*
|
|
1620
|
+
* export default createRBACMiddleware({
|
|
1621
|
+
* protectedRoutes: [
|
|
1622
|
+
* { path: '/admin', permission: 'manage:admin' },
|
|
1623
|
+
* { path: '/events', permission: 'read:events' },
|
|
1624
|
+
* ],
|
|
1625
|
+
* fallbackUrl: '/access-denied',
|
|
1626
|
+
* });
|
|
1627
|
+
* ```
|
|
1424
1628
|
*/
|
|
1425
|
-
declare function
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
permissions: Permission[];
|
|
1436
|
-
/** Roles that can access this navigation item */
|
|
1437
|
-
roles?: string[];
|
|
1438
|
-
/** Minimum access level required */
|
|
1439
|
-
accessLevel?: 'viewer' | 'participant' | 'planner' | 'admin' | 'super';
|
|
1440
|
-
/** Page ID for permission checking */
|
|
1441
|
-
pageId?: string;
|
|
1442
|
-
/** Enable strict mode for this navigation item */
|
|
1443
|
-
strictMode?: boolean;
|
|
1444
|
-
/** Navigation item metadata */
|
|
1445
|
-
meta?: {
|
|
1446
|
-
icon?: string;
|
|
1447
|
-
description?: string;
|
|
1448
|
-
hidden?: boolean;
|
|
1449
|
-
order?: number;
|
|
1629
|
+
declare function createRBACMiddleware(config: {
|
|
1630
|
+
protectedRoutes: Array<{
|
|
1631
|
+
path: string;
|
|
1632
|
+
permission: Permission;
|
|
1633
|
+
pageId?: UUID;
|
|
1634
|
+
}>;
|
|
1635
|
+
fallbackUrl?: string;
|
|
1636
|
+
}): (req: {
|
|
1637
|
+
nextUrl: {
|
|
1638
|
+
pathname: string;
|
|
1450
1639
|
};
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
timestamp: string;
|
|
1459
|
-
pageId?: string;
|
|
1460
|
-
roles?: string[];
|
|
1461
|
-
accessLevel?: string;
|
|
1462
|
-
}
|
|
1463
|
-
interface NavigationContextType {
|
|
1464
|
-
/** Check if user has permission for a navigation item */
|
|
1465
|
-
hasNavigationPermission: (item: NavigationItem) => boolean;
|
|
1466
|
-
/** Get all navigation permissions for current user */
|
|
1467
|
-
getNavigationPermissions: () => Record<string, string[]>;
|
|
1468
|
-
/** Get filtered navigation items based on permissions */
|
|
1469
|
-
getFilteredNavigationItems: (items: NavigationItem[]) => NavigationItem[];
|
|
1470
|
-
/** Check if navigation permission checking is enabled */
|
|
1471
|
-
isEnabled: boolean;
|
|
1472
|
-
/** Check if strict mode is enabled */
|
|
1473
|
-
isStrictMode: boolean;
|
|
1474
|
-
/** Check if audit logging is enabled */
|
|
1475
|
-
isAuditLogEnabled: boolean;
|
|
1476
|
-
/** Get navigation access history */
|
|
1477
|
-
getNavigationAccessHistory: () => NavigationAccessRecord[];
|
|
1478
|
-
/** Clear navigation access history */
|
|
1479
|
-
clearNavigationAccessHistory: () => void;
|
|
1480
|
-
}
|
|
1481
|
-
interface NavigationProviderProps {
|
|
1482
|
-
/** Child components */
|
|
1483
|
-
children: React__default.ReactNode;
|
|
1484
|
-
/** Enable strict mode to prevent bypassing (default: true) */
|
|
1485
|
-
strictMode?: boolean;
|
|
1486
|
-
/** Enable audit logging (default: true) */
|
|
1487
|
-
auditLog?: boolean;
|
|
1488
|
-
/** Callback when navigation access is attempted */
|
|
1489
|
-
onNavigationAccess?: (item: NavigationItem, allowed: boolean, record: NavigationAccessRecord) => void;
|
|
1490
|
-
/** Callback when strict mode violation occurs */
|
|
1491
|
-
onStrictModeViolation?: (item: NavigationItem, record: NavigationAccessRecord) => void;
|
|
1492
|
-
/** Maximum number of access records to keep in history */
|
|
1493
|
-
maxHistorySize?: number;
|
|
1494
|
-
}
|
|
1640
|
+
user?: {
|
|
1641
|
+
id: string;
|
|
1642
|
+
};
|
|
1643
|
+
organisationId?: string;
|
|
1644
|
+
}, res: {
|
|
1645
|
+
redirect: (url: string) => void;
|
|
1646
|
+
}, next: () => void) => Promise<void>;
|
|
1495
1647
|
/**
|
|
1496
|
-
*
|
|
1648
|
+
* Express Middleware for RBAC
|
|
1497
1649
|
*
|
|
1498
|
-
*
|
|
1499
|
-
* centralized navigation permission management with strict enforcement.
|
|
1650
|
+
* Middleware that checks permissions for Express routes.
|
|
1500
1651
|
*
|
|
1501
|
-
* @param
|
|
1502
|
-
* @returns
|
|
1503
|
-
*/
|
|
1504
|
-
declare function NavigationProvider({ children, strictMode, auditLog, onNavigationAccess, onStrictModeViolation, maxHistorySize }: NavigationProviderProps): react_jsx_runtime.JSX.Element;
|
|
1505
|
-
/**
|
|
1506
|
-
* Hook to use navigation permission context
|
|
1652
|
+
* @param config - Middleware configuration
|
|
1653
|
+
* @returns Express middleware function
|
|
1507
1654
|
*
|
|
1508
|
-
* @
|
|
1509
|
-
*
|
|
1655
|
+
* @example
|
|
1656
|
+
* ```typescript
|
|
1657
|
+
* import { createRBACExpressMiddleware } from '@jmruthers/pace-core/rbac';
|
|
1658
|
+
*
|
|
1659
|
+
* app.use(createRBACExpressMiddleware({
|
|
1660
|
+
* permission: 'read:api',
|
|
1661
|
+
* pageId: 'api-page-123',
|
|
1662
|
+
* }));
|
|
1663
|
+
* ```
|
|
1510
1664
|
*/
|
|
1511
|
-
declare function
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
|
|
1523
|
-
|
|
1524
|
-
|
|
1525
|
-
|
|
1526
|
-
/** Callback when access is denied */
|
|
1527
|
-
onDenied?: (item: NavigationItem) => void;
|
|
1528
|
-
/** Loading state content */
|
|
1529
|
-
loading?: React__default.ReactNode;
|
|
1530
|
-
/** Require all permissions (AND) or any permission (OR) */
|
|
1531
|
-
requireAll?: boolean;
|
|
1532
|
-
}
|
|
1665
|
+
declare function createRBACExpressMiddleware(config: {
|
|
1666
|
+
permission: Permission;
|
|
1667
|
+
pageId?: UUID;
|
|
1668
|
+
}): (req: {
|
|
1669
|
+
user?: {
|
|
1670
|
+
id: string;
|
|
1671
|
+
};
|
|
1672
|
+
organisationId?: string;
|
|
1673
|
+
eventId?: string;
|
|
1674
|
+
appId?: string;
|
|
1675
|
+
}, res: {
|
|
1676
|
+
status: (code: number) => {
|
|
1677
|
+
json: (data: object) => void;
|
|
1678
|
+
};
|
|
1679
|
+
}, next: () => void) => Promise<void>;
|
|
1533
1680
|
/**
|
|
1534
|
-
*
|
|
1535
|
-
*
|
|
1536
|
-
* This component ensures that users can only access navigation items they have permission for.
|
|
1537
|
-
* It integrates with the existing RBAC system and provides strict enforcement to
|
|
1538
|
-
* prevent apps from bypassing navigation permission checks.
|
|
1681
|
+
* Check if a user has a permission (synchronous cache check only)
|
|
1539
1682
|
*
|
|
1540
|
-
* @param
|
|
1541
|
-
* @
|
|
1683
|
+
* @param userId - User ID
|
|
1684
|
+
* @param scope - Permission scope
|
|
1685
|
+
* @param permission - Permission to check
|
|
1686
|
+
* @param pageId - Optional page ID
|
|
1687
|
+
* @returns True if permission is cached and granted
|
|
1542
1688
|
*/
|
|
1543
|
-
declare function
|
|
1544
|
-
|
|
1545
|
-
|
|
1546
|
-
|
|
1547
|
-
|
|
1548
|
-
/** Enable strict mode to prevent bypassing (default: true) */
|
|
1549
|
-
strictMode?: boolean;
|
|
1550
|
-
/** Enable audit logging (default: true) */
|
|
1551
|
-
auditLog?: boolean;
|
|
1552
|
-
/** Callback when navigation access is attempted */
|
|
1553
|
-
onNavigationAccess?: (item: NavigationItem, allowed: boolean) => void;
|
|
1554
|
-
/** Callback when strict mode violation occurs */
|
|
1555
|
-
onStrictModeViolation?: (item: NavigationItem) => void;
|
|
1556
|
-
/** Custom className for the navigation menu */
|
|
1557
|
-
className?: string;
|
|
1558
|
-
/** Custom className for navigation items */
|
|
1559
|
-
itemClassName?: string;
|
|
1560
|
-
/** Custom className for active navigation items */
|
|
1561
|
-
activeItemClassName?: string;
|
|
1562
|
-
/** Custom className for disabled navigation items */
|
|
1563
|
-
disabledItemClassName?: string;
|
|
1564
|
-
/** Show/hide navigation items that user doesn't have permission for */
|
|
1565
|
-
hideUnauthorizedItems?: boolean;
|
|
1566
|
-
/** Custom render function for navigation items */
|
|
1567
|
-
renderItem?: (item: NavigationItem, isAuthorized: boolean) => React__default.ReactNode;
|
|
1568
|
-
/** Current active path for highlighting */
|
|
1569
|
-
activePath?: string;
|
|
1570
|
-
/** Navigation item click handler */
|
|
1571
|
-
onItemClick?: (item: NavigationItem) => void;
|
|
1572
|
-
}
|
|
1689
|
+
declare function hasPermissionCached(userId: UUID, scope: {
|
|
1690
|
+
organisationId: UUID;
|
|
1691
|
+
eventId?: string;
|
|
1692
|
+
appId?: UUID;
|
|
1693
|
+
}, _permission: Permission, _pageId?: UUID): boolean;
|
|
1573
1694
|
/**
|
|
1574
|
-
*
|
|
1575
|
-
*
|
|
1576
|
-
* This component provides a navigation menu that automatically filters items based on
|
|
1577
|
-
* user permissions and enforces strict security controls.
|
|
1695
|
+
* Check if a user has any of the specified permissions (synchronous cache check only)
|
|
1578
1696
|
*
|
|
1579
|
-
* @param
|
|
1580
|
-
* @
|
|
1697
|
+
* @param userId - User ID
|
|
1698
|
+
* @param scope - Permission scope
|
|
1699
|
+
* @param permissions - Array of permissions to check
|
|
1700
|
+
* @param pageId - Optional page ID
|
|
1701
|
+
* @returns True if any permission is cached and granted
|
|
1581
1702
|
*/
|
|
1582
|
-
declare function
|
|
1703
|
+
declare function hasAnyPermissionCached(userId: UUID, scope: {
|
|
1704
|
+
organisationId: UUID;
|
|
1705
|
+
eventId?: string;
|
|
1706
|
+
appId?: UUID;
|
|
1707
|
+
}, permissions: Permission[], pageId?: UUID): boolean;
|
|
1583
1708
|
|
|
1584
1709
|
/**
|
|
1585
1710
|
* RBAC Main API Functions
|
|
@@ -1861,4 +1986,4 @@ declare const ALL_PERMISSIONS: {
|
|
|
1861
1986
|
};
|
|
1862
1987
|
type AllPermissions = typeof ALL_PERMISSIONS;
|
|
1863
1988
|
|
|
1864
|
-
export { ALL_PERMISSIONS, type AccessLevel, AccessLevelGuard, type AllPermissions, CACHE_PATTERNS, type DataAccessRecord, EVENT_APP_PERMISSIONS, EnhancedNavigationMenu, type EnhancedNavigationMenuProps, type EventAppRole, GLOBAL_PERMISSIONS, type GlobalRole, InvalidScopeError, type LogLevel, MissingUserContextError, type NavigationAccessRecord, type NavigationContextType, NavigationGuard, type NavigationGuardProps, type NavigationItem, NavigationProvider, type NavigationProviderProps, ORGANISATION_PERMISSIONS, type Operation, OrganisationContextRequiredError, type OrganisationRole, PAGE_PERMISSIONS, PERMISSION_GROUPS, type PageAccessRecord, type PagePermissionContextType, PagePermissionGuard, type PagePermissionGuardProps, PagePermissionProvider, type PagePermissionProviderProps, type Permission, type PermissionCheck, PermissionDeniedError, PermissionEnforcer, type PermissionEnforcerProps, PermissionGuard, type PermissionMap, RBACAuditManager, RBACCache, type RBACConfig, RBACEngine, RBACError, type RBACLogger, RBACNotInitializedError, RoleBasedRouter, type RoleBasedRouterContextType, type RoleBasedRouterProps, type RouteAccessRecord, type RouteConfig, type Scope, type SecureDataContextType, SecureDataProvider, type SecureDataProviderProps, SecureSupabaseClient, type UUID, createAuditManager, createRBACConfig, createRBACEngine, createRBACExpressMiddleware, createRBACMiddleware, createSecureClient, emitAuditEvent, fromSupabaseClient, getAccessLevel, getGlobalAuditManager, getPermissionMap, getPermissionsForRole, getRBACConfig, getRBACLogger, hasAllPermissions, hasAnyPermission, hasAnyPermissionCached, hasPermission, hasPermissionCached, isDebugMode, isDevelopmentMode, isPermitted, isPermittedCached, isValidPermission, rbacCache, setGlobalAuditManager, setupRBAC, useAccessLevel, useCachedPermissions, useCan, useHasAllPermissions, useHasAnyPermission, useMultiplePermissions, useNavigationPermissions, usePagePermissions, usePermissions, useRoleBasedRouter, useSecureData, withAccessLevelGuard, withPermissionGuard, withRoleGuard };
|
|
1989
|
+
export { ALL_PERMISSIONS, type AccessLevel, AccessLevelGuard, type AllPermissions, CACHE_PATTERNS, type DataAccessRecord, EVENT_APP_PERMISSIONS, EnhancedNavigationMenu, type EnhancedNavigationMenuProps, type EventAppRole, GLOBAL_PERMISSIONS, type GlobalRole, InvalidScopeError, type LogLevel, MissingUserContextError, type NavigationAccessRecord, type NavigationContextType, NavigationGuard, type NavigationGuardProps, type NavigationItem, NavigationProvider, type NavigationProviderProps, ORGANISATION_PERMISSIONS, type Operation, OrganisationContextRequiredError, type OrganisationRole, PAGE_PERMISSIONS, PERMISSION_GROUPS, type PageAccessRecord, type PagePermissionContextType, PagePermissionGuard, type PagePermissionGuardProps, PagePermissionProvider, type PagePermissionProviderProps, type Permission, type PermissionCheck, PermissionDeniedError, PermissionEnforcer, type PermissionEnforcerProps, PermissionGuard, type PermissionMap, RBACAuditManager, RBACCache, type RBACConfig, RBACEngine, RBACError, type RBACLogger, RBACNotInitializedError, RoleBasedRouter, type RoleBasedRouterContextType, type RoleBasedRouterProps, type RouteAccessRecord, type RouteConfig, type Scope, type SecureDataContextType, SecureDataProvider, type SecureDataProviderProps, SecureSupabaseClient, type UUID, createAuditManager, createRBACConfig, createRBACEngine, createRBACExpressMiddleware, createRBACMiddleware, createSecureClient, emitAuditEvent, fromSupabaseClient, getAccessLevel, getGlobalAuditManager, getPermissionMap, getPermissionsForRole, getRBACConfig, getRBACLogger, hasAllPermissions, hasAnyPermission, hasAnyPermissionCached, hasPermission, hasPermissionCached, isDebugMode, isDevelopmentMode, isPermitted, isPermittedCached, isValidPermission, rbacCache, setGlobalAuditManager, setupRBAC, useAccessLevel, useCachedPermissions, useCan, useHasAllPermissions, useHasAnyPermission, useMultiplePermissions, useNavigationPermissions, usePagePermissions, usePermissions, useRBAC, useRoleBasedRouter, useSecureData, withAccessLevelGuard, withPermissionGuard, withRoleGuard };
|