@jmruthers/pace-core 0.2.4
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 +202 -0
- package/README.md +299 -0
- package/dist/DataTable-BHlzyKZP.d.ts +116 -0
- package/dist/DataTable-GEY5U7OI.js +100 -0
- package/dist/DataTable-GEY5U7OI.js.map +1 -0
- package/dist/PublicLoadingSpinner-DztrzuJr.d.ts +3430 -0
- package/dist/UnifiedAuthProvider-w66zSCUf.d.ts +160 -0
- package/dist/api-GZHIDA4X.js +41 -0
- package/dist/api-GZHIDA4X.js.map +1 -0
- package/dist/appConfig-BVGyuvI7.d.ts +71 -0
- package/dist/appNameResolver-7GHF5ED2.js +22 -0
- package/dist/appNameResolver-7GHF5ED2.js.map +1 -0
- package/dist/audit-BUW3LMJB.js +16 -0
- package/dist/audit-BUW3LMJB.js.map +1 -0
- package/dist/chunk-22KLBHPS.js +29 -0
- package/dist/chunk-22KLBHPS.js.map +1 -0
- package/dist/chunk-24MKLB7U.js +81 -0
- package/dist/chunk-24MKLB7U.js.map +1 -0
- package/dist/chunk-2MKP6IYD.js +388 -0
- package/dist/chunk-2MKP6IYD.js.map +1 -0
- package/dist/chunk-2V3Y6YBC.js +114 -0
- package/dist/chunk-2V3Y6YBC.js.map +1 -0
- package/dist/chunk-5CDJCTOO.js +190 -0
- package/dist/chunk-5CDJCTOO.js.map +1 -0
- package/dist/chunk-6ZQVSHKL.js +1345 -0
- package/dist/chunk-6ZQVSHKL.js.map +1 -0
- package/dist/chunk-74C6SNEC.js +77 -0
- package/dist/chunk-74C6SNEC.js.map +1 -0
- package/dist/chunk-7BNPOCLL.js +178 -0
- package/dist/chunk-7BNPOCLL.js.map +1 -0
- package/dist/chunk-7JL3T7BO.js +3344 -0
- package/dist/chunk-7JL3T7BO.js.map +1 -0
- package/dist/chunk-CDQ3PX7L.js +18 -0
- package/dist/chunk-CDQ3PX7L.js.map +1 -0
- package/dist/chunk-DY5E3AT7.js +1734 -0
- package/dist/chunk-DY5E3AT7.js.map +1 -0
- package/dist/chunk-ETEJVKYK.js +6032 -0
- package/dist/chunk-ETEJVKYK.js.map +1 -0
- package/dist/chunk-I5Z3QH5X.js +32 -0
- package/dist/chunk-I5Z3QH5X.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-OHXGNT3K.js +21 -0
- package/dist/chunk-OHXGNT3K.js.map +1 -0
- package/dist/chunk-OKXMUYIB.js +522 -0
- package/dist/chunk-OKXMUYIB.js.map +1 -0
- package/dist/chunk-PFRRIDYA.js +382 -0
- package/dist/chunk-PFRRIDYA.js.map +1 -0
- package/dist/chunk-PLDDJCW6.js +49 -0
- package/dist/chunk-PLDDJCW6.js.map +1 -0
- package/dist/chunk-SS3E6QLB.js +695 -0
- package/dist/chunk-SS3E6QLB.js.map +1 -0
- package/dist/chunk-TMRLB2LA.js +326 -0
- package/dist/chunk-TMRLB2LA.js.map +1 -0
- package/dist/chunk-WYB6MBZA.js +5533 -0
- package/dist/chunk-WYB6MBZA.js.map +1 -0
- package/dist/chunk-YDJW5XTN.js +84 -0
- package/dist/chunk-YDJW5XTN.js.map +1 -0
- package/dist/components.d.ts +1308 -0
- package/dist/components.js +3759 -0
- package/dist/components.js.map +1 -0
- package/dist/database-C3Szpi5J.d.ts +470 -0
- package/dist/hooks.d.ts +449 -0
- package/dist/hooks.js +612 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +385 -0
- package/dist/index.js +569 -0
- package/dist/index.js.map +1 -0
- package/dist/organisation-CO3Sh3_D.d.ts +99 -0
- package/dist/providers.d.ts +45 -0
- package/dist/providers.js +36 -0
- package/dist/providers.js.map +1 -0
- package/dist/rbac/eslint-rules.d.ts +52 -0
- package/dist/rbac/eslint-rules.js +252 -0
- package/dist/rbac/eslint-rules.js.map +1 -0
- package/dist/rbac/index.d.ts +1918 -0
- package/dist/rbac/index.js +2212 -0
- package/dist/rbac/index.js.map +1 -0
- package/dist/styles/core.css +401 -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-CInEi-ng.d.ts +316 -0
- package/dist/types.d.ts +196 -0
- package/dist/types.js +83 -0
- package/dist/types.js.map +1 -0
- package/dist/unified-CM7T0aTK.d.ts +198 -0
- package/dist/useComponentPerformance-DE9l5RkL.d.ts +11 -0
- package/dist/usePublicRouteParams-B6i0KtXW.d.ts +477 -0
- package/dist/utils.d.ts +639 -0
- package/dist/utils.js +1103 -0
- package/dist/utils.js.map +1 -0
- package/dist/validation-PM_iOaTI.d.ts +159 -0
- package/dist/validation.d.ts +138 -0
- package/dist/validation.js +477 -0
- package/dist/validation.js.map +1 -0
- package/docs/INDEX.md +192 -0
- package/docs/README.md +165 -0
- package/docs/api/.nojekyll +1 -0
- package/docs/api/README.md +301 -0
- package/docs/api/classes/ErrorBoundary.md +144 -0
- package/docs/api/classes/PublicErrorBoundary.md +132 -0
- package/docs/api/interfaces/AggregateConfig.md +43 -0
- package/docs/api/interfaces/ButtonProps.md +53 -0
- package/docs/api/interfaces/CardProps.md +40 -0
- package/docs/api/interfaces/ColorPalette.md +7 -0
- package/docs/api/interfaces/ColorShade.md +41 -0
- package/docs/api/interfaces/DataTableAction.md +200 -0
- package/docs/api/interfaces/DataTableColumn.md +300 -0
- package/docs/api/interfaces/DataTableProps.md +517 -0
- package/docs/api/interfaces/DataTableToolbarButton.md +96 -0
- package/docs/api/interfaces/EmptyStateConfig.md +61 -0
- package/docs/api/interfaces/EventContextType.md +96 -0
- package/docs/api/interfaces/EventLogoProps.md +152 -0
- package/docs/api/interfaces/EventProviderProps.md +19 -0
- package/docs/api/interfaces/FileSizeLimits.md +7 -0
- package/docs/api/interfaces/FileUploadProps.md +154 -0
- package/docs/api/interfaces/FooterProps.md +105 -0
- package/docs/api/interfaces/InactivityWarningModalProps.md +115 -0
- package/docs/api/interfaces/InputProps.md +53 -0
- package/docs/api/interfaces/LabelProps.md +107 -0
- package/docs/api/interfaces/LoginFormProps.md +184 -0
- package/docs/api/interfaces/NavigationItem.md +176 -0
- package/docs/api/interfaces/NavigationMenuProps.md +236 -0
- package/docs/api/interfaces/Organisation.md +140 -0
- package/docs/api/interfaces/OrganisationContextType.md +377 -0
- package/docs/api/interfaces/OrganisationMembership.md +140 -0
- package/docs/api/interfaces/OrganisationProviderProps.md +19 -0
- package/docs/api/interfaces/OrganisationSecurityError.md +62 -0
- package/docs/api/interfaces/PaceAppLayoutProps.md +393 -0
- package/docs/api/interfaces/PaceLoginPageProps.md +34 -0
- package/docs/api/interfaces/PaletteData.md +41 -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/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 +19 -0
- package/docs/api/interfaces/ToastActionElement.md +9 -0
- package/docs/api/interfaces/ToastProps.md +9 -0
- package/docs/api/interfaces/UnifiedAuthContextType.md +1108 -0
- package/docs/api/interfaces/UnifiedAuthProviderProps.md +171 -0
- 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 +118 -0
- package/docs/api/interfaces/UserMenuProps.md +86 -0
- package/docs/api/interfaces/UserProfile.md +63 -0
- package/docs/api/modules.md +4153 -0
- package/docs/api-reference/components.md +1623 -0
- package/docs/api-reference/hooks.md +627 -0
- package/docs/api-reference/providers.md +487 -0
- package/docs/api-reference/types.md +1005 -0
- package/docs/api-reference/utilities.md +1104 -0
- package/docs/app.css.example +53 -0
- package/docs/architecture/README.md +577 -0
- package/docs/best-practices/README.md +400 -0
- package/docs/best-practices/deployment.md +1042 -0
- package/docs/best-practices/performance.md +789 -0
- package/docs/best-practices/security.md +881 -0
- package/docs/best-practices/testing.md +981 -0
- package/docs/consuming-app-example.md +290 -0
- package/docs/consuming-app-vite-config.md +233 -0
- package/docs/core-concepts/authentication.md +98 -0
- package/docs/core-concepts/events.md +756 -0
- package/docs/core-concepts/organisations.md +790 -0
- package/docs/core-concepts/permissions.md +729 -0
- package/docs/core-concepts/rbac-system.md +233 -0
- package/docs/database-schema-requirements.md +172 -0
- package/docs/documentation-style-checklist.md +294 -0
- package/docs/examples/navigation-menu-auth-fix.md +344 -0
- package/docs/getting-started/examples/README.md +106 -0
- package/docs/getting-started/examples/basic-auth-app.md +521 -0
- package/docs/getting-started/examples/full-featured-app.md +616 -0
- package/docs/getting-started/installation.md +269 -0
- package/docs/getting-started/quick-start.md +401 -0
- package/docs/implementation-guides/app-layout.md +983 -0
- package/docs/implementation-guides/data-tables.md +1898 -0
- package/docs/implementation-guides/dynamic-colors.md +195 -0
- package/docs/implementation-guides/forms.md +578 -0
- package/docs/implementation-guides/hierarchical-datatable.md +850 -0
- package/docs/implementation-guides/large-datasets.md +281 -0
- package/docs/implementation-guides/navigation.md +844 -0
- package/docs/implementation-guides/performance.md +403 -0
- package/docs/implementation-guides/permission-enforcement.md +764 -0
- package/docs/implementation-guides/public-pages.md +752 -0
- package/docs/migration/README.md +493 -0
- package/docs/migration/organisation-context-timing-fix.md +217 -0
- package/docs/migration/quick-migration-guide.md +320 -0
- package/docs/migration/rbac-migration.md +571 -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 +168 -0
- package/docs/performance/README.md +551 -0
- 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 +576 -0
- package/docs/rbac/README.md +265 -0
- package/docs/rbac/advanced-patterns.md +776 -0
- package/docs/rbac/api-reference.md +1033 -0
- package/docs/rbac/examples.md +883 -0
- package/docs/rbac/getting-started.md +679 -0
- package/docs/rbac/quick-start.md +619 -0
- package/docs/rbac/super-admin-guide.md +592 -0
- package/docs/rbac/troubleshooting.md +316 -0
- package/docs/security/README.md +680 -0
- package/docs/security/checklist.md +343 -0
- package/docs/style-guide.md +522 -0
- package/docs/styles/README.md +319 -0
- package/docs/testing/README.md +874 -0
- package/docs/troubleshooting/README.md +497 -0
- package/docs/troubleshooting/common-issues.md +1563 -0
- package/docs/troubleshooting/database-view-compatibility.md +119 -0
- package/docs/troubleshooting/debugging.md +1117 -0
- package/docs/troubleshooting/migration.md +918 -0
- package/docs/troubleshooting/organisation-context-setup.md +277 -0
- package/docs/troubleshooting/react-hooks-issue-analysis.md +166 -0
- package/docs/troubleshooting/styling-issues.md +219 -0
- package/docs/troubleshooting/tailwind-content-scanning.md +213 -0
- package/docs/usage.md +175 -0
- package/docs/visual-testing.md +114 -0
- package/package.json +211 -0
- package/src/__mocks__/lucide-react.ts +181 -0
- package/src/__tests__/README.md +404 -0
- package/src/__tests__/debug-provider.unit.test.tsx +67 -0
- package/src/__tests__/e2e/workflows.test.tsx +373 -0
- package/src/__tests__/hybridPermissions.unit.test.tsx +474 -0
- package/src/__tests__/index.integration.test.ts +491 -0
- package/src/__tests__/mocks/MockAuthProvider-standalone.tsx +47 -0
- package/src/__tests__/mocks/MockAuthProvider.tsx +63 -0
- package/src/__tests__/mocks/enhancedSupabaseMock.ts +252 -0
- package/src/__tests__/mocks/index.test.ts +23 -0
- package/src/__tests__/mocks/index.ts +16 -0
- package/src/__tests__/mocks/mockAuth.ts +155 -0
- package/src/__tests__/mocks/mockSupabase.ts +83 -0
- package/src/__tests__/mocks/mockSupabaseClient.ts +63 -0
- package/src/__tests__/mocks/providers.tsx +22 -0
- package/src/__tests__/patterns/__tests__/testPatterns.test.ts +394 -0
- package/src/__tests__/patterns/testPatterns.ts +124 -0
- package/src/__tests__/performance/componentPerformance.performance.test.ts +27 -0
- package/src/__tests__/performance/index.ts +24 -0
- package/src/__tests__/performance/performanceValidation.performance.test.ts +15 -0
- package/src/__tests__/security/security.unit.test.tsx +7 -0
- package/src/__tests__/security/securityValidation.security.test.tsx +153 -0
- package/src/__tests__/setup.ts +259 -0
- package/src/__tests__/setupTests.d.ts +1 -0
- package/src/__tests__/shared/componentTestUtils.tsx +475 -0
- package/src/__tests__/shared/errorHandlingTestUtils.ts +107 -0
- package/src/__tests__/shared/index.ts +81 -0
- package/src/__tests__/shared/integrationTestUtils.tsx +375 -0
- package/src/__tests__/shared/performanceTestUtils.tsx +476 -0
- package/src/__tests__/shared/testUtils.optimized.tsx +627 -0
- package/src/__tests__/simple.test.tsx +20 -0
- package/src/__tests__/templates/accessibility.test.template.tsx +279 -0
- package/src/__tests__/templates/component.test.template.tsx +122 -0
- package/src/__tests__/templates/integration.test.template.tsx +199 -0
- package/src/__tests__/test-utils/dataFactories.ts +60 -0
- package/src/__tests__/test-utils/index.ts +6 -0
- package/src/__tests__/typeSafety.unit.test.ts +65 -0
- package/src/__tests__/unifiedAuth.unit.test.tsx +151 -0
- package/src/__tests__/utils/accessibilityHelpers.ts +254 -0
- package/src/__tests__/utils/assertions.ts +50 -0
- package/src/__tests__/utils/deterministicHelpers.ts +31 -0
- package/src/__tests__/utils/edgeCaseConfig.test.ts +75 -0
- package/src/__tests__/utils/edgeCaseConfig.ts +98 -0
- package/src/__tests__/utils/mockHelpers.ts +149 -0
- package/src/__tests__/utils/mockLoader.ts +101 -0
- package/src/__tests__/utils/performanceHelpers.ts +55 -0
- package/src/__tests__/utils/performanceTestHelpers.ts +68 -0
- package/src/__tests__/utils/testDataFactories.ts +28 -0
- package/src/__tests__/utils/testIsolation.ts +67 -0
- package/src/__tests__/utils/visualTestHelpers.ts +20 -0
- package/src/__tests__/visual/__snapshots__/componentSnapshots.visual.test.tsx.snap +68 -0
- package/src/__tests__/visual/__snapshots__/componentVisuals.visual.test.tsx.snap +14 -0
- package/src/__tests__/visual/__snapshots__/visualRegression.test.tsx.snap +217 -0
- package/src/__tests__/visual/__snapshots__/visualRegression.visual.test.tsx.snap +24 -0
- package/src/__tests__/visual/componentSnapshots.visual.test.tsx +33 -0
- package/src/__tests__/visual/componentVisuals.visual.test.tsx +12 -0
- package/src/__tests__/visual/visualRegression.visual.test.tsx +20 -0
- package/src/components/Alert/Alert.tsx +134 -0
- package/src/components/Alert/__tests__/Alert.unit.test.tsx +381 -0
- package/src/components/Alert/index.ts +2 -0
- package/src/components/Avatar/Avatar.tsx +84 -0
- package/src/components/Avatar/__tests__/Avatar.unit.test.tsx +232 -0
- package/src/components/Avatar/index.ts +2 -0
- package/src/components/Button/Button.tsx +270 -0
- package/src/components/Button/__tests__/Button.accessibility.test.tsx +131 -0
- package/src/components/Button/__tests__/Button.comprehensive.test.tsx +721 -0
- package/src/components/Button/__tests__/Button.unit.test.tsx +189 -0
- package/src/components/Button/__tests__/EventSelector.integration.test.tsx +285 -0
- package/src/components/Button/index.ts +2 -0
- package/src/components/Card/Card.tsx +271 -0
- package/src/components/Card/__tests__/Card.accessibility.test.tsx +394 -0
- package/src/components/Card/__tests__/Card.comprehensive.test.tsx +599 -0
- package/src/components/Card/__tests__/Card.integration.test.tsx +673 -0
- package/src/components/Card/__tests__/Card.performance.test.tsx +546 -0
- package/src/components/Card/__tests__/Card.unit.test.tsx +330 -0
- package/src/components/Card/__tests__/Card.visual.test.tsx +599 -0
- package/src/components/Card/__tests__/README.md +211 -0
- package/src/components/Card/index.ts +1 -0
- package/src/components/Checkbox/Checkbox.tsx +75 -0
- package/src/components/Checkbox/__mocks__/Checkbox.tsx +2 -0
- package/src/components/Checkbox/__tests__/Checkbox.unit.test.tsx +520 -0
- package/src/components/Checkbox/index.ts +2 -0
- package/src/components/DataTable/DataTable.tsx +440 -0
- package/src/components/DataTable/__tests__/DataTable.autoSizing.test.tsx +526 -0
- package/src/components/DataTable/__tests__/DataTable.errorHandling.test.tsx +259 -0
- package/src/components/DataTable/__tests__/DataTable.hierarchical.test.tsx +675 -0
- package/src/components/DataTable/__tests__/DataTable.infinite-loop.test.tsx +324 -0
- package/src/components/DataTable/__tests__/DataTable.integration.test.tsx +724 -0
- package/src/components/DataTable/__tests__/DataTable.performance.test.tsx +597 -0
- package/src/components/DataTable/__tests__/DataTable.permissions.test.tsx +306 -0
- package/src/components/DataTable/__tests__/DataTable.regressionFixes.test.tsx +546 -0
- package/src/components/DataTable/__tests__/DataTable.selection.controlled.test.tsx +386 -0
- package/src/components/DataTable/__tests__/DataTable.selection.test.tsx +338 -0
- package/src/components/DataTable/__tests__/DataTable.userWorkflows.test.tsx +310 -0
- package/src/components/DataTable/__tests__/DataTable.workflowValidation.test.tsx +489 -0
- package/src/components/DataTable/__tests__/DataTable.workflows.test.tsx +701 -0
- package/src/components/DataTable/__tests__/README.md +136 -0
- package/src/components/DataTable/__tests__/mocks/MockRBACProvider.tsx +66 -0
- package/src/components/DataTable/__tests__/performance-regression.test.tsx +788 -0
- package/src/components/DataTable/__tests__/performance.test.tsx +365 -0
- package/src/components/DataTable/__tests__/test-utils/dataFactories.ts +103 -0
- package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +382 -0
- package/src/components/DataTable/__tests__/test-utils.ts +94 -0
- package/src/components/DataTable/components/ActionButtons.tsx +177 -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 +462 -0
- package/src/components/DataTable/components/DataTableCore.tsx +869 -0
- package/src/components/DataTable/components/DataTableErrorBoundary.tsx +214 -0
- package/src/components/DataTable/components/DataTableHeader.tsx +31 -0
- package/src/components/DataTable/components/DataTableModals.tsx +87 -0
- package/src/components/DataTable/components/DataTableToolbar.tsx +251 -0
- package/src/components/DataTable/components/DraggableColumnHeader.tsx +148 -0
- package/src/components/DataTable/components/EditableRow.tsx +160 -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 +101 -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 +911 -0
- package/src/components/DataTable/components/ViewRowModal.tsx +68 -0
- package/src/components/DataTable/components/VirtualizedDataTable.tsx +593 -0
- package/src/components/DataTable/components/__tests__/ActionButtons.unit.test.tsx +150 -0
- package/src/components/DataTable/components/__tests__/BulkOperationsDropdown.test.tsx +224 -0
- package/src/components/DataTable/components/__tests__/ColumnVisibilityDropdown.unit.test.tsx +244 -0
- package/src/components/DataTable/components/__tests__/DataTable.accessibility.test.tsx +523 -0
- package/src/components/DataTable/components/__tests__/DataTable.integration.test.tsx +401 -0
- package/src/components/DataTable/components/__tests__/DataTable.performance.test.tsx +161 -0
- package/src/components/DataTable/components/__tests__/DataTable.real.test.tsx +251 -0
- package/src/components/DataTable/components/__tests__/DataTable.security.test.tsx +172 -0
- package/src/components/DataTable/components/__tests__/DataTable.unit.test.tsx +290 -0
- package/src/components/DataTable/components/__tests__/DataTableBody.unit.test.tsx +147 -0
- package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.unit.test.tsx +182 -0
- package/src/components/DataTable/components/__tests__/DataTableHeader.unit.test.tsx +143 -0
- package/src/components/DataTable/components/__tests__/DataTableModals.unit.test.tsx +123 -0
- package/src/components/DataTable/components/__tests__/EditableRow.unit.test.tsx +660 -0
- package/src/components/DataTable/components/__tests__/EmptyState.unit.test.tsx +256 -0
- package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +498 -0
- package/src/components/DataTable/components/__tests__/FilterRow.unit.test.tsx +112 -0
- package/src/components/DataTable/components/__tests__/FilteringToggle.unit.test.tsx +130 -0
- package/src/components/DataTable/components/__tests__/GroupHeader.unit.test.tsx +172 -0
- package/src/components/DataTable/components/__tests__/GroupingDropdown.unit.test.tsx +222 -0
- package/src/components/DataTable/components/__tests__/ImportModal.unit.test.tsx +780 -0
- package/src/components/DataTable/components/__tests__/LoadingState.unit.test.tsx +65 -0
- package/src/components/DataTable/components/__tests__/PaginationControls.unit.test.tsx +634 -0
- package/src/components/DataTable/components/__tests__/StateComponents.unit.test.tsx +48 -0
- package/src/components/DataTable/components/__tests__/UnifiedTableBody.hierarchical.test.tsx +541 -0
- package/src/components/DataTable/components/__tests__/ViewRowModal.unit.test.tsx +228 -0
- package/src/components/DataTable/components/__tests__/VirtualizedDataTable.unit.test.tsx +568 -0
- package/src/components/DataTable/components/index.ts +17 -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 +182 -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/__tests__/ActionManager.unit.test.ts +405 -0
- package/src/components/DataTable/core/__tests__/ArchitectureIntegration.unit.test.tsx +445 -0
- package/src/components/DataTable/core/__tests__/ColumnFactory.unit.test.ts +288 -0
- package/src/components/DataTable/core/__tests__/ColumnManager.unit.test.ts +623 -0
- package/src/components/DataTable/core/__tests__/DataManager.unit.test.ts +431 -0
- package/src/components/DataTable/core/__tests__/DataTableContext.unit.test.tsx +433 -0
- package/src/components/DataTable/core/__tests__/LocalDataAdapter.unit.test.ts +422 -0
- package/src/components/DataTable/core/__tests__/PluginRegistry.unit.test.tsx +207 -0
- package/src/components/DataTable/core/__tests__/StateManager.unit.test.ts +278 -0
- package/src/components/DataTable/core/index.ts +8 -0
- package/src/components/DataTable/core/interfaces.ts +338 -0
- package/src/components/DataTable/examples/AutoSizingExample.tsx +180 -0
- package/src/components/DataTable/examples/ColumnSizingComparison.tsx +235 -0
- package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +418 -0
- package/src/components/DataTable/examples/HierarchicalExample.tsx +472 -0
- package/src/components/DataTable/examples/InitialPageSizeExample.tsx +173 -0
- package/src/components/DataTable/examples/PerformanceExample.tsx +502 -0
- package/src/components/DataTable/examples/__tests__/PerformanceExample.unit.test.tsx +281 -0
- package/src/components/DataTable/hooks/__tests__/useColumnOrderPersistence.unit.test.ts +407 -0
- package/src/components/DataTable/hooks/__tests__/useColumnReordering.unit.test.ts +679 -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 +70 -0
- package/src/components/DataTable/styles.ts +171 -0
- package/src/components/DataTable/types.ts +475 -0
- package/src/components/DataTable/utils/__tests__/columnSizing.test.ts +237 -0
- package/src/components/DataTable/utils/__tests__/debugTools.unit.test.ts +267 -0
- package/src/components/DataTable/utils/__tests__/errorHandling.unit.test.ts +467 -0
- package/src/components/DataTable/utils/__tests__/exportUtils.unit.test.ts +380 -0
- package/src/components/DataTable/utils/__tests__/flexibleImport.unit.test.ts +233 -0
- package/src/components/DataTable/utils/__tests__/performanceUtils.unit.test.ts +414 -0
- package/src/components/DataTable/utils/columnSizing.ts +125 -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.tsx +782 -0
- package/src/components/Dialog/README.md +804 -0
- package/src/components/Dialog/__tests__/Dialog.accessibility.test.tsx +521 -0
- package/src/components/Dialog/__tests__/Dialog.auto-size.example.tsx +157 -0
- package/src/components/Dialog/__tests__/Dialog.enhanced.test.tsx +538 -0
- package/src/components/Dialog/__tests__/Dialog.unit.test.tsx +1373 -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/examples/__tests__/SmartDialogExample.unit.test.tsx +151 -0
- package/src/components/Dialog/index.ts +12 -0
- package/src/components/Dialog/utils/__tests__/safeHtml.unit.test.ts +611 -0
- package/src/components/Dialog/utils/safeHtml.ts +185 -0
- package/src/components/ErrorBoundary/ErrorBoundary.tsx +312 -0
- package/src/components/ErrorBoundary/__tests__/ErrorBoundary.accessibility.test.tsx +517 -0
- package/src/components/ErrorBoundary/__tests__/ErrorBoundary.integration.test.tsx +572 -0
- package/src/components/ErrorBoundary/__tests__/ErrorBoundary.unit.test.tsx +579 -0
- package/src/components/ErrorBoundary/index.ts +8 -0
- package/src/components/EventSelector/EventSelector.tsx +360 -0
- package/src/components/EventSelector/__tests__/EventSelector.test.tsx +528 -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.tsx +237 -0
- package/src/components/FileUpload/__tests__/FileUpload.integration.test.tsx +992 -0
- package/src/components/FileUpload/__tests__/FileUpload.real.test.tsx +927 -0
- package/src/components/FileUpload/__tests__/FileUpload.test.tsx +855 -0
- package/src/components/FileUpload/__tests__/FileUpload.unit.test.tsx +1311 -0
- package/src/components/FileUpload/__tests__/FileUpload.unmocked.test.tsx +937 -0
- package/src/components/FileUpload/index.ts +6 -0
- package/src/components/Footer/Footer.tsx +197 -0
- package/src/components/Footer/__tests__/Footer.accessibility.test.tsx +359 -0
- package/src/components/Footer/__tests__/Footer.integration.test.tsx +353 -0
- package/src/components/Footer/__tests__/Footer.performance.test.tsx +309 -0
- package/src/components/Footer/__tests__/Footer.unit.test.tsx +309 -0
- package/src/components/Footer/__tests__/Footer.visual.test.tsx +335 -0
- package/src/components/Footer/index.ts +17 -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/__tests__/Form.accessibility.test.tsx +820 -0
- package/src/components/Form/__tests__/Form.unit.test.tsx +305 -0
- package/src/components/Form/__tests__/FormErrorSummary.unit.test.tsx +285 -0
- package/src/components/Form/__tests__/FormFieldset.unit.test.tsx +241 -0
- package/src/components/Form/index.ts +26 -0
- package/src/components/Header/Header.tsx +301 -0
- package/src/components/Header/__tests__/Header.accessibility.test.tsx +382 -0
- package/src/components/Header/__tests__/Header.comprehensive.test.tsx +509 -0
- package/src/components/Header/__tests__/Header.unit.test.tsx +335 -0
- package/src/components/Header/index.ts +4 -0
- package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +196 -0
- package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +164 -0
- package/src/components/InactivityWarningModal/__tests__/InactivityWarningModal.unit.test.tsx +224 -0
- package/src/components/InactivityWarningModal/index.ts +9 -0
- package/src/components/Input/Input.tsx +201 -0
- package/src/components/Input/__mocks__/Input.tsx +2 -0
- package/src/components/Input/__tests__/Input.accessibility.test.tsx +632 -0
- package/src/components/Input/__tests__/Input.unit.test.tsx +1121 -0
- package/src/components/Input/index.ts +9 -0
- package/src/components/Label/Label.tsx +186 -0
- package/src/components/Label/__tests__/Label.accessibility.test.tsx +239 -0
- package/src/components/Label/__tests__/Label.unit.test.tsx +331 -0
- package/src/components/Label/index.ts +2 -0
- package/src/components/LoadingSpinner/LoadingSpinner.tsx +98 -0
- package/src/components/LoadingSpinner/__tests__/LoadingSpinner.accessibility.test.tsx +116 -0
- package/src/components/LoadingSpinner/__tests__/LoadingSpinner.unit.test.tsx +144 -0
- package/src/components/LoadingSpinner/index.ts +3 -0
- package/src/components/LoginForm/LoginForm.tsx +273 -0
- package/src/components/LoginForm/__tests__/LoginForm.accessibility.test.tsx +201 -0
- package/src/components/LoginForm/__tests__/LoginForm.unit.test.tsx +119 -0
- package/src/components/LoginForm/index.ts +3 -0
- package/src/components/NavigationMenu/NavigationMenu.tsx +698 -0
- package/src/components/NavigationMenu/__tests__/NavigationMenu.accessibility.test.tsx +378 -0
- package/src/components/NavigationMenu/__tests__/NavigationMenu.enhanced.test.tsx +768 -0
- package/src/components/NavigationMenu/__tests__/NavigationMenu.integration.test.tsx +576 -0
- package/src/components/NavigationMenu/__tests__/NavigationMenu.performance.test.tsx +585 -0
- package/src/components/NavigationMenu/__tests__/NavigationMenu.real.component.test.tsx +783 -0
- package/src/components/NavigationMenu/__tests__/NavigationMenu.security.enhanced.test.tsx +810 -0
- package/src/components/NavigationMenu/__tests__/NavigationMenu.security.test.tsx +494 -0
- package/src/components/NavigationMenu/__tests__/NavigationMenu.unit.test.tsx +331 -0
- package/src/components/NavigationMenu/__tests__/NavigationMenu.userWorkflows.test.tsx +347 -0
- package/src/components/NavigationMenu/__tests__/NavigationMenu.workflows.test.tsx +584 -0
- package/src/components/NavigationMenu/index.ts +10 -0
- package/src/components/NavigationMenu/types.ts +85 -0
- package/src/components/OrganisationSelector/OrganisationSelector.tsx +304 -0
- package/src/components/OrganisationSelector/__tests__/OrganisationSelector.unit.test.tsx +664 -0
- package/src/components/OrganisationSelector/index.ts +9 -0
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +699 -0
- package/src/components/PaceAppLayout/README.md +278 -0
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.accessibility.test.tsx +288 -0
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.integration.test.tsx +889 -0
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.performance.test.tsx +629 -0
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.security.test.tsx +782 -0
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.unit.test.tsx +904 -0
- package/src/components/PaceAppLayout/index.ts +1 -0
- package/src/components/PaceLoginPage/PaceLoginPage.tsx +221 -0
- package/src/components/PaceLoginPage/__tests__/PaceLoginPage.accessibility.test.tsx +463 -0
- package/src/components/PaceLoginPage/__tests__/PaceLoginPage.integration.test.tsx +586 -0
- package/src/components/PaceLoginPage/__tests__/PaceLoginPage.unit.test.tsx +533 -0
- package/src/components/PaceLoginPage/index.ts +1 -0
- package/src/components/PasswordReset/PasswordChangeForm.tsx +186 -0
- package/src/components/PasswordReset/PasswordResetForm.tsx +201 -0
- package/src/components/PasswordReset/__tests__/PasswordChangeForm.accessibility.test.tsx +408 -0
- package/src/components/PasswordReset/__tests__/PasswordChangeForm.unit.test.tsx +561 -0
- package/src/components/PasswordReset/__tests__/PasswordReset.integration.test.tsx +304 -0
- package/src/components/PasswordReset/__tests__/PasswordResetForm.accessibility.test.tsx +20 -0
- package/src/components/PasswordReset/__tests__/PasswordResetForm.unit.test.tsx +523 -0
- package/src/components/PasswordReset/__tests__/__mocks__/UnifiedAuthProvider.ts +29 -0
- package/src/components/PasswordReset/index.ts +4 -0
- package/src/components/Print/__tests__/Print.comprehensive.test.tsx +331 -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/__tests__/PrintButton.unit.test.tsx +429 -0
- package/src/components/PrintButton/__tests__/PrintButtonGroup.unit.test.tsx +277 -0
- package/src/components/PrintButton/__tests__/PrintToolbar.unit.test.tsx +264 -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/__tests__/PrintCard.unit.test.tsx +233 -0
- package/src/components/PrintCard/__tests__/PrintCardContent.test.tsx +284 -0
- package/src/components/PrintCard/__tests__/PrintCardGrid.unit.test.tsx +214 -0
- package/src/components/PrintCard/__tests__/PrintCardImage.unit.test.tsx +264 -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/__tests__/PrintDataTable.unit.test.tsx +361 -0
- package/src/components/PrintDataTable/__tests__/PrintTableGroup.unit.test.tsx +314 -0
- package/src/components/PrintDataTable/__tests__/PrintTableRow.unit.test.tsx +362 -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/__tests__/PrintFooter.unit.test.tsx +500 -0
- package/src/components/PrintFooter/__tests__/PrintFooterContent.unit.test.tsx +321 -0
- package/src/components/PrintFooter/__tests__/PrintFooterInfo.unit.test.tsx +335 -0
- package/src/components/PrintFooter/__tests__/PrintPageNumber.unit.test.tsx +340 -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/__tests__/PrintGrid.unit.test.tsx +340 -0
- package/src/components/PrintGrid/__tests__/PrintGridBreakpoint.unit.test.tsx +261 -0
- package/src/components/PrintGrid/__tests__/PrintGridContainer.unit.test.tsx +338 -0
- package/src/components/PrintGrid/__tests__/PrintGridItem.unit.test.tsx +338 -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/__tests__/PrintCoverHeader.unit.test.tsx +309 -0
- package/src/components/PrintHeader/__tests__/PrintHeader.unit.test.tsx +202 -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/__tests__/PrintLayout.unit.test.tsx +238 -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/__tests__/PrintPageBreak.unit.test.tsx +263 -0
- package/src/components/PrintPageBreak/__tests__/PrintPageBreakGroup.unit.test.tsx +239 -0
- package/src/components/PrintPageBreak/__tests__/PrintPageBreakIndicator.unit.test.tsx +235 -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/__tests__/PrintColumn.unit.test.tsx +385 -0
- package/src/components/PrintSection/__tests__/PrintDivider.unit.test.tsx +373 -0
- package/src/components/PrintSection/__tests__/PrintSection.unit.test.tsx +390 -0
- package/src/components/PrintSection/__tests__/PrintSectionContent.unit.test.tsx +321 -0
- package/src/components/PrintSection/__tests__/PrintSectionHeader.unit.test.tsx +334 -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/__tests__/PrintText.unit.test.tsx +351 -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/__tests__/Progress.accessibility.test.tsx +240 -0
- package/src/components/Progress/__tests__/Progress.unit.test.tsx +242 -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/__tests__/EventLogo.test.tsx +761 -0
- package/src/components/PublicLayout/__tests__/PublicErrorBoundary.simplified.test.tsx +228 -0
- package/src/components/PublicLayout/__tests__/PublicErrorBoundary.test.tsx +228 -0
- package/src/components/PublicLayout/__tests__/PublicLoadingSpinner.test.tsx +459 -0
- package/src/components/PublicLayout/__tests__/PublicPageFooter.test.tsx +362 -0
- package/src/components/PublicLayout/__tests__/PublicPageHeader.test.tsx +522 -0
- package/src/components/PublicLayout/__tests__/PublicPageLayout.test.tsx +599 -0
- package/src/components/PublicLayout/__tests__/PublicPageProvider.test.tsx +513 -0
- package/src/components/PublicLayout/index.ts +51 -0
- package/src/components/RBAC/PagePermissionGuard.tsx +274 -0
- package/src/components/RBAC/RBACGuard.tsx +143 -0
- package/src/components/RBAC/RBACProvider.tsx +186 -0
- package/src/components/RBAC/RoleBasedContent.tsx +129 -0
- package/src/components/RBAC/__tests__/PagePermissionGuard.unit.test.tsx +674 -0
- package/src/components/RBAC/__tests__/RBAC.integration.test.tsx +573 -0
- package/src/components/RBAC/__tests__/RBACGuard.unit.test.tsx +467 -0
- package/src/components/RBAC/__tests__/RBACProvider.accessibility.test.tsx +475 -0
- package/src/components/RBAC/__tests__/RBACProvider.advanced.test.tsx +569 -0
- package/src/components/RBAC/__tests__/RBACProvider.integration.test.tsx +352 -0
- package/src/components/RBAC/__tests__/RBACProvider.unit.test.tsx +128 -0
- package/src/components/RBAC/__tests__/RoleBasedContent.unit.test.tsx +657 -0
- package/src/components/RBAC/index.ts +23 -0
- package/src/components/Select/Select.tsx +654 -0
- package/src/components/Select/__tests__/SearchableSelect.unit.test.tsx +437 -0
- package/src/components/Select/__tests__/Select.accessibility.test.tsx +1202 -0
- package/src/components/Select/__tests__/Select.actual.test.tsx +774 -0
- package/src/components/Select/__tests__/Select.comprehensive.test.tsx +837 -0
- package/src/components/Select/__tests__/Select.enhanced.test.tsx +1101 -0
- package/src/components/Select/__tests__/Select.integration.test.tsx +772 -0
- package/src/components/Select/__tests__/Select.performance.test.tsx +695 -0
- package/src/components/Select/__tests__/Select.real-world.test.tsx +1046 -0
- package/src/components/Select/__tests__/Select.search-algorithms.test.tsx +968 -0
- package/src/components/Select/__tests__/Select.unit.test.tsx +647 -0
- package/src/components/Select/__tests__/Select.utils.test.tsx +890 -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/__tests__/Table.accessibility.test.tsx +233 -0
- package/src/components/Table/__tests__/Table.unit.test.tsx +235 -0
- package/src/components/Table/index.ts +11 -0
- package/src/components/Toast/Toast.tsx +339 -0
- package/src/components/Toast/__tests__/Toast.accessibility.test.tsx +238 -0
- package/src/components/Toast/__tests__/Toast.integration.test.tsx +699 -0
- package/src/components/Toast/__tests__/Toast.unit.test.tsx +750 -0
- package/src/components/Toast/index.ts +14 -0
- package/src/components/Tooltip/Tooltip.tsx +167 -0
- package/src/components/Tooltip/__tests__/Tooltip.accessibility.test.tsx +121 -0
- package/src/components/Tooltip/__tests__/Tooltip.unit.test.tsx +185 -0
- package/src/components/Tooltip/index.ts +7 -0
- package/src/components/UserMenu/UserMenu.tsx +243 -0
- package/src/components/UserMenu/__tests__/UserMenu.accessibility.test.tsx +139 -0
- package/src/components/UserMenu/__tests__/UserMenu.integration.test.tsx +188 -0
- package/src/components/UserMenu/__tests__/UserMenu.unit.test.tsx +458 -0
- package/src/components/UserMenu/index.ts +3 -0
- package/src/components/__tests__/EdgeCaseTesting.enhanced.test.tsx +523 -0
- package/src/components/__tests__/ErrorTesting.enhanced.test.tsx +455 -0
- package/src/components/__tests__/SuperAdminGuard.test.tsx +456 -0
- package/src/components/__tests__/SuperAdminGuard.unit.test.tsx +456 -0
- package/src/components/examples/PermissionExample.tsx +150 -0
- package/src/components/examples/__tests__/PermissionExample.unit.test.tsx +360 -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/fonts/georama-italic.woff2 +0 -0
- package/src/fonts/georama.woff2 +0 -0
- package/src/fonts/open-sans-italic.woff2 +0 -0
- package/src/fonts/open-sans.woff2 +0 -0
- package/src/fonts/reddit-mono.woff2 +0 -0
- package/src/hooks/__tests__/hooks.integration.test.tsx +575 -0
- package/src/hooks/__tests__/useApiFetch.unit.test.ts +115 -0
- package/src/hooks/__tests__/useComponentPerformance.unit.test.tsx +133 -0
- package/src/hooks/__tests__/useDebounce.unit.test.ts +82 -0
- package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +293 -0
- package/src/hooks/__tests__/useInactivityTracker.unit.test.ts +385 -0
- package/src/hooks/__tests__/useOrganisationPermissions.unit.test.tsx +286 -0
- package/src/hooks/__tests__/useOrganisationSecurity.unit.test.tsx +838 -0
- package/src/hooks/__tests__/usePermissionCache.unit.test.ts +627 -0
- package/src/hooks/__tests__/useRBAC.unit.test.ts +903 -0
- package/src/hooks/__tests__/useSecureDataAccess.unit.test.tsx +537 -0
- package/src/hooks/__tests__/useToast.unit.test.tsx +62 -0
- package/src/hooks/__tests__/useZodForm.unit.test.tsx +37 -0
- package/src/hooks/index.ts +56 -0
- package/src/hooks/public/__tests__/usePublicEvent.test.tsx +397 -0
- package/src/hooks/public/__tests__/usePublicEventLogo.test.tsx +690 -0
- package/src/hooks/public/__tests__/usePublicRouteParams.test.tsx +449 -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/useDataTablePerformance.ts +387 -0
- package/src/hooks/useDataTableState.ts +110 -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.ts +208 -0
- package/src/hooks/useOrganisationSecurity.ts +262 -0
- package/src/hooks/usePerformanceMonitor.ts +128 -0
- package/src/hooks/usePermissionCache.ts +455 -0
- package/src/hooks/useRBAC.ts +262 -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 +200 -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/RBACProvider.tsx +622 -0
- package/src/providers/UnifiedAuthProvider.tsx +327 -0
- package/src/providers/__tests__/EventProvider.unit.test.tsx +768 -0
- package/src/providers/__tests__/OrganisationProvider.basic.test.tsx +116 -0
- package/src/providers/__tests__/OrganisationProvider.unit.test.tsx +1312 -0
- package/src/providers/__tests__/UnifiedAuthProvider.inactivity.test.tsx +601 -0
- package/src/providers/__tests__/UnifiedAuthProvider.unit.test.tsx +675 -0
- package/src/providers/__tests__/index.unit.test.ts +78 -0
- package/src/providers/index.ts +15 -0
- package/src/rbac/README.md +885 -0
- package/src/rbac/__tests__/PagePermissionGuard.test.tsx +673 -0
- package/src/rbac/__tests__/README.md +170 -0
- package/src/rbac/__tests__/RoleBasedRouter.test.tsx +709 -0
- package/src/rbac/__tests__/TestContext.tsx +72 -0
- package/src/rbac/__tests__/__mocks__/cache.ts +144 -0
- package/src/rbac/__tests__/__mocks__/supabase.ts +152 -0
- package/src/rbac/__tests__/adapters-hooks-comprehensive.test.tsx +782 -0
- package/src/rbac/__tests__/adapters-hooks.test.tsx +561 -0
- package/src/rbac/__tests__/adapters.comprehensive.test.tsx +963 -0
- package/src/rbac/__tests__/adapters.test.tsx +444 -0
- package/src/rbac/__tests__/api.test.ts +620 -0
- package/src/rbac/__tests__/audit-observability-comprehensive.test.ts +792 -0
- package/src/rbac/__tests__/audit-observability.test.ts +549 -0
- package/src/rbac/__tests__/audit.test.ts +616 -0
- package/src/rbac/__tests__/build-contract-compliance-simple.test.ts +230 -0
- package/src/rbac/__tests__/cache-invalidation-comprehensive.test.ts +889 -0
- package/src/rbac/__tests__/cache-invalidation.test.ts +457 -0
- package/src/rbac/__tests__/cache.test.ts +458 -0
- package/src/rbac/__tests__/components-navigation-guard.enhanced.test.tsx +859 -0
- package/src/rbac/__tests__/components-navigation-guard.test.tsx +895 -0
- package/src/rbac/__tests__/components-navigation-provider.test.tsx +692 -0
- package/src/rbac/__tests__/components-page-permission-guard.test.tsx +673 -0
- package/src/rbac/__tests__/components-page-permission-provider.test.tsx +614 -0
- package/src/rbac/__tests__/components-permission-enforcer.enhanced.fixed.test.tsx +836 -0
- package/src/rbac/__tests__/components-permission-enforcer.enhanced.test.tsx +837 -0
- package/src/rbac/__tests__/components-permission-enforcer.test.tsx +825 -0
- package/src/rbac/__tests__/components-role-based-router.test.tsx +709 -0
- package/src/rbac/__tests__/components-secure-data-provider.test.tsx +607 -0
- package/src/rbac/__tests__/config.test.ts +583 -0
- package/src/rbac/__tests__/core-logic-unit.test.ts +190 -0
- package/src/rbac/__tests__/core-permission-logic-comprehensive.test.ts +1467 -0
- package/src/rbac/__tests__/core-permission-logic-fixed.test.ts +151 -0
- package/src/rbac/__tests__/core-permission-logic-simple.test.ts +968 -0
- package/src/rbac/__tests__/core-permission-logic.test.ts +966 -0
- package/src/rbac/__tests__/edge-cases-comprehensive.test.ts +988 -0
- package/src/rbac/__tests__/edge-cases.test.ts +654 -0
- package/src/rbac/__tests__/engine.test.ts +361 -0
- package/src/rbac/__tests__/engine.unit.test.ts +361 -0
- package/src/rbac/__tests__/hooks.enhanced.test.tsx +979 -0
- package/src/rbac/__tests__/hooks.fixed.test.tsx +475 -0
- package/src/rbac/__tests__/hooks.test.tsx +385 -0
- package/src/rbac/__tests__/index.test.ts +269 -0
- package/src/rbac/__tests__/integration.enhanced.test.tsx +824 -0
- package/src/rbac/__tests__/page-permission-guard-super-admin.test.tsx +261 -0
- package/src/rbac/__tests__/performance.enhanced.test.tsx +724 -0
- package/src/rbac/__tests__/permissions.test.ts +383 -0
- package/src/rbac/__tests__/requires-event.test.ts +330 -0
- package/src/rbac/__tests__/scope-isolation-comprehensive.test.ts +1349 -0
- package/src/rbac/__tests__/scope-isolation.test.ts +755 -0
- package/src/rbac/__tests__/secure-client-rls-comprehensive.test.ts +592 -0
- package/src/rbac/__tests__/secure-client-rls.test.ts +377 -0
- package/src/rbac/__tests__/security.test.ts +296 -0
- package/src/rbac/__tests__/setup.ts +228 -0
- package/src/rbac/__tests__/test-utils-enhanced.tsx +400 -0
- package/src/rbac/__tests__/types.test.ts +685 -0
- package/src/rbac/adapters.tsx +726 -0
- package/src/rbac/api.ts +337 -0
- package/src/rbac/audit-enhanced.ts +339 -0
- package/src/rbac/audit.ts +338 -0
- package/src/rbac/cache.ts +213 -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/__tests__/EnhancedNavigationMenu.test.tsx +631 -0
- package/src/rbac/components/__tests__/NavigationProvider.test.tsx +667 -0
- package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +647 -0
- package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +496 -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.ts +555 -0
- package/src/rbac/index.ts +114 -0
- package/src/rbac/permissions.ts +293 -0
- package/src/rbac/secureClient.ts +244 -0
- package/src/rbac/security.ts +346 -0
- package/src/rbac/testing/__tests__/index.test.tsx +342 -0
- package/src/rbac/testing/index.tsx +340 -0
- package/src/rbac/types.ts +341 -0
- package/src/rbac/utils/__tests__/eventContext.test.ts +428 -0
- package/src/rbac/utils/__tests__/eventContext.unit.test.ts +428 -0
- package/src/rbac/utils/eventContext.ts +83 -0
- package/src/styles/__tests__/styles.unit.test.ts +164 -0
- package/src/styles/core.css +401 -0
- package/src/styles/index.ts +51 -0
- package/src/test-dom-cleanup.test.tsx +38 -0
- package/src/theming/__tests__/README.md +335 -0
- package/src/theming/__tests__/runtime.accessibility.test.ts +474 -0
- package/src/theming/__tests__/runtime.error.test.ts +616 -0
- package/src/theming/__tests__/runtime.integration.test.ts +376 -0
- package/src/theming/__tests__/runtime.performance.test.ts +411 -0
- package/src/theming/__tests__/runtime.unit.test.ts +470 -0
- package/src/theming/runtime.ts +187 -0
- package/src/types/__tests__/database.unit.test.ts +489 -0
- package/src/types/__tests__/guards.unit.test.ts +146 -0
- package/src/types/__tests__/index.unit.test.ts +77 -0
- package/src/types/__tests__/organisation.unit.test.ts +713 -0
- package/src/types/__tests__/rbac.unit.test.ts +621 -0
- package/src/types/__tests__/security.unit.test.ts +347 -0
- package/src/types/__tests__/supabase.unit.test.ts +658 -0
- package/src/types/__tests__/theme.unit.test.ts +218 -0
- package/src/types/__tests__/unified.unit.test.ts +537 -0
- package/src/types/__tests__/validation.unit.test.ts +616 -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/__tests__/appConfig.unit.test.ts +55 -0
- package/src/utils/__tests__/appNameResolver.unit.test.ts +137 -0
- package/src/utils/__tests__/audit.unit.test.ts +69 -0
- package/src/utils/__tests__/auth-utils.unit.test.ts +70 -0
- package/src/utils/__tests__/bundleAnalysis.unit.test.ts +317 -0
- package/src/utils/__tests__/cn.unit.test.ts +34 -0
- package/src/utils/__tests__/deviceFingerprint.unit.test.ts +480 -0
- package/src/utils/__tests__/dynamicUtils.unit.test.ts +322 -0
- package/src/utils/__tests__/formatDate.unit.test.ts +109 -0
- package/src/utils/__tests__/formatting.unit.test.ts +66 -0
- package/src/utils/__tests__/index.unit.test.ts +251 -0
- package/src/utils/__tests__/lazyLoad.unit.test.tsx +309 -0
- package/src/utils/__tests__/organisationContext.unit.test.ts +192 -0
- package/src/utils/__tests__/performanceBudgets.unit.test.ts +259 -0
- package/src/utils/__tests__/permissionTypes.unit.test.ts +250 -0
- package/src/utils/__tests__/permissionUtils.unit.test.ts +362 -0
- package/src/utils/__tests__/sanitization.unit.test.ts +346 -0
- package/src/utils/__tests__/schemaUtils.unit.test.ts +441 -0
- package/src/utils/__tests__/secureDataAccess.unit.test.ts +334 -0
- package/src/utils/__tests__/secureErrors.unit.test.ts +377 -0
- package/src/utils/__tests__/secureStorage.unit.test.ts +293 -0
- package/src/utils/__tests__/security.unit.test.ts +127 -0
- package/src/utils/__tests__/securityMonitor.unit.test.ts +280 -0
- package/src/utils/__tests__/sessionTracking.unit.test.ts +370 -0
- package/src/utils/__tests__/validation.unit.test.ts +84 -0
- package/src/utils/__tests__/validationUtils.unit.test.ts +571 -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/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/__tests__/PrintDataProcessor.unit.test.ts +219 -0
- package/src/utils/print/__tests__/usePrintOptimization.unit.test.tsx +353 -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/__tests__/config.unit.test.ts +206 -0
- package/src/utils/storage/__tests__/helpers.unit.test.ts +646 -0
- package/src/utils/storage/__tests__/index.unit.test.ts +167 -0
- package/src/utils/storage/__tests__/types.unit.test.ts +441 -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/__tests__/common.unit.test.ts +101 -0
- package/src/validation/__tests__/csrf.unit.test.ts +302 -0
- package/src/validation/__tests__/passwordSchema.unit.test.ts +98 -0
- package/src/validation/__tests__/sqlInjectionProtection.unit.test.ts +466 -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
|
@@ -0,0 +1,1918 @@
|
|
|
1
|
+
import { SupabaseClient } from '@supabase/supabase-js';
|
|
2
|
+
import { D as Database } from '../database-C3Szpi5J.js';
|
|
3
|
+
import React__default, { ReactNode } from 'react';
|
|
4
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* RBAC (Role-Based Access Control) Types - Build Contract Compliant
|
|
8
|
+
* @package @jmruthers/pace-core
|
|
9
|
+
* @module RBAC/Types
|
|
10
|
+
* @since 1.0.0
|
|
11
|
+
*
|
|
12
|
+
* This module defines the core types for the RBAC system that match the build contract exactly.
|
|
13
|
+
* All types are designed to be framework-agnostic and provide strong typing for permission operations.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
type UUID = string;
|
|
17
|
+
type Operation = 'read' | 'create' | 'update' | 'delete' | 'manage';
|
|
18
|
+
type Permission = `${Operation}:${string}`;
|
|
19
|
+
type AccessLevel = 'viewer' | 'participant' | 'planner' | 'admin' | 'super';
|
|
20
|
+
type Scope = {
|
|
21
|
+
organisationId?: UUID;
|
|
22
|
+
eventId?: string;
|
|
23
|
+
appId?: UUID;
|
|
24
|
+
};
|
|
25
|
+
type PermissionCheck = {
|
|
26
|
+
userId: UUID;
|
|
27
|
+
scope: Scope;
|
|
28
|
+
permission: Permission;
|
|
29
|
+
pageId?: UUID | string;
|
|
30
|
+
};
|
|
31
|
+
type PermissionMap = Record<string, Operation[]>;
|
|
32
|
+
type GlobalRole = 'super_admin';
|
|
33
|
+
type OrganisationRole = 'supporter' | 'member' | 'leader' | 'org_admin';
|
|
34
|
+
type EventAppRole = 'viewer' | 'participant' | 'planner' | 'event_admin';
|
|
35
|
+
type AuditEventType = 'permission_check' | 'permission_denied' | 'role_granted' | 'role_denied' | 'rls_denied';
|
|
36
|
+
type AuditEventSource = 'api' | 'ui' | 'middleware' | 'rls';
|
|
37
|
+
interface RBACAuditEvent {
|
|
38
|
+
id: UUID;
|
|
39
|
+
event_type: AuditEventType;
|
|
40
|
+
user_id: UUID;
|
|
41
|
+
organisation_id: UUID;
|
|
42
|
+
event_id?: string;
|
|
43
|
+
app_id?: UUID;
|
|
44
|
+
page_id?: UUID;
|
|
45
|
+
permission?: string;
|
|
46
|
+
decision?: boolean;
|
|
47
|
+
source?: AuditEventSource;
|
|
48
|
+
bypass?: boolean;
|
|
49
|
+
duration_ms?: number;
|
|
50
|
+
metadata: Record<string, any>;
|
|
51
|
+
created_at: string;
|
|
52
|
+
}
|
|
53
|
+
interface PermissionCacheKey {
|
|
54
|
+
userId: UUID;
|
|
55
|
+
organisationId?: UUID;
|
|
56
|
+
eventId?: string;
|
|
57
|
+
appId?: UUID;
|
|
58
|
+
}
|
|
59
|
+
interface UsePermissionsReturn {
|
|
60
|
+
permissions: PermissionMap;
|
|
61
|
+
isLoading: boolean;
|
|
62
|
+
error: Error | null;
|
|
63
|
+
refetch: () => Promise<void>;
|
|
64
|
+
}
|
|
65
|
+
interface UseCanReturn {
|
|
66
|
+
can: boolean;
|
|
67
|
+
isLoading: boolean;
|
|
68
|
+
error: Error | null;
|
|
69
|
+
check: () => Promise<void>;
|
|
70
|
+
}
|
|
71
|
+
declare class RBACError extends Error {
|
|
72
|
+
code: string;
|
|
73
|
+
context?: Record<string, any> | undefined;
|
|
74
|
+
constructor(message: string, code: string, context?: Record<string, any> | undefined);
|
|
75
|
+
}
|
|
76
|
+
declare class PermissionDeniedError extends RBACError {
|
|
77
|
+
constructor(permission: Permission, context?: Record<string, any>);
|
|
78
|
+
}
|
|
79
|
+
declare class OrganisationContextRequiredError extends RBACError {
|
|
80
|
+
constructor();
|
|
81
|
+
}
|
|
82
|
+
declare class RBACNotInitializedError extends RBACError {
|
|
83
|
+
constructor();
|
|
84
|
+
}
|
|
85
|
+
declare class InvalidScopeError extends RBACError {
|
|
86
|
+
constructor(scope: Scope, reason: string);
|
|
87
|
+
}
|
|
88
|
+
declare class MissingUserContextError extends RBACError {
|
|
89
|
+
constructor();
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* RBAC Configuration
|
|
94
|
+
* @package @jmruthers/pace-core
|
|
95
|
+
* @module RBAC/Config
|
|
96
|
+
* @since 1.0.0
|
|
97
|
+
*
|
|
98
|
+
* This module provides configuration options for the RBAC system.
|
|
99
|
+
*/
|
|
100
|
+
|
|
101
|
+
type LogLevel = 'error' | 'warn' | 'info' | 'debug';
|
|
102
|
+
interface RBACConfig {
|
|
103
|
+
supabase: SupabaseClient<Database>;
|
|
104
|
+
debug?: boolean;
|
|
105
|
+
logLevel?: LogLevel;
|
|
106
|
+
developmentMode?: boolean;
|
|
107
|
+
mockPermissions?: Record<string, boolean>;
|
|
108
|
+
cache?: {
|
|
109
|
+
ttl?: number;
|
|
110
|
+
enabled?: boolean;
|
|
111
|
+
};
|
|
112
|
+
audit?: {
|
|
113
|
+
enabled?: boolean;
|
|
114
|
+
logLevel?: LogLevel;
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
interface RBACLogger {
|
|
118
|
+
error: (message: string, ...args: unknown[]) => void;
|
|
119
|
+
warn: (message: string, ...args: unknown[]) => void;
|
|
120
|
+
info: (message: string, ...args: unknown[]) => void;
|
|
121
|
+
debug: (message: string, ...args: unknown[]) => void;
|
|
122
|
+
}
|
|
123
|
+
declare function createRBACConfig(config: RBACConfig): RBACConfig;
|
|
124
|
+
declare function getRBACConfig(): RBACConfig | null;
|
|
125
|
+
declare function getRBACLogger(): RBACLogger;
|
|
126
|
+
declare function isDebugMode(): boolean;
|
|
127
|
+
declare function isDevelopmentMode(): boolean;
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Secure Supabase Client for RBAC
|
|
131
|
+
* @package @jmruthers/pace-core
|
|
132
|
+
* @module RBAC/SecureClient
|
|
133
|
+
* @since 1.0.0
|
|
134
|
+
*
|
|
135
|
+
* This module provides a secure Supabase client that enforces organisation context
|
|
136
|
+
* and prevents direct database access outside of the RBAC system.
|
|
137
|
+
*/
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Secure Supabase Client that enforces organisation context
|
|
141
|
+
*
|
|
142
|
+
* This client automatically injects organisation context into all requests
|
|
143
|
+
* and prevents queries that don't have the required context.
|
|
144
|
+
*/
|
|
145
|
+
declare class SecureSupabaseClient {
|
|
146
|
+
private supabase;
|
|
147
|
+
private supabaseUrl;
|
|
148
|
+
private supabaseKey;
|
|
149
|
+
private organisationId;
|
|
150
|
+
private eventId?;
|
|
151
|
+
private appId?;
|
|
152
|
+
constructor(supabaseUrl: string, supabaseKey: string, organisationId: UUID, eventId?: string, appId?: UUID);
|
|
153
|
+
/**
|
|
154
|
+
* Setup context injection for all database operations
|
|
155
|
+
*/
|
|
156
|
+
private setupContextInjection;
|
|
157
|
+
/**
|
|
158
|
+
* Inject organisation context into a query
|
|
159
|
+
*/
|
|
160
|
+
private injectContext;
|
|
161
|
+
/**
|
|
162
|
+
* Add organisation filter to a query
|
|
163
|
+
*/
|
|
164
|
+
private addOrganisationFilter;
|
|
165
|
+
/**
|
|
166
|
+
* Validate that required context is present
|
|
167
|
+
*/
|
|
168
|
+
private validateContext;
|
|
169
|
+
/**
|
|
170
|
+
* Get the current organisation ID
|
|
171
|
+
*/
|
|
172
|
+
getOrganisationId(): UUID;
|
|
173
|
+
/**
|
|
174
|
+
* Get the current event ID
|
|
175
|
+
*/
|
|
176
|
+
getEventId(): string | undefined;
|
|
177
|
+
/**
|
|
178
|
+
* Get the current app ID
|
|
179
|
+
*/
|
|
180
|
+
getAppId(): UUID | undefined;
|
|
181
|
+
/**
|
|
182
|
+
* Create a new client with updated context
|
|
183
|
+
*/
|
|
184
|
+
withContext(updates: {
|
|
185
|
+
organisationId?: UUID;
|
|
186
|
+
eventId?: string;
|
|
187
|
+
appId?: UUID;
|
|
188
|
+
}): SecureSupabaseClient;
|
|
189
|
+
/**
|
|
190
|
+
* Get the underlying Supabase client (for internal use only)
|
|
191
|
+
* @internal
|
|
192
|
+
*/
|
|
193
|
+
getClient(): SupabaseClient<Database>;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Create a secure Supabase client with organisation context
|
|
197
|
+
*
|
|
198
|
+
* @param supabaseUrl - Supabase project URL
|
|
199
|
+
* @param supabaseKey - Supabase anon key
|
|
200
|
+
* @param organisationId - Required organisation ID
|
|
201
|
+
* @param eventId - Optional event ID
|
|
202
|
+
* @param appId - Optional app ID
|
|
203
|
+
* @returns SecureSupabaseClient instance
|
|
204
|
+
*
|
|
205
|
+
* @example
|
|
206
|
+
* ```typescript
|
|
207
|
+
* const client = createSecureClient(
|
|
208
|
+
* 'https://your-project.supabase.co',
|
|
209
|
+
* 'your-anon-key',
|
|
210
|
+
* 'org-123',
|
|
211
|
+
* 'event-456',
|
|
212
|
+
* 'app-789'
|
|
213
|
+
* );
|
|
214
|
+
* ```
|
|
215
|
+
*/
|
|
216
|
+
declare function createSecureClient(supabaseUrl: string, supabaseKey: string, organisationId: UUID, eventId?: string, appId?: UUID): SecureSupabaseClient;
|
|
217
|
+
/**
|
|
218
|
+
* Create a secure client from an existing Supabase client
|
|
219
|
+
*
|
|
220
|
+
* @param client - Existing Supabase client
|
|
221
|
+
* @param organisationId - Required organisation ID
|
|
222
|
+
* @param eventId - Optional event ID
|
|
223
|
+
* @param appId - Optional app ID
|
|
224
|
+
* @returns SecureSupabaseClient instance
|
|
225
|
+
*/
|
|
226
|
+
declare function fromSupabaseClient(client: SupabaseClient<Database>, organisationId: UUID, eventId?: string, appId?: UUID): SecureSupabaseClient;
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* RBAC Cache Implementation
|
|
230
|
+
* @package @jmruthers/pace-core
|
|
231
|
+
* @module RBAC/Cache
|
|
232
|
+
* @since 1.0.0
|
|
233
|
+
*
|
|
234
|
+
* This module provides caching functionality for RBAC operations with TTL and invalidation.
|
|
235
|
+
*/
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* In-memory cache for RBAC operations
|
|
239
|
+
*
|
|
240
|
+
* Provides 60-second TTL and pattern-based invalidation for permission checks.
|
|
241
|
+
*/
|
|
242
|
+
declare class RBACCache {
|
|
243
|
+
private cache;
|
|
244
|
+
private readonly TTL;
|
|
245
|
+
private invalidationCallbacks;
|
|
246
|
+
/**
|
|
247
|
+
* Get a value from the cache
|
|
248
|
+
*
|
|
249
|
+
* @param key - Cache key
|
|
250
|
+
* @returns Cached value or null if not found/expired
|
|
251
|
+
*/
|
|
252
|
+
get<T>(key: string): T | null;
|
|
253
|
+
/**
|
|
254
|
+
* Set a value in the cache
|
|
255
|
+
*
|
|
256
|
+
* @param key - Cache key
|
|
257
|
+
* @param data - Data to cache
|
|
258
|
+
* @param ttl - Time to live in milliseconds (defaults to 60s)
|
|
259
|
+
*/
|
|
260
|
+
set<T>(key: string, data: T, ttl?: number): void;
|
|
261
|
+
/**
|
|
262
|
+
* Delete a specific key from the cache
|
|
263
|
+
*
|
|
264
|
+
* @param key - Cache key to delete
|
|
265
|
+
*/
|
|
266
|
+
delete(key: string): void;
|
|
267
|
+
/**
|
|
268
|
+
* Invalidate cache entries matching a pattern
|
|
269
|
+
*
|
|
270
|
+
* @param pattern - Pattern to match against cache keys
|
|
271
|
+
*/
|
|
272
|
+
invalidate(pattern: string): void;
|
|
273
|
+
/**
|
|
274
|
+
* Clear all cache entries
|
|
275
|
+
*/
|
|
276
|
+
clear(): void;
|
|
277
|
+
/**
|
|
278
|
+
* Get cache statistics
|
|
279
|
+
*/
|
|
280
|
+
getStats(): {
|
|
281
|
+
size: number;
|
|
282
|
+
ttl: number;
|
|
283
|
+
keys: string[];
|
|
284
|
+
};
|
|
285
|
+
/**
|
|
286
|
+
* Add an invalidation callback
|
|
287
|
+
*
|
|
288
|
+
* @param callback - Function to call when cache is invalidated
|
|
289
|
+
*/
|
|
290
|
+
onInvalidate(callback: (pattern: string) => void): () => void;
|
|
291
|
+
/**
|
|
292
|
+
* Generate cache key for permission check
|
|
293
|
+
*
|
|
294
|
+
* @param key - Permission cache key object
|
|
295
|
+
* @returns String cache key
|
|
296
|
+
*/
|
|
297
|
+
static generatePermissionKey(key: PermissionCacheKey): string;
|
|
298
|
+
/**
|
|
299
|
+
* Generate cache key for access level
|
|
300
|
+
*
|
|
301
|
+
* @param userId - User ID
|
|
302
|
+
* @param organisationId - Organisation ID
|
|
303
|
+
* @param eventId - Event ID (optional)
|
|
304
|
+
* @param appId - App ID (optional)
|
|
305
|
+
* @returns String cache key
|
|
306
|
+
*/
|
|
307
|
+
static generateAccessLevelKey(userId: UUID, organisationId: UUID, eventId?: string, appId?: UUID): string;
|
|
308
|
+
/**
|
|
309
|
+
* Generate cache key for permission map
|
|
310
|
+
*
|
|
311
|
+
* @param userId - User ID
|
|
312
|
+
* @param organisationId - Organisation ID
|
|
313
|
+
* @param eventId - Event ID (optional)
|
|
314
|
+
* @param appId - App ID (optional)
|
|
315
|
+
* @returns String cache key
|
|
316
|
+
*/
|
|
317
|
+
static generatePermissionMapKey(userId: UUID, organisationId: UUID, eventId?: string, appId?: UUID): string;
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Global cache instance
|
|
321
|
+
*
|
|
322
|
+
* This is the default cache instance used by the RBAC system.
|
|
323
|
+
* You can create additional instances if needed for different contexts.
|
|
324
|
+
*/
|
|
325
|
+
declare const rbacCache: RBACCache;
|
|
326
|
+
/**
|
|
327
|
+
* Cache key patterns for invalidation
|
|
328
|
+
*/
|
|
329
|
+
declare const CACHE_PATTERNS: {
|
|
330
|
+
readonly USER: (userId: UUID) => string;
|
|
331
|
+
readonly ORGANISATION: (organisationId: UUID) => string;
|
|
332
|
+
readonly EVENT: (eventId: string) => string;
|
|
333
|
+
readonly APP: (appId: UUID) => string;
|
|
334
|
+
readonly PERMISSION: (userId: UUID, organisationId: UUID) => string;
|
|
335
|
+
};
|
|
336
|
+
|
|
337
|
+
/**
|
|
338
|
+
* RBAC Audit Events System
|
|
339
|
+
* @package @jmruthers/pace-core
|
|
340
|
+
* @module RBAC/Audit
|
|
341
|
+
* @since 1.0.0
|
|
342
|
+
*
|
|
343
|
+
* This module provides structured audit event emission for all RBAC operations.
|
|
344
|
+
*/
|
|
345
|
+
|
|
346
|
+
/**
|
|
347
|
+
* Audit event payload for permission checks
|
|
348
|
+
*/
|
|
349
|
+
interface PermissionCheckAuditEvent {
|
|
350
|
+
type: 'permission_check';
|
|
351
|
+
userId: UUID;
|
|
352
|
+
organisationId: UUID;
|
|
353
|
+
eventId?: string;
|
|
354
|
+
appId?: UUID;
|
|
355
|
+
pageId?: UUID;
|
|
356
|
+
permission: string;
|
|
357
|
+
decision: boolean;
|
|
358
|
+
source: AuditEventSource;
|
|
359
|
+
bypass?: boolean;
|
|
360
|
+
duration_ms: number;
|
|
361
|
+
metadata?: Record<string, any>;
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Audit event payload for permission denied
|
|
365
|
+
*/
|
|
366
|
+
interface PermissionDeniedAuditEvent {
|
|
367
|
+
type: 'permission_denied';
|
|
368
|
+
userId: UUID;
|
|
369
|
+
organisationId: UUID;
|
|
370
|
+
eventId?: string;
|
|
371
|
+
appId?: UUID;
|
|
372
|
+
pageId?: UUID;
|
|
373
|
+
permission: string;
|
|
374
|
+
source: AuditEventSource;
|
|
375
|
+
metadata?: Record<string, any>;
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* Audit event payload for role granted
|
|
379
|
+
*/
|
|
380
|
+
interface RoleGrantedAuditEvent {
|
|
381
|
+
type: 'role_granted';
|
|
382
|
+
userId: UUID;
|
|
383
|
+
organisationId: UUID;
|
|
384
|
+
eventId?: string;
|
|
385
|
+
appId?: UUID;
|
|
386
|
+
role: string;
|
|
387
|
+
grantedBy: UUID;
|
|
388
|
+
metadata?: Record<string, any>;
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Audit event payload for role revoked
|
|
392
|
+
*/
|
|
393
|
+
interface RoleRevokedAuditEvent {
|
|
394
|
+
type: 'role_denied';
|
|
395
|
+
userId: UUID;
|
|
396
|
+
organisationId: UUID;
|
|
397
|
+
eventId?: string;
|
|
398
|
+
appId?: UUID;
|
|
399
|
+
role: string;
|
|
400
|
+
revokedBy: UUID;
|
|
401
|
+
metadata?: Record<string, any>;
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* Audit event payload for RLS denied
|
|
405
|
+
*/
|
|
406
|
+
interface RLSDeniedAuditEvent {
|
|
407
|
+
type: 'rls_denied';
|
|
408
|
+
userId: UUID;
|
|
409
|
+
organisationId: UUID;
|
|
410
|
+
table: string;
|
|
411
|
+
operation: string;
|
|
412
|
+
metadata?: Record<string, any>;
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* Union type for all audit events
|
|
416
|
+
*/
|
|
417
|
+
type AuditEventPayload = PermissionCheckAuditEvent | PermissionDeniedAuditEvent | RoleGrantedAuditEvent | RoleRevokedAuditEvent | RLSDeniedAuditEvent;
|
|
418
|
+
/**
|
|
419
|
+
* RBAC Audit Manager
|
|
420
|
+
*
|
|
421
|
+
* Handles emission of structured audit events for all RBAC operations.
|
|
422
|
+
*/
|
|
423
|
+
declare class RBACAuditManager {
|
|
424
|
+
private supabase;
|
|
425
|
+
private enabled;
|
|
426
|
+
constructor(supabase: SupabaseClient<Database>);
|
|
427
|
+
/**
|
|
428
|
+
* Enable or disable audit logging
|
|
429
|
+
*
|
|
430
|
+
* @param enabled - Whether to enable audit logging
|
|
431
|
+
*/
|
|
432
|
+
setEnabled(enabled: boolean): void;
|
|
433
|
+
/**
|
|
434
|
+
* Check if audit logging is enabled
|
|
435
|
+
*
|
|
436
|
+
* @returns True if audit logging is enabled
|
|
437
|
+
*/
|
|
438
|
+
isEnabled(): boolean;
|
|
439
|
+
/**
|
|
440
|
+
* Emit an audit event
|
|
441
|
+
*
|
|
442
|
+
* @param event - Audit event payload
|
|
443
|
+
* @returns Promise that resolves when event is logged
|
|
444
|
+
*/
|
|
445
|
+
emitEvent(event: AuditEventPayload): Promise<void>;
|
|
446
|
+
/**
|
|
447
|
+
* Emit a permission check audit event
|
|
448
|
+
*
|
|
449
|
+
* @param event - Permission check event data
|
|
450
|
+
*/
|
|
451
|
+
emitPermissionCheck(event: Omit<PermissionCheckAuditEvent, 'type'>): Promise<void>;
|
|
452
|
+
/**
|
|
453
|
+
* Emit a permission denied audit event
|
|
454
|
+
*
|
|
455
|
+
* @param event - Permission denied event data
|
|
456
|
+
*/
|
|
457
|
+
emitPermissionDenied(event: Omit<PermissionDeniedAuditEvent, 'type'>): Promise<void>;
|
|
458
|
+
/**
|
|
459
|
+
* Emit a role granted audit event
|
|
460
|
+
*
|
|
461
|
+
* @param event - Role granted event data
|
|
462
|
+
*/
|
|
463
|
+
emitRoleGranted(event: Omit<RoleGrantedAuditEvent, 'type'>): Promise<void>;
|
|
464
|
+
/**
|
|
465
|
+
* Emit a role revoked audit event
|
|
466
|
+
*
|
|
467
|
+
* @param event - Role revoked event data
|
|
468
|
+
*/
|
|
469
|
+
emitRoleRevoked(event: Omit<RoleRevokedAuditEvent, 'type'>): Promise<void>;
|
|
470
|
+
/**
|
|
471
|
+
* Emit an RLS denied audit event
|
|
472
|
+
*
|
|
473
|
+
* @param event - RLS denied event data
|
|
474
|
+
*/
|
|
475
|
+
emitRLSDenied(event: Omit<RLSDeniedAuditEvent, 'type'>): Promise<void>;
|
|
476
|
+
/**
|
|
477
|
+
* Get audit events for a user
|
|
478
|
+
*
|
|
479
|
+
* @param userId - User ID
|
|
480
|
+
* @param limit - Maximum number of events to return
|
|
481
|
+
* @returns Promise resolving to audit events
|
|
482
|
+
*/
|
|
483
|
+
getUserAuditEvents(userId: UUID, limit?: number): Promise<RBACAuditEvent[]>;
|
|
484
|
+
/**
|
|
485
|
+
* Get audit events for an organisation
|
|
486
|
+
*
|
|
487
|
+
* @param organisationId - Organisation ID
|
|
488
|
+
* @param limit - Maximum number of events to return
|
|
489
|
+
* @returns Promise resolving to audit events
|
|
490
|
+
*/
|
|
491
|
+
getOrganisationAuditEvents(organisationId: UUID, limit?: number): Promise<RBACAuditEvent[]>;
|
|
492
|
+
}
|
|
493
|
+
/**
|
|
494
|
+
* Create an audit manager instance
|
|
495
|
+
*
|
|
496
|
+
* @param supabase - Supabase client
|
|
497
|
+
* @returns RBACAuditManager instance
|
|
498
|
+
*/
|
|
499
|
+
declare function createAuditManager(supabase: SupabaseClient<Database>): RBACAuditManager;
|
|
500
|
+
/**
|
|
501
|
+
* Set the global audit manager
|
|
502
|
+
*
|
|
503
|
+
* @param manager - Audit manager instance
|
|
504
|
+
*/
|
|
505
|
+
declare function setGlobalAuditManager(manager: RBACAuditManager): void;
|
|
506
|
+
/**
|
|
507
|
+
* Get the global audit manager
|
|
508
|
+
*
|
|
509
|
+
* @returns Global audit manager or null if not set
|
|
510
|
+
*/
|
|
511
|
+
declare function getGlobalAuditManager(): RBACAuditManager | null;
|
|
512
|
+
/**
|
|
513
|
+
* Emit an audit event using the global audit manager
|
|
514
|
+
*
|
|
515
|
+
* @param event - Audit event payload
|
|
516
|
+
*/
|
|
517
|
+
declare function emitAuditEvent(event: AuditEventPayload): Promise<void>;
|
|
518
|
+
|
|
519
|
+
/**
|
|
520
|
+
* RBAC Security Enhancements
|
|
521
|
+
* @package @jmruthers/pace-core
|
|
522
|
+
* @module RBAC/Security
|
|
523
|
+
* @since 1.0.0
|
|
524
|
+
*
|
|
525
|
+
* Additional security measures for the RBAC system
|
|
526
|
+
*/
|
|
527
|
+
|
|
528
|
+
/**
|
|
529
|
+
* Security context for RBAC operations
|
|
530
|
+
*/
|
|
531
|
+
interface SecurityContext {
|
|
532
|
+
userId: UUID;
|
|
533
|
+
organisationId: UUID;
|
|
534
|
+
ipAddress?: string;
|
|
535
|
+
userAgent?: string;
|
|
536
|
+
timestamp: Date;
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
/**
|
|
540
|
+
* RBAC Core Engine
|
|
541
|
+
* @package @jmruthers/pace-core
|
|
542
|
+
* @module RBAC/Engine
|
|
543
|
+
* @since 1.0.0
|
|
544
|
+
*
|
|
545
|
+
* This module implements the core RBAC permission algorithm with deny-overrides-allow precedence.
|
|
546
|
+
*/
|
|
547
|
+
|
|
548
|
+
/**
|
|
549
|
+
* RBAC Engine
|
|
550
|
+
*
|
|
551
|
+
* Implements the core permission algorithm with deny-overrides-allow precedence.
|
|
552
|
+
*/
|
|
553
|
+
declare class RBACEngine {
|
|
554
|
+
private supabase;
|
|
555
|
+
private securityMiddleware;
|
|
556
|
+
constructor(supabase: SupabaseClient<Database>);
|
|
557
|
+
/**
|
|
558
|
+
* Check if a user has a specific permission
|
|
559
|
+
*
|
|
560
|
+
* @param input - Permission check input
|
|
561
|
+
* @param securityContext - Optional security context for enhanced validation
|
|
562
|
+
* @returns Promise resolving to permission result
|
|
563
|
+
*/
|
|
564
|
+
isPermitted(input: PermissionCheck, securityContext?: SecurityContext): Promise<boolean>;
|
|
565
|
+
/**
|
|
566
|
+
* Get user's access level in a scope
|
|
567
|
+
*
|
|
568
|
+
* @param input - Access level input
|
|
569
|
+
* @returns Promise resolving to access level
|
|
570
|
+
*/
|
|
571
|
+
getAccessLevel(input: {
|
|
572
|
+
userId: UUID;
|
|
573
|
+
scope: Scope;
|
|
574
|
+
}): Promise<AccessLevel>;
|
|
575
|
+
/**
|
|
576
|
+
* Get user's permission map for a scope
|
|
577
|
+
*
|
|
578
|
+
* @param input - Permission map input
|
|
579
|
+
* @returns Promise resolving to permission map
|
|
580
|
+
*/
|
|
581
|
+
getPermissionMap(input: {
|
|
582
|
+
userId: UUID;
|
|
583
|
+
scope: Scope;
|
|
584
|
+
}): Promise<PermissionMap>;
|
|
585
|
+
/**
|
|
586
|
+
* Check if user is super admin
|
|
587
|
+
*
|
|
588
|
+
* @param userId - User ID
|
|
589
|
+
* @returns Promise resolving to super admin status
|
|
590
|
+
*/
|
|
591
|
+
private checkSuperAdmin;
|
|
592
|
+
/**
|
|
593
|
+
* Get app configuration including requires_event setting
|
|
594
|
+
*
|
|
595
|
+
* @param appId - App ID
|
|
596
|
+
* @returns Promise resolving to app configuration
|
|
597
|
+
*/
|
|
598
|
+
getAppConfig(appId: UUID): Promise<{
|
|
599
|
+
requires_event: boolean;
|
|
600
|
+
} | null>;
|
|
601
|
+
/**
|
|
602
|
+
* Resolve organisation ID from event ID
|
|
603
|
+
*
|
|
604
|
+
* @param eventId - Event ID
|
|
605
|
+
* @returns Promise resolving to organisation ID
|
|
606
|
+
*/
|
|
607
|
+
private resolveOrganisationFromEvent;
|
|
608
|
+
/**
|
|
609
|
+
* Validate context requirements based on app configuration
|
|
610
|
+
*
|
|
611
|
+
* @param scope - Permission scope
|
|
612
|
+
* @param appId - Optional app ID
|
|
613
|
+
* @returns Promise resolving to validated scope with resolved organisation ID
|
|
614
|
+
*/
|
|
615
|
+
private validateContextRequirements;
|
|
616
|
+
/**
|
|
617
|
+
* Collect active grants for a user in a scope
|
|
618
|
+
*
|
|
619
|
+
* @param userId - User ID
|
|
620
|
+
* @param scope - Permission scope
|
|
621
|
+
* @param pageId - Optional page ID
|
|
622
|
+
* @returns Promise resolving to grants array
|
|
623
|
+
*
|
|
624
|
+
* PRECEDENCE ORDER (closest scope first): page → eventApp → organisation → global
|
|
625
|
+
*/
|
|
626
|
+
private collectActiveGrants;
|
|
627
|
+
/**
|
|
628
|
+
* Check page-specific permissions
|
|
629
|
+
*
|
|
630
|
+
* @param userId - User ID
|
|
631
|
+
* @param pageId - Page ID
|
|
632
|
+
* @param permission - Permission to check
|
|
633
|
+
* @param scope - Permission scope
|
|
634
|
+
* @returns Promise resolving to page permission result
|
|
635
|
+
*/
|
|
636
|
+
private checkPagePermissions;
|
|
637
|
+
/**
|
|
638
|
+
* Get organisation role for a user
|
|
639
|
+
*
|
|
640
|
+
* @param userId - User ID
|
|
641
|
+
* @param organisationId - Organisation ID
|
|
642
|
+
* @returns Promise resolving to organisation role
|
|
643
|
+
*/
|
|
644
|
+
private getOrganisationRole;
|
|
645
|
+
/**
|
|
646
|
+
* Get event-app role for a user
|
|
647
|
+
*
|
|
648
|
+
* @param userId - User ID
|
|
649
|
+
* @param eventId - Event ID
|
|
650
|
+
* @param appId - App ID
|
|
651
|
+
* @returns Promise resolving to event-app role
|
|
652
|
+
*/
|
|
653
|
+
private getEventAppRole;
|
|
654
|
+
/**
|
|
655
|
+
* Get permission for organisation role
|
|
656
|
+
*
|
|
657
|
+
* @param role - Organisation role
|
|
658
|
+
* @returns Permission string
|
|
659
|
+
*/
|
|
660
|
+
private getPermissionForOrgRole;
|
|
661
|
+
/**
|
|
662
|
+
* Get permission for event-app role
|
|
663
|
+
*
|
|
664
|
+
* @param role - Event-app role
|
|
665
|
+
* @returns Permission string
|
|
666
|
+
*/
|
|
667
|
+
private getPermissionForEventRole;
|
|
668
|
+
/**
|
|
669
|
+
* Check if a permission matches another permission
|
|
670
|
+
*
|
|
671
|
+
* @param grantPermission - Permission from grant
|
|
672
|
+
* @param requestedPermission - Requested permission
|
|
673
|
+
* @returns True if permissions match
|
|
674
|
+
*/
|
|
675
|
+
private permissionMatches;
|
|
676
|
+
/**
|
|
677
|
+
* Resolve a page ID to UUID if it's a page name
|
|
678
|
+
*
|
|
679
|
+
* @param pageId - Page ID (UUID) or page name (string)
|
|
680
|
+
* @param appId - App ID to look up the page
|
|
681
|
+
* @returns Resolved page ID (UUID) or original pageId if it's already a UUID or can't be resolved
|
|
682
|
+
*/
|
|
683
|
+
private resolvePageId;
|
|
684
|
+
}
|
|
685
|
+
/**
|
|
686
|
+
* Create an RBAC engine instance
|
|
687
|
+
*
|
|
688
|
+
* @param supabase - Supabase client
|
|
689
|
+
* @returns RBACEngine instance
|
|
690
|
+
*/
|
|
691
|
+
declare function createRBACEngine(supabase: SupabaseClient<Database>): RBACEngine;
|
|
692
|
+
|
|
693
|
+
/**
|
|
694
|
+
* RBAC React Hooks
|
|
695
|
+
* @package @jmruthers/pace-core
|
|
696
|
+
* @module RBAC/Hooks
|
|
697
|
+
* @since 1.0.0
|
|
698
|
+
*
|
|
699
|
+
* This module provides React hooks for RBAC functionality.
|
|
700
|
+
*/
|
|
701
|
+
|
|
702
|
+
/**
|
|
703
|
+
* Hook to get user's permissions in a scope
|
|
704
|
+
*
|
|
705
|
+
* @param userId - User ID
|
|
706
|
+
* @param scope - Permission scope
|
|
707
|
+
* @returns Permission data and loading state
|
|
708
|
+
*
|
|
709
|
+
* @example
|
|
710
|
+
* ```tsx
|
|
711
|
+
* function MyComponent() {
|
|
712
|
+
* const { permissions, isLoading, error } = usePermissions(
|
|
713
|
+
* 'user-123',
|
|
714
|
+
* { organisationId: 'org-456' }
|
|
715
|
+
* );
|
|
716
|
+
*
|
|
717
|
+
* if (isLoading) return <div>Loading...</div>;
|
|
718
|
+
* if (error) return <div>Error: {error.message}</div>;
|
|
719
|
+
*
|
|
720
|
+
* return (
|
|
721
|
+
* <div>
|
|
722
|
+
* {permissions['page-1']?.includes('read') && <ReadButton />}
|
|
723
|
+
* {permissions['page-1']?.includes('manage') && <ManageButton />}
|
|
724
|
+
* </div>
|
|
725
|
+
* );
|
|
726
|
+
* }
|
|
727
|
+
* ```
|
|
728
|
+
*/
|
|
729
|
+
declare function usePermissions(userId: UUID, scope: Scope): UsePermissionsReturn;
|
|
730
|
+
/**
|
|
731
|
+
* Hook to check if user has a specific permission
|
|
732
|
+
*
|
|
733
|
+
* @param userId - User ID
|
|
734
|
+
* @param scope - Permission scope
|
|
735
|
+
* @param permission - Permission to check
|
|
736
|
+
* @param pageId - Optional page ID
|
|
737
|
+
* @param useCache - Whether to use cached results (default: true)
|
|
738
|
+
* @returns Permission check result and loading state
|
|
739
|
+
*
|
|
740
|
+
* @example
|
|
741
|
+
* ```tsx
|
|
742
|
+
* function MyComponent() {
|
|
743
|
+
* const { can, isLoading } = useCan(
|
|
744
|
+
* 'user-123',
|
|
745
|
+
* { organisationId: 'org-456' },
|
|
746
|
+
* 'manage:events',
|
|
747
|
+
* 'page-789'
|
|
748
|
+
* );
|
|
749
|
+
*
|
|
750
|
+
* if (isLoading) return <div>Checking permission...</div>;
|
|
751
|
+
*
|
|
752
|
+
* return (
|
|
753
|
+
* <div>
|
|
754
|
+
* {can ? <AdminPanel /> : <AccessDenied />}
|
|
755
|
+
* </div>
|
|
756
|
+
* );
|
|
757
|
+
* }
|
|
758
|
+
* ```
|
|
759
|
+
*/
|
|
760
|
+
declare function useCan(userId: UUID, scope: Scope, permission: Permission, pageId?: UUID, useCache?: boolean): UseCanReturn;
|
|
761
|
+
/**
|
|
762
|
+
* Hook to get user's access level in a scope
|
|
763
|
+
*
|
|
764
|
+
* @param userId - User ID
|
|
765
|
+
* @param scope - Permission scope
|
|
766
|
+
* @returns Access level and loading state
|
|
767
|
+
*
|
|
768
|
+
* @example
|
|
769
|
+
* ```tsx
|
|
770
|
+
* function MyComponent() {
|
|
771
|
+
* const { accessLevel, isLoading } = useAccessLevel(
|
|
772
|
+
* 'user-123',
|
|
773
|
+
* { organisationId: 'org-456' }
|
|
774
|
+
* );
|
|
775
|
+
*
|
|
776
|
+
* if (isLoading) return <div>Loading...</div>;
|
|
777
|
+
*
|
|
778
|
+
* return (
|
|
779
|
+
* <div>
|
|
780
|
+
* {accessLevel === 'super' && <SuperAdminPanel />}
|
|
781
|
+
* {accessLevel === 'admin' && <AdminPanel />}
|
|
782
|
+
* {accessLevel === 'planner' && <PlannerPanel />}
|
|
783
|
+
* </div>
|
|
784
|
+
* );
|
|
785
|
+
* }
|
|
786
|
+
* ```
|
|
787
|
+
*/
|
|
788
|
+
declare function useAccessLevel(userId: UUID, scope: Scope): {
|
|
789
|
+
accessLevel: AccessLevel | null;
|
|
790
|
+
isLoading: boolean;
|
|
791
|
+
error: Error | null;
|
|
792
|
+
refetch: () => Promise<void>;
|
|
793
|
+
};
|
|
794
|
+
/**
|
|
795
|
+
* Hook to check multiple permissions at once
|
|
796
|
+
*
|
|
797
|
+
* @param userId - User ID
|
|
798
|
+
* @param scope - Permission scope
|
|
799
|
+
* @param permissions - Array of permissions to check
|
|
800
|
+
* @param pageId - Optional page ID
|
|
801
|
+
* @param useCache - Whether to use cached results (default: true)
|
|
802
|
+
* @returns Object with permission results and loading state
|
|
803
|
+
*
|
|
804
|
+
* @example
|
|
805
|
+
* ```tsx
|
|
806
|
+
* function MyComponent() {
|
|
807
|
+
* const { permissions, isLoading } = useMultiplePermissions(
|
|
808
|
+
* 'user-123',
|
|
809
|
+
* { organisationId: 'org-456' },
|
|
810
|
+
* ['read:events', 'manage:events', 'delete:events']
|
|
811
|
+
* );
|
|
812
|
+
*
|
|
813
|
+
* return (
|
|
814
|
+
* <div>
|
|
815
|
+
* {permissions['read:events'] && <ReadButton />}
|
|
816
|
+
* {permissions['manage:events'] && <ManageButton />}
|
|
817
|
+
* {permissions['delete:events'] && <DeleteButton />}
|
|
818
|
+
* </div>
|
|
819
|
+
* );
|
|
820
|
+
* }
|
|
821
|
+
* ```
|
|
822
|
+
*/
|
|
823
|
+
declare function useMultiplePermissions(userId: UUID, scope: Scope, permissions: Permission[], pageId?: UUID, useCache?: boolean): {
|
|
824
|
+
permissions: Record<Permission, boolean>;
|
|
825
|
+
isLoading: boolean;
|
|
826
|
+
error: Error | null;
|
|
827
|
+
refetch: () => Promise<void>;
|
|
828
|
+
};
|
|
829
|
+
/**
|
|
830
|
+
* Hook to check if user has any of the specified permissions
|
|
831
|
+
*
|
|
832
|
+
* @param userId - User ID
|
|
833
|
+
* @param scope - Permission scope
|
|
834
|
+
* @param permissions - Array of permissions to check
|
|
835
|
+
* @param pageId - Optional page ID
|
|
836
|
+
* @returns True if user has any permission and loading state
|
|
837
|
+
*
|
|
838
|
+
* @example
|
|
839
|
+
* ```tsx
|
|
840
|
+
* function MyComponent() {
|
|
841
|
+
* const { hasAny, isLoading } = useHasAnyPermission(
|
|
842
|
+
* 'user-123',
|
|
843
|
+
* { organisationId: 'org-456' },
|
|
844
|
+
* ['read:events', 'manage:events']
|
|
845
|
+
* );
|
|
846
|
+
*
|
|
847
|
+
* return (
|
|
848
|
+
* <div>
|
|
849
|
+
* {hasAny ? <EventContent /> : <AccessDenied />}
|
|
850
|
+
* </div>
|
|
851
|
+
* );
|
|
852
|
+
* }
|
|
853
|
+
* ```
|
|
854
|
+
*/
|
|
855
|
+
declare function useHasAnyPermission(userId: UUID, scope: Scope, permissions: Permission[], pageId?: UUID): {
|
|
856
|
+
hasAny: boolean;
|
|
857
|
+
isLoading: boolean;
|
|
858
|
+
error: Error | null;
|
|
859
|
+
refetch: () => Promise<void>;
|
|
860
|
+
};
|
|
861
|
+
/**
|
|
862
|
+
* Hook to check if user has all of the specified permissions
|
|
863
|
+
*
|
|
864
|
+
* @param userId - User ID
|
|
865
|
+
* @param scope - Permission scope
|
|
866
|
+
* @param permissions - Array of permissions to check
|
|
867
|
+
* @param pageId - Optional page ID
|
|
868
|
+
* @returns True if user has all permissions and loading state
|
|
869
|
+
*
|
|
870
|
+
* @example
|
|
871
|
+
* ```tsx
|
|
872
|
+
* function MyComponent() {
|
|
873
|
+
* const { hasAll, isLoading } = useHasAllPermissions(
|
|
874
|
+
* 'user-123',
|
|
875
|
+
* { organisationId: 'org-456' },
|
|
876
|
+
* ['read:events', 'manage:events']
|
|
877
|
+
* );
|
|
878
|
+
*
|
|
879
|
+
* return (
|
|
880
|
+
* <div>
|
|
881
|
+
* {hasAll ? <FullAccessPanel /> : <LimitedAccessPanel />}
|
|
882
|
+
* </div>
|
|
883
|
+
* );
|
|
884
|
+
* }
|
|
885
|
+
* ```
|
|
886
|
+
*/
|
|
887
|
+
declare function useHasAllPermissions(userId: UUID, scope: Scope, permissions: Permission[], pageId?: UUID): {
|
|
888
|
+
hasAll: boolean;
|
|
889
|
+
isLoading: boolean;
|
|
890
|
+
error: Error | null;
|
|
891
|
+
refetch: () => Promise<void>;
|
|
892
|
+
};
|
|
893
|
+
/**
|
|
894
|
+
* Hook to read cached permissions (contract requirement)
|
|
895
|
+
*
|
|
896
|
+
* This hook only reads from the core cache and does not perform
|
|
897
|
+
* any bespoke caching as per the contract requirements.
|
|
898
|
+
*
|
|
899
|
+
* @param userId - User ID
|
|
900
|
+
* @param scope - Permission scope
|
|
901
|
+
* @returns Cached permission data and loading state
|
|
902
|
+
*
|
|
903
|
+
* @example
|
|
904
|
+
* ```tsx
|
|
905
|
+
* function MyComponent() {
|
|
906
|
+
* const { permissions, isLoading, error } = useCachedPermissions(
|
|
907
|
+
* 'user-123',
|
|
908
|
+
* { organisationId: 'org-456' }
|
|
909
|
+
* );
|
|
910
|
+
*
|
|
911
|
+
* if (isLoading) return <div>Loading cached permissions...</div>;
|
|
912
|
+
* if (error) return <div>Error: {error.message}</div>;
|
|
913
|
+
*
|
|
914
|
+
* return (
|
|
915
|
+
* <div>
|
|
916
|
+
* {permissions['page-1']?.includes('read') && <ReadButton />}
|
|
917
|
+
* {permissions['page-1']?.includes('manage') && <ManageButton />}
|
|
918
|
+
* </div>
|
|
919
|
+
* );
|
|
920
|
+
* }
|
|
921
|
+
* ```
|
|
922
|
+
*/
|
|
923
|
+
declare function useCachedPermissions(userId: UUID, scope: Scope): {
|
|
924
|
+
permissions: PermissionMap;
|
|
925
|
+
isLoading: boolean;
|
|
926
|
+
error: Error | null;
|
|
927
|
+
refetch: () => Promise<void>;
|
|
928
|
+
};
|
|
929
|
+
|
|
930
|
+
/**
|
|
931
|
+
* RBAC Adapters
|
|
932
|
+
* @package @jmruthers/pace-core
|
|
933
|
+
* @module RBAC/Adapters
|
|
934
|
+
* @since 1.0.0
|
|
935
|
+
*
|
|
936
|
+
* This module provides adapters for different frameworks and server runtimes.
|
|
937
|
+
*/
|
|
938
|
+
|
|
939
|
+
/**
|
|
940
|
+
* Permission Guard Component
|
|
941
|
+
*
|
|
942
|
+
* A React component that conditionally renders children based on permissions.
|
|
943
|
+
* Can auto-infer userId from context if not provided.
|
|
944
|
+
*
|
|
945
|
+
* @example
|
|
946
|
+
* ```tsx
|
|
947
|
+
* // With explicit userId and scope
|
|
948
|
+
* <PermissionGuard
|
|
949
|
+
* userId="user-123"
|
|
950
|
+
* scope={{ organisationId: 'org-456' }}
|
|
951
|
+
* permission="manage:events"
|
|
952
|
+
* pageId="page-789"
|
|
953
|
+
* fallback={<AccessDenied />}
|
|
954
|
+
* >
|
|
955
|
+
* <AdminPanel />
|
|
956
|
+
* </PermissionGuard>
|
|
957
|
+
*
|
|
958
|
+
* // With context inference (requires auth context)
|
|
959
|
+
* <PermissionGuard
|
|
960
|
+
* permission="manage:events"
|
|
961
|
+
* scope={{ organisationId: 'org-456' }}
|
|
962
|
+
* fallback={<AccessDenied />}
|
|
963
|
+
* >
|
|
964
|
+
* <AdminPanel />
|
|
965
|
+
* </PermissionGuard>
|
|
966
|
+
* ```
|
|
967
|
+
*/
|
|
968
|
+
declare function PermissionGuard({ userId, scope, permission, pageId, children, fallback, onDenied, loading, strictMode, auditLog, enforceAudit, }: {
|
|
969
|
+
userId?: UUID;
|
|
970
|
+
scope: {
|
|
971
|
+
organisationId: UUID;
|
|
972
|
+
eventId?: string;
|
|
973
|
+
appId?: UUID;
|
|
974
|
+
};
|
|
975
|
+
permission: Permission;
|
|
976
|
+
pageId?: UUID;
|
|
977
|
+
children: ReactNode;
|
|
978
|
+
fallback?: ReactNode;
|
|
979
|
+
onDenied?: () => void;
|
|
980
|
+
loading?: ReactNode;
|
|
981
|
+
strictMode?: boolean;
|
|
982
|
+
auditLog?: boolean;
|
|
983
|
+
enforceAudit?: boolean;
|
|
984
|
+
}): React__default.ReactNode;
|
|
985
|
+
/**
|
|
986
|
+
* Access Level Guard Component
|
|
987
|
+
*
|
|
988
|
+
* A React component that conditionally renders children based on access level.
|
|
989
|
+
* Can auto-infer userId from context if not provided.
|
|
990
|
+
*
|
|
991
|
+
* @example
|
|
992
|
+
* ```tsx
|
|
993
|
+
* // With explicit userId and scope
|
|
994
|
+
* <AccessLevelGuard
|
|
995
|
+
* userId="user-123"
|
|
996
|
+
* scope={{ organisationId: 'org-456' }}
|
|
997
|
+
* minLevel="admin"
|
|
998
|
+
* fallback={<AccessDenied />}
|
|
999
|
+
* >
|
|
1000
|
+
* <AdminPanel />
|
|
1001
|
+
* </AccessLevelGuard>
|
|
1002
|
+
*
|
|
1003
|
+
* // With context inference (requires auth context)
|
|
1004
|
+
* <AccessLevelGuard
|
|
1005
|
+
* minLevel="admin"
|
|
1006
|
+
* scope={{ organisationId: 'org-456' }}
|
|
1007
|
+
* fallback={<AccessDenied />}
|
|
1008
|
+
* >
|
|
1009
|
+
* <AdminPanel />
|
|
1010
|
+
* </AccessLevelGuard>
|
|
1011
|
+
* ```
|
|
1012
|
+
*/
|
|
1013
|
+
declare function AccessLevelGuard({ userId, scope, minLevel, children, fallback, loading, }: {
|
|
1014
|
+
userId?: UUID;
|
|
1015
|
+
scope: {
|
|
1016
|
+
organisationId: UUID;
|
|
1017
|
+
eventId?: string;
|
|
1018
|
+
appId?: UUID;
|
|
1019
|
+
};
|
|
1020
|
+
minLevel: 'viewer' | 'participant' | 'planner' | 'admin' | 'super';
|
|
1021
|
+
children: ReactNode;
|
|
1022
|
+
fallback?: ReactNode;
|
|
1023
|
+
loading?: ReactNode;
|
|
1024
|
+
}): React__default.ReactNode;
|
|
1025
|
+
/**
|
|
1026
|
+
* Permission Guard for Server Handlers
|
|
1027
|
+
*
|
|
1028
|
+
* Wraps a server handler with permission checking.
|
|
1029
|
+
*
|
|
1030
|
+
* @param config - Permission guard configuration
|
|
1031
|
+
* @param handler - Handler function to wrap
|
|
1032
|
+
* @returns Wrapped handler function
|
|
1033
|
+
*
|
|
1034
|
+
* @example
|
|
1035
|
+
* ```typescript
|
|
1036
|
+
* const protectedHandler = withPermissionGuard(
|
|
1037
|
+
* { permission: 'manage:events', pageId: 'page-789' },
|
|
1038
|
+
* async (req, res) => {
|
|
1039
|
+
* // Handler logic here
|
|
1040
|
+
* res.json({ success: true });
|
|
1041
|
+
* }
|
|
1042
|
+
* );
|
|
1043
|
+
* ```
|
|
1044
|
+
*/
|
|
1045
|
+
declare function withPermissionGuard<T extends any[]>(config: {
|
|
1046
|
+
permission: Permission;
|
|
1047
|
+
pageId?: UUID;
|
|
1048
|
+
}, handler: (...args: T) => Promise<any>): (...args: T) => Promise<any>;
|
|
1049
|
+
/**
|
|
1050
|
+
* Access Level Guard for Server Handlers
|
|
1051
|
+
*
|
|
1052
|
+
* Wraps a server handler with access level checking.
|
|
1053
|
+
*
|
|
1054
|
+
* @param minLevel - Minimum access level required
|
|
1055
|
+
* @param handler - Handler function to wrap
|
|
1056
|
+
* @returns Wrapped handler function
|
|
1057
|
+
*
|
|
1058
|
+
* @example
|
|
1059
|
+
* ```typescript
|
|
1060
|
+
* const adminHandler = withAccessLevelGuard(
|
|
1061
|
+
* 'admin',
|
|
1062
|
+
* async (req, res) => {
|
|
1063
|
+
* // Admin-only logic here
|
|
1064
|
+
* res.json({ success: true });
|
|
1065
|
+
* }
|
|
1066
|
+
* );
|
|
1067
|
+
* ```
|
|
1068
|
+
*/
|
|
1069
|
+
declare function withAccessLevelGuard<T extends any[]>(minLevel: 'viewer' | 'participant' | 'planner' | 'admin' | 'super', handler: (...args: T) => Promise<any>): (...args: T) => Promise<any>;
|
|
1070
|
+
/**
|
|
1071
|
+
* Role Guard for Server Handlers
|
|
1072
|
+
*
|
|
1073
|
+
* Wraps a server handler with role-based access control.
|
|
1074
|
+
* This is the primary middleware for routing protection as specified in the contract.
|
|
1075
|
+
*
|
|
1076
|
+
* @param config - Role guard configuration
|
|
1077
|
+
* @param handler - Handler function to wrap
|
|
1078
|
+
* @returns Wrapped handler function
|
|
1079
|
+
*
|
|
1080
|
+
* @example
|
|
1081
|
+
* ```typescript
|
|
1082
|
+
* const adminHandler = withRoleGuard(
|
|
1083
|
+
* {
|
|
1084
|
+
* globalRoles: ['super_admin'],
|
|
1085
|
+
* organisationRoles: ['org_admin', 'leader'],
|
|
1086
|
+
* eventAppRoles: ['event_admin', 'planner']
|
|
1087
|
+
* },
|
|
1088
|
+
* async (req, res) => {
|
|
1089
|
+
* // Admin-only logic here
|
|
1090
|
+
* res.json({ success: true });
|
|
1091
|
+
* }
|
|
1092
|
+
* );
|
|
1093
|
+
* ```
|
|
1094
|
+
*/
|
|
1095
|
+
declare function withRoleGuard<T extends any[]>(config: {
|
|
1096
|
+
globalRoles?: string[];
|
|
1097
|
+
organisationRoles?: string[];
|
|
1098
|
+
eventAppRoles?: string[];
|
|
1099
|
+
requireAll?: boolean;
|
|
1100
|
+
}, handler: (...args: T) => Promise<any>): (...args: T) => Promise<any>;
|
|
1101
|
+
/**
|
|
1102
|
+
* Next.js Middleware for RBAC
|
|
1103
|
+
*
|
|
1104
|
+
* Middleware that checks permissions before allowing access to pages.
|
|
1105
|
+
*
|
|
1106
|
+
* @param config - Middleware configuration
|
|
1107
|
+
* @returns Next.js middleware function
|
|
1108
|
+
*
|
|
1109
|
+
* @example
|
|
1110
|
+
* ```typescript
|
|
1111
|
+
* // middleware.ts
|
|
1112
|
+
* import { createRBACMiddleware } from '@jmruthers/pace-core/rbac';
|
|
1113
|
+
*
|
|
1114
|
+
* export default createRBACMiddleware({
|
|
1115
|
+
* protectedRoutes: [
|
|
1116
|
+
* { path: '/admin', permission: 'manage:admin' },
|
|
1117
|
+
* { path: '/events', permission: 'read:events' },
|
|
1118
|
+
* ],
|
|
1119
|
+
* fallbackUrl: '/access-denied',
|
|
1120
|
+
* });
|
|
1121
|
+
* ```
|
|
1122
|
+
*/
|
|
1123
|
+
declare function createRBACMiddleware(config: {
|
|
1124
|
+
protectedRoutes: Array<{
|
|
1125
|
+
path: string;
|
|
1126
|
+
permission: Permission;
|
|
1127
|
+
pageId?: UUID;
|
|
1128
|
+
}>;
|
|
1129
|
+
fallbackUrl?: string;
|
|
1130
|
+
}): (req: {
|
|
1131
|
+
nextUrl: {
|
|
1132
|
+
pathname: string;
|
|
1133
|
+
};
|
|
1134
|
+
user?: {
|
|
1135
|
+
id: string;
|
|
1136
|
+
};
|
|
1137
|
+
organisationId?: string;
|
|
1138
|
+
}, res: {
|
|
1139
|
+
redirect: (url: string) => void;
|
|
1140
|
+
}, next: () => void) => Promise<void>;
|
|
1141
|
+
/**
|
|
1142
|
+
* Express Middleware for RBAC
|
|
1143
|
+
*
|
|
1144
|
+
* Middleware that checks permissions for Express routes.
|
|
1145
|
+
*
|
|
1146
|
+
* @param config - Middleware configuration
|
|
1147
|
+
* @returns Express middleware function
|
|
1148
|
+
*
|
|
1149
|
+
* @example
|
|
1150
|
+
* ```typescript
|
|
1151
|
+
* import { createRBACExpressMiddleware } from '@jmruthers/pace-core/rbac';
|
|
1152
|
+
*
|
|
1153
|
+
* app.use(createRBACExpressMiddleware({
|
|
1154
|
+
* permission: 'read:api',
|
|
1155
|
+
* pageId: 'api-page-123',
|
|
1156
|
+
* }));
|
|
1157
|
+
* ```
|
|
1158
|
+
*/
|
|
1159
|
+
declare function createRBACExpressMiddleware(config: {
|
|
1160
|
+
permission: Permission;
|
|
1161
|
+
pageId?: UUID;
|
|
1162
|
+
}): (req: {
|
|
1163
|
+
user?: {
|
|
1164
|
+
id: string;
|
|
1165
|
+
};
|
|
1166
|
+
organisationId?: string;
|
|
1167
|
+
eventId?: string;
|
|
1168
|
+
appId?: string;
|
|
1169
|
+
}, res: {
|
|
1170
|
+
status: (code: number) => {
|
|
1171
|
+
json: (data: object) => void;
|
|
1172
|
+
};
|
|
1173
|
+
}, next: () => void) => Promise<void>;
|
|
1174
|
+
/**
|
|
1175
|
+
* Check if a user has a permission (synchronous cache check only)
|
|
1176
|
+
*
|
|
1177
|
+
* @param userId - User ID
|
|
1178
|
+
* @param scope - Permission scope
|
|
1179
|
+
* @param permission - Permission to check
|
|
1180
|
+
* @param pageId - Optional page ID
|
|
1181
|
+
* @returns True if permission is cached and granted
|
|
1182
|
+
*/
|
|
1183
|
+
declare function hasPermissionCached(userId: UUID, scope: {
|
|
1184
|
+
organisationId: UUID;
|
|
1185
|
+
eventId?: string;
|
|
1186
|
+
appId?: UUID;
|
|
1187
|
+
}, _permission: Permission, _pageId?: UUID): boolean;
|
|
1188
|
+
/**
|
|
1189
|
+
* Check if a user has any of the specified permissions (synchronous cache check only)
|
|
1190
|
+
*
|
|
1191
|
+
* @param userId - User ID
|
|
1192
|
+
* @param scope - Permission scope
|
|
1193
|
+
* @param permissions - Array of permissions to check
|
|
1194
|
+
* @param pageId - Optional page ID
|
|
1195
|
+
* @returns True if any permission is cached and granted
|
|
1196
|
+
*/
|
|
1197
|
+
declare function hasAnyPermissionCached(userId: UUID, scope: {
|
|
1198
|
+
organisationId: UUID;
|
|
1199
|
+
eventId?: string;
|
|
1200
|
+
appId?: UUID;
|
|
1201
|
+
}, permissions: Permission[], pageId?: UUID): boolean;
|
|
1202
|
+
|
|
1203
|
+
interface PagePermissionContextType {
|
|
1204
|
+
/** Check if user has permission for a page */
|
|
1205
|
+
hasPagePermission: (pageName: string, operation: string, pageId?: string, scope?: Scope) => boolean;
|
|
1206
|
+
/** Get all page permissions for current user */
|
|
1207
|
+
getPagePermissions: () => Record<string, string[]>;
|
|
1208
|
+
/** Check if page permission checking is enabled */
|
|
1209
|
+
isEnabled: boolean;
|
|
1210
|
+
/** Check if strict mode is enabled */
|
|
1211
|
+
isStrictMode: boolean;
|
|
1212
|
+
/** Check if audit logging is enabled */
|
|
1213
|
+
isAuditLogEnabled: boolean;
|
|
1214
|
+
/** Get page access history */
|
|
1215
|
+
getPageAccessHistory: () => PageAccessRecord[];
|
|
1216
|
+
/** Clear page access history */
|
|
1217
|
+
clearPageAccessHistory: () => void;
|
|
1218
|
+
}
|
|
1219
|
+
interface PageAccessRecord {
|
|
1220
|
+
pageName: string;
|
|
1221
|
+
operation: string;
|
|
1222
|
+
userId: UUID;
|
|
1223
|
+
scope: Scope;
|
|
1224
|
+
allowed: boolean;
|
|
1225
|
+
timestamp: string;
|
|
1226
|
+
pageId?: string;
|
|
1227
|
+
}
|
|
1228
|
+
interface PagePermissionProviderProps {
|
|
1229
|
+
/** Child components */
|
|
1230
|
+
children: React__default.ReactNode;
|
|
1231
|
+
/** Enable strict mode to prevent bypassing (default: true) */
|
|
1232
|
+
strictMode?: boolean;
|
|
1233
|
+
/** Enable audit logging (default: true) */
|
|
1234
|
+
auditLog?: boolean;
|
|
1235
|
+
/** Callback when page access is attempted */
|
|
1236
|
+
onPageAccess?: (pageName: string, operation: string, allowed: boolean, record: PageAccessRecord) => void;
|
|
1237
|
+
/** Callback when strict mode violation occurs */
|
|
1238
|
+
onStrictModeViolation?: (pageName: string, operation: string, record: PageAccessRecord) => void;
|
|
1239
|
+
/** Maximum number of access records to keep in history */
|
|
1240
|
+
maxHistorySize?: number;
|
|
1241
|
+
}
|
|
1242
|
+
/**
|
|
1243
|
+
* PagePermissionProvider - Manages page-level permissions across the app
|
|
1244
|
+
*
|
|
1245
|
+
* This provider ensures that all pages are properly protected and provides
|
|
1246
|
+
* centralized page permission management with strict enforcement.
|
|
1247
|
+
*
|
|
1248
|
+
* @param props - Provider props
|
|
1249
|
+
* @returns React element with page permission context
|
|
1250
|
+
*/
|
|
1251
|
+
declare function PagePermissionProvider({ children, strictMode, auditLog, onPageAccess, onStrictModeViolation, maxHistorySize }: PagePermissionProviderProps): react_jsx_runtime.JSX.Element;
|
|
1252
|
+
/**
|
|
1253
|
+
* Hook to use page permission context
|
|
1254
|
+
*
|
|
1255
|
+
* @returns Page permission context
|
|
1256
|
+
* @throws Error if used outside of PagePermissionProvider
|
|
1257
|
+
*/
|
|
1258
|
+
declare function usePagePermissions(): PagePermissionContextType;
|
|
1259
|
+
|
|
1260
|
+
interface PagePermissionGuardProps {
|
|
1261
|
+
/** Name of the page being protected */
|
|
1262
|
+
pageName: string;
|
|
1263
|
+
/** Operation being performed on the page */
|
|
1264
|
+
operation: 'read' | 'create' | 'update' | 'delete';
|
|
1265
|
+
/** Content to render when user has permission */
|
|
1266
|
+
children: React__default.ReactNode;
|
|
1267
|
+
/** Content to render when user lacks permission */
|
|
1268
|
+
fallback?: React__default.ReactNode;
|
|
1269
|
+
/** Enable strict mode to prevent bypassing (default: true) */
|
|
1270
|
+
strictMode?: boolean;
|
|
1271
|
+
/** Force audit logging for this page access (default: true) */
|
|
1272
|
+
auditLog?: boolean;
|
|
1273
|
+
/** Custom page ID for permission checking */
|
|
1274
|
+
pageId?: string;
|
|
1275
|
+
/** Custom scope for permission checking */
|
|
1276
|
+
scope?: Scope;
|
|
1277
|
+
/** Callback when access is denied */
|
|
1278
|
+
onDenied?: (pageName: string, operation: string) => void;
|
|
1279
|
+
/** Loading state content */
|
|
1280
|
+
loading?: React__default.ReactNode;
|
|
1281
|
+
}
|
|
1282
|
+
/**
|
|
1283
|
+
* PagePermissionGuard - Enforces page-level permissions
|
|
1284
|
+
*
|
|
1285
|
+
* This component ensures that users can only access pages they have permission for.
|
|
1286
|
+
* It integrates with the existing RBAC system and provides strict enforcement to
|
|
1287
|
+
* prevent apps from bypassing permission checks.
|
|
1288
|
+
*
|
|
1289
|
+
* @param props - Component props
|
|
1290
|
+
* @returns React element with permission enforcement
|
|
1291
|
+
*/
|
|
1292
|
+
declare function PagePermissionGuard({ pageName, operation, children, fallback, strictMode, auditLog, pageId, scope, onDenied, loading }: PagePermissionGuardProps): react_jsx_runtime.JSX.Element;
|
|
1293
|
+
|
|
1294
|
+
interface DataAccessRecord {
|
|
1295
|
+
table: string;
|
|
1296
|
+
operation: string;
|
|
1297
|
+
userId: UUID;
|
|
1298
|
+
scope: Scope;
|
|
1299
|
+
allowed: boolean;
|
|
1300
|
+
timestamp: string;
|
|
1301
|
+
query?: string;
|
|
1302
|
+
filters?: Record<string, any>;
|
|
1303
|
+
}
|
|
1304
|
+
interface SecureDataContextType {
|
|
1305
|
+
/** Check if data access is allowed for a table and operation */
|
|
1306
|
+
isDataAccessAllowed: (table: string, operation: string, scope?: Scope) => boolean;
|
|
1307
|
+
/** Get all data access permissions for current user */
|
|
1308
|
+
getDataAccessPermissions: () => Record<string, string[]>;
|
|
1309
|
+
/** Check if secure data access is enabled */
|
|
1310
|
+
isEnabled: boolean;
|
|
1311
|
+
/** Check if strict mode is enabled */
|
|
1312
|
+
isStrictMode: boolean;
|
|
1313
|
+
/** Check if audit logging is enabled */
|
|
1314
|
+
isAuditLogEnabled: boolean;
|
|
1315
|
+
/** Get data access history */
|
|
1316
|
+
getDataAccessHistory: () => DataAccessRecord[];
|
|
1317
|
+
/** Clear data access history */
|
|
1318
|
+
clearDataAccessHistory: () => void;
|
|
1319
|
+
/** Validate data access attempt */
|
|
1320
|
+
validateDataAccess: (table: string, operation: string, scope?: Scope) => boolean;
|
|
1321
|
+
}
|
|
1322
|
+
interface SecureDataProviderProps {
|
|
1323
|
+
/** Child components */
|
|
1324
|
+
children: React__default.ReactNode;
|
|
1325
|
+
/** Enable strict mode to prevent bypassing (default: true) */
|
|
1326
|
+
strictMode?: boolean;
|
|
1327
|
+
/** Enable audit logging (default: true) */
|
|
1328
|
+
auditLog?: boolean;
|
|
1329
|
+
/** Callback when data access is attempted */
|
|
1330
|
+
onDataAccess?: (table: string, operation: string, allowed: boolean, record: DataAccessRecord) => void;
|
|
1331
|
+
/** Callback when strict mode violation occurs */
|
|
1332
|
+
onStrictModeViolation?: (table: string, operation: string, record: DataAccessRecord) => void;
|
|
1333
|
+
/** Maximum number of access records to keep in history */
|
|
1334
|
+
maxHistorySize?: number;
|
|
1335
|
+
/** Enable RLS enforcement (default: true) */
|
|
1336
|
+
enforceRLS?: boolean;
|
|
1337
|
+
}
|
|
1338
|
+
/**
|
|
1339
|
+
* SecureDataProvider - Prevents direct Supabase access and enforces secure data patterns
|
|
1340
|
+
*
|
|
1341
|
+
* This provider ensures that all data access goes through the secure RBAC system
|
|
1342
|
+
* and prevents apps from bypassing data access controls.
|
|
1343
|
+
*
|
|
1344
|
+
* @param props - Provider props
|
|
1345
|
+
* @returns React element with secure data context
|
|
1346
|
+
*/
|
|
1347
|
+
declare function SecureDataProvider({ children, strictMode, auditLog, onDataAccess, onStrictModeViolation, maxHistorySize, enforceRLS }: SecureDataProviderProps): react_jsx_runtime.JSX.Element;
|
|
1348
|
+
/**
|
|
1349
|
+
* Hook to use secure data context
|
|
1350
|
+
*
|
|
1351
|
+
* @returns Secure data context
|
|
1352
|
+
* @throws Error if used outside of SecureDataProvider
|
|
1353
|
+
*/
|
|
1354
|
+
declare function useSecureData(): SecureDataContextType;
|
|
1355
|
+
|
|
1356
|
+
interface PermissionEnforcerProps {
|
|
1357
|
+
/** Permissions required for access */
|
|
1358
|
+
permissions: Permission[];
|
|
1359
|
+
/** Operation being performed */
|
|
1360
|
+
operation: string;
|
|
1361
|
+
/** Content to render when user has permission */
|
|
1362
|
+
children: React__default.ReactNode;
|
|
1363
|
+
/** Content to render when user lacks permission */
|
|
1364
|
+
fallback?: React__default.ReactNode;
|
|
1365
|
+
/** Enable strict mode to prevent bypassing (default: true) */
|
|
1366
|
+
strictMode?: boolean;
|
|
1367
|
+
/** Force audit logging for this operation (default: true) */
|
|
1368
|
+
auditLog?: boolean;
|
|
1369
|
+
/** Custom scope for permission checking */
|
|
1370
|
+
scope?: Scope;
|
|
1371
|
+
/** Callback when access is denied */
|
|
1372
|
+
onDenied?: (permissions: Permission[], operation: string) => void;
|
|
1373
|
+
/** Loading state content */
|
|
1374
|
+
loading?: React__default.ReactNode;
|
|
1375
|
+
/** Require all permissions (AND) or any permission (OR) */
|
|
1376
|
+
requireAll?: boolean;
|
|
1377
|
+
}
|
|
1378
|
+
/**
|
|
1379
|
+
* PermissionEnforcer - Enforces permissions for operations
|
|
1380
|
+
*
|
|
1381
|
+
* This component ensures that users can only perform operations they have permission for.
|
|
1382
|
+
* It integrates with the existing RBAC system and provides strict enforcement to
|
|
1383
|
+
* prevent apps from bypassing permission checks.
|
|
1384
|
+
*
|
|
1385
|
+
* @param props - Component props
|
|
1386
|
+
* @returns React element with permission enforcement
|
|
1387
|
+
*/
|
|
1388
|
+
declare function PermissionEnforcer({ permissions, operation, children, fallback, strictMode, auditLog, scope, onDenied, loading, requireAll }: PermissionEnforcerProps): react_jsx_runtime.JSX.Element;
|
|
1389
|
+
|
|
1390
|
+
interface RouteConfig {
|
|
1391
|
+
/** Route path */
|
|
1392
|
+
path: string;
|
|
1393
|
+
/** React component to render */
|
|
1394
|
+
component: React__default.ComponentType;
|
|
1395
|
+
/** Permissions required for this route */
|
|
1396
|
+
permissions: Permission[];
|
|
1397
|
+
/** Roles that can access this route */
|
|
1398
|
+
roles?: string[];
|
|
1399
|
+
/** Minimum access level required */
|
|
1400
|
+
accessLevel?: AccessLevel;
|
|
1401
|
+
/** Page ID for permission checking */
|
|
1402
|
+
pageId?: string;
|
|
1403
|
+
/** Enable strict mode for this route */
|
|
1404
|
+
strictMode?: boolean;
|
|
1405
|
+
/** Route metadata */
|
|
1406
|
+
meta?: {
|
|
1407
|
+
title?: string;
|
|
1408
|
+
description?: string;
|
|
1409
|
+
requiresAuth?: boolean;
|
|
1410
|
+
hidden?: boolean;
|
|
1411
|
+
};
|
|
1412
|
+
}
|
|
1413
|
+
interface RouteAccessRecord {
|
|
1414
|
+
route: string;
|
|
1415
|
+
permissions: Permission[];
|
|
1416
|
+
userId: UUID;
|
|
1417
|
+
scope: Scope;
|
|
1418
|
+
allowed: boolean;
|
|
1419
|
+
timestamp: string;
|
|
1420
|
+
pageId?: string;
|
|
1421
|
+
roles?: string[];
|
|
1422
|
+
accessLevel?: AccessLevel;
|
|
1423
|
+
}
|
|
1424
|
+
interface RoleBasedRouterContextType {
|
|
1425
|
+
/** Get all accessible routes for current user */
|
|
1426
|
+
getAccessibleRoutes: () => RouteConfig[];
|
|
1427
|
+
/** Check if user can access a specific route */
|
|
1428
|
+
canAccessRoute: (path: string) => boolean;
|
|
1429
|
+
/** Get route configuration for a path */
|
|
1430
|
+
getRouteConfig: (path: string) => RouteConfig | null;
|
|
1431
|
+
/** Get route access history */
|
|
1432
|
+
getRouteAccessHistory: () => RouteAccessRecord[];
|
|
1433
|
+
/** Clear route access history */
|
|
1434
|
+
clearRouteAccessHistory: () => void;
|
|
1435
|
+
/** Check if strict mode is enabled */
|
|
1436
|
+
isStrictMode: boolean;
|
|
1437
|
+
/** Check if audit logging is enabled */
|
|
1438
|
+
isAuditLogEnabled: boolean;
|
|
1439
|
+
}
|
|
1440
|
+
interface RoleBasedRouterProps {
|
|
1441
|
+
/** Route configuration */
|
|
1442
|
+
routes: RouteConfig[];
|
|
1443
|
+
/** Fallback route for unauthorized access */
|
|
1444
|
+
fallbackRoute?: string;
|
|
1445
|
+
/** Child components */
|
|
1446
|
+
children: React__default.ReactNode;
|
|
1447
|
+
/** Enable strict mode to prevent bypassing (default: true) */
|
|
1448
|
+
strictMode?: boolean;
|
|
1449
|
+
/** Enable audit logging (default: true) */
|
|
1450
|
+
auditLog?: boolean;
|
|
1451
|
+
/** Callback when route access is attempted */
|
|
1452
|
+
onRouteAccess?: (route: string, allowed: boolean, record: RouteAccessRecord) => void;
|
|
1453
|
+
/** Callback when strict mode violation occurs */
|
|
1454
|
+
onStrictModeViolation?: (route: string, record: RouteAccessRecord) => void;
|
|
1455
|
+
/** Maximum number of access records to keep in history */
|
|
1456
|
+
maxHistorySize?: number;
|
|
1457
|
+
/** Custom unauthorized component */
|
|
1458
|
+
unauthorizedComponent?: React__default.ComponentType<{
|
|
1459
|
+
route: string;
|
|
1460
|
+
reason: string;
|
|
1461
|
+
}>;
|
|
1462
|
+
}
|
|
1463
|
+
/**
|
|
1464
|
+
* RoleBasedRouter - Centralized routing control with role-based protection
|
|
1465
|
+
*
|
|
1466
|
+
* This component ensures that all routes are properly protected and provides
|
|
1467
|
+
* centralized routing control to prevent apps from bypassing route protection.
|
|
1468
|
+
*
|
|
1469
|
+
* @param props - Router props
|
|
1470
|
+
* @returns React element with role-based routing
|
|
1471
|
+
*/
|
|
1472
|
+
declare function RoleBasedRouter({ routes, fallbackRoute, children, strictMode, auditLog, onRouteAccess, onStrictModeViolation, maxHistorySize, unauthorizedComponent: UnauthorizedComponent }: RoleBasedRouterProps): react_jsx_runtime.JSX.Element;
|
|
1473
|
+
/**
|
|
1474
|
+
* Hook to use role-based router context
|
|
1475
|
+
*
|
|
1476
|
+
* @returns Role-based router context
|
|
1477
|
+
* @throws Error if used outside of RoleBasedRouter
|
|
1478
|
+
*/
|
|
1479
|
+
declare function useRoleBasedRouter(): RoleBasedRouterContextType;
|
|
1480
|
+
|
|
1481
|
+
interface NavigationItem {
|
|
1482
|
+
/** Unique identifier for the navigation item */
|
|
1483
|
+
id: string;
|
|
1484
|
+
/** Display label for the navigation item */
|
|
1485
|
+
label: string;
|
|
1486
|
+
/** Navigation path/URL */
|
|
1487
|
+
path: string;
|
|
1488
|
+
/** Permissions required for this navigation item */
|
|
1489
|
+
permissions: Permission[];
|
|
1490
|
+
/** Roles that can access this navigation item */
|
|
1491
|
+
roles?: string[];
|
|
1492
|
+
/** Minimum access level required */
|
|
1493
|
+
accessLevel?: 'viewer' | 'participant' | 'planner' | 'admin' | 'super';
|
|
1494
|
+
/** Page ID for permission checking */
|
|
1495
|
+
pageId?: string;
|
|
1496
|
+
/** Enable strict mode for this navigation item */
|
|
1497
|
+
strictMode?: boolean;
|
|
1498
|
+
/** Navigation item metadata */
|
|
1499
|
+
meta?: {
|
|
1500
|
+
icon?: string;
|
|
1501
|
+
description?: string;
|
|
1502
|
+
hidden?: boolean;
|
|
1503
|
+
order?: number;
|
|
1504
|
+
};
|
|
1505
|
+
}
|
|
1506
|
+
interface NavigationAccessRecord {
|
|
1507
|
+
navigationItem: string;
|
|
1508
|
+
permissions: Permission[];
|
|
1509
|
+
userId: UUID;
|
|
1510
|
+
scope: Scope;
|
|
1511
|
+
allowed: boolean;
|
|
1512
|
+
timestamp: string;
|
|
1513
|
+
pageId?: string;
|
|
1514
|
+
roles?: string[];
|
|
1515
|
+
accessLevel?: string;
|
|
1516
|
+
}
|
|
1517
|
+
interface NavigationContextType {
|
|
1518
|
+
/** Check if user has permission for a navigation item */
|
|
1519
|
+
hasNavigationPermission: (item: NavigationItem) => boolean;
|
|
1520
|
+
/** Get all navigation permissions for current user */
|
|
1521
|
+
getNavigationPermissions: () => Record<string, string[]>;
|
|
1522
|
+
/** Get filtered navigation items based on permissions */
|
|
1523
|
+
getFilteredNavigationItems: (items: NavigationItem[]) => NavigationItem[];
|
|
1524
|
+
/** Check if navigation permission checking is enabled */
|
|
1525
|
+
isEnabled: boolean;
|
|
1526
|
+
/** Check if strict mode is enabled */
|
|
1527
|
+
isStrictMode: boolean;
|
|
1528
|
+
/** Check if audit logging is enabled */
|
|
1529
|
+
isAuditLogEnabled: boolean;
|
|
1530
|
+
/** Get navigation access history */
|
|
1531
|
+
getNavigationAccessHistory: () => NavigationAccessRecord[];
|
|
1532
|
+
/** Clear navigation access history */
|
|
1533
|
+
clearNavigationAccessHistory: () => void;
|
|
1534
|
+
}
|
|
1535
|
+
interface NavigationProviderProps {
|
|
1536
|
+
/** Child components */
|
|
1537
|
+
children: React__default.ReactNode;
|
|
1538
|
+
/** Enable strict mode to prevent bypassing (default: true) */
|
|
1539
|
+
strictMode?: boolean;
|
|
1540
|
+
/** Enable audit logging (default: true) */
|
|
1541
|
+
auditLog?: boolean;
|
|
1542
|
+
/** Callback when navigation access is attempted */
|
|
1543
|
+
onNavigationAccess?: (item: NavigationItem, allowed: boolean, record: NavigationAccessRecord) => void;
|
|
1544
|
+
/** Callback when strict mode violation occurs */
|
|
1545
|
+
onStrictModeViolation?: (item: NavigationItem, record: NavigationAccessRecord) => void;
|
|
1546
|
+
/** Maximum number of access records to keep in history */
|
|
1547
|
+
maxHistorySize?: number;
|
|
1548
|
+
}
|
|
1549
|
+
/**
|
|
1550
|
+
* NavigationProvider - Manages navigation-level permissions across the app
|
|
1551
|
+
*
|
|
1552
|
+
* This provider ensures that all navigation items are properly protected and provides
|
|
1553
|
+
* centralized navigation permission management with strict enforcement.
|
|
1554
|
+
*
|
|
1555
|
+
* @param props - Provider props
|
|
1556
|
+
* @returns React element with navigation permission context
|
|
1557
|
+
*/
|
|
1558
|
+
declare function NavigationProvider({ children, strictMode, auditLog, onNavigationAccess, onStrictModeViolation, maxHistorySize }: NavigationProviderProps): react_jsx_runtime.JSX.Element;
|
|
1559
|
+
/**
|
|
1560
|
+
* Hook to use navigation permission context
|
|
1561
|
+
*
|
|
1562
|
+
* @returns Navigation permission context
|
|
1563
|
+
* @throws Error if used outside of NavigationProvider
|
|
1564
|
+
*/
|
|
1565
|
+
declare function useNavigationPermissions(): NavigationContextType;
|
|
1566
|
+
|
|
1567
|
+
interface NavigationGuardProps {
|
|
1568
|
+
/** Navigation item being protected */
|
|
1569
|
+
navigationItem: NavigationItem;
|
|
1570
|
+
/** Content to render when user has permission */
|
|
1571
|
+
children: React__default.ReactNode;
|
|
1572
|
+
/** Content to render when user lacks permission */
|
|
1573
|
+
fallback?: React__default.ReactNode;
|
|
1574
|
+
/** Enable strict mode to prevent bypassing (default: true) */
|
|
1575
|
+
strictMode?: boolean;
|
|
1576
|
+
/** Force audit logging for this navigation access (default: true) */
|
|
1577
|
+
auditLog?: boolean;
|
|
1578
|
+
/** Custom scope for permission checking */
|
|
1579
|
+
scope?: Scope;
|
|
1580
|
+
/** Callback when access is denied */
|
|
1581
|
+
onDenied?: (item: NavigationItem) => void;
|
|
1582
|
+
/** Loading state content */
|
|
1583
|
+
loading?: React__default.ReactNode;
|
|
1584
|
+
/** Require all permissions (AND) or any permission (OR) */
|
|
1585
|
+
requireAll?: boolean;
|
|
1586
|
+
}
|
|
1587
|
+
/**
|
|
1588
|
+
* NavigationGuard - Enforces navigation-level permissions
|
|
1589
|
+
*
|
|
1590
|
+
* This component ensures that users can only access navigation items they have permission for.
|
|
1591
|
+
* It integrates with the existing RBAC system and provides strict enforcement to
|
|
1592
|
+
* prevent apps from bypassing navigation permission checks.
|
|
1593
|
+
*
|
|
1594
|
+
* @param props - Component props
|
|
1595
|
+
* @returns React element with navigation permission enforcement
|
|
1596
|
+
*/
|
|
1597
|
+
declare function NavigationGuard({ navigationItem, children, fallback, strictMode, auditLog, scope, onDenied, loading, requireAll }: NavigationGuardProps): react_jsx_runtime.JSX.Element;
|
|
1598
|
+
|
|
1599
|
+
interface EnhancedNavigationMenuProps {
|
|
1600
|
+
/** Navigation items to display */
|
|
1601
|
+
items: NavigationItem[];
|
|
1602
|
+
/** Enable strict mode to prevent bypassing (default: true) */
|
|
1603
|
+
strictMode?: boolean;
|
|
1604
|
+
/** Enable audit logging (default: true) */
|
|
1605
|
+
auditLog?: boolean;
|
|
1606
|
+
/** Callback when navigation access is attempted */
|
|
1607
|
+
onNavigationAccess?: (item: NavigationItem, allowed: boolean) => void;
|
|
1608
|
+
/** Callback when strict mode violation occurs */
|
|
1609
|
+
onStrictModeViolation?: (item: NavigationItem) => void;
|
|
1610
|
+
/** Custom className for the navigation menu */
|
|
1611
|
+
className?: string;
|
|
1612
|
+
/** Custom className for navigation items */
|
|
1613
|
+
itemClassName?: string;
|
|
1614
|
+
/** Custom className for active navigation items */
|
|
1615
|
+
activeItemClassName?: string;
|
|
1616
|
+
/** Custom className for disabled navigation items */
|
|
1617
|
+
disabledItemClassName?: string;
|
|
1618
|
+
/** Show/hide navigation items that user doesn't have permission for */
|
|
1619
|
+
hideUnauthorizedItems?: boolean;
|
|
1620
|
+
/** Custom render function for navigation items */
|
|
1621
|
+
renderItem?: (item: NavigationItem, isAuthorized: boolean) => React__default.ReactNode;
|
|
1622
|
+
/** Current active path for highlighting */
|
|
1623
|
+
activePath?: string;
|
|
1624
|
+
/** Navigation item click handler */
|
|
1625
|
+
onItemClick?: (item: NavigationItem) => void;
|
|
1626
|
+
}
|
|
1627
|
+
/**
|
|
1628
|
+
* EnhancedNavigationMenu - Secure navigation menu with RBAC integration
|
|
1629
|
+
*
|
|
1630
|
+
* This component provides a navigation menu that automatically filters items based on
|
|
1631
|
+
* user permissions and enforces strict security controls.
|
|
1632
|
+
*
|
|
1633
|
+
* @param props - Component props
|
|
1634
|
+
* @returns React element with enhanced navigation menu
|
|
1635
|
+
*/
|
|
1636
|
+
declare function EnhancedNavigationMenu({ items, strictMode, auditLog, onNavigationAccess, onStrictModeViolation, className, itemClassName, activeItemClassName, disabledItemClassName, hideUnauthorizedItems, renderItem, activePath, onItemClick }: EnhancedNavigationMenuProps): react_jsx_runtime.JSX.Element;
|
|
1637
|
+
|
|
1638
|
+
/**
|
|
1639
|
+
* RBAC Main API Functions
|
|
1640
|
+
* @package @jmruthers/pace-core
|
|
1641
|
+
* @module RBAC/API
|
|
1642
|
+
* @since 1.0.0
|
|
1643
|
+
*
|
|
1644
|
+
* This module provides the main API functions for the RBAC system.
|
|
1645
|
+
*/
|
|
1646
|
+
|
|
1647
|
+
/**
|
|
1648
|
+
* Setup RBAC system
|
|
1649
|
+
*
|
|
1650
|
+
* @param supabase - Supabase client
|
|
1651
|
+
* @param config - Optional configuration
|
|
1652
|
+
*/
|
|
1653
|
+
declare function setupRBAC(supabase: SupabaseClient<Database>, config?: Partial<RBACConfig>): void;
|
|
1654
|
+
/**
|
|
1655
|
+
* Get user's access level in a scope
|
|
1656
|
+
*
|
|
1657
|
+
* @param input - Access level input
|
|
1658
|
+
* @returns Promise resolving to access level
|
|
1659
|
+
*
|
|
1660
|
+
* @example
|
|
1661
|
+
* ```typescript
|
|
1662
|
+
* const accessLevel = await getAccessLevel({
|
|
1663
|
+
* userId: 'user-123',
|
|
1664
|
+
* scope: { organisationId: 'org-456' }
|
|
1665
|
+
* });
|
|
1666
|
+
* ```
|
|
1667
|
+
*/
|
|
1668
|
+
declare function getAccessLevel(input: {
|
|
1669
|
+
userId: UUID;
|
|
1670
|
+
scope: Scope;
|
|
1671
|
+
}): Promise<AccessLevel>;
|
|
1672
|
+
/**
|
|
1673
|
+
* Get user's permission map for a scope
|
|
1674
|
+
*
|
|
1675
|
+
* @param input - Permission map input
|
|
1676
|
+
* @returns Promise resolving to permission map
|
|
1677
|
+
*
|
|
1678
|
+
* @example
|
|
1679
|
+
* ```typescript
|
|
1680
|
+
* const permissions = await getPermissionMap({
|
|
1681
|
+
* userId: 'user-123',
|
|
1682
|
+
* scope: {
|
|
1683
|
+
* organisationId: 'org-456',
|
|
1684
|
+
* eventId: 'event-789',
|
|
1685
|
+
* appId: 'app-101'
|
|
1686
|
+
* }
|
|
1687
|
+
* });
|
|
1688
|
+
* ```
|
|
1689
|
+
*/
|
|
1690
|
+
declare function getPermissionMap(input: {
|
|
1691
|
+
userId: UUID;
|
|
1692
|
+
scope: Scope;
|
|
1693
|
+
}): Promise<PermissionMap>;
|
|
1694
|
+
/**
|
|
1695
|
+
* Check if user has a specific permission
|
|
1696
|
+
*
|
|
1697
|
+
* @param input - Permission check input
|
|
1698
|
+
* @returns Promise resolving to permission result
|
|
1699
|
+
*
|
|
1700
|
+
* @example
|
|
1701
|
+
* ```typescript
|
|
1702
|
+
* const canManage = await isPermitted({
|
|
1703
|
+
* userId: 'user-123',
|
|
1704
|
+
* scope: { organisationId: 'org-456' },
|
|
1705
|
+
* permission: 'manage:events',
|
|
1706
|
+
* pageId: 'page-789'
|
|
1707
|
+
* });
|
|
1708
|
+
* ```
|
|
1709
|
+
*/
|
|
1710
|
+
declare function isPermitted(input: PermissionCheck): Promise<boolean>;
|
|
1711
|
+
/**
|
|
1712
|
+
* Check if user has a specific permission (cached version)
|
|
1713
|
+
*
|
|
1714
|
+
* @param input - Permission check input
|
|
1715
|
+
* @returns Promise resolving to permission result
|
|
1716
|
+
*/
|
|
1717
|
+
declare function isPermittedCached(input: PermissionCheck): Promise<boolean>;
|
|
1718
|
+
/**
|
|
1719
|
+
* Check if a user has a specific permission (alias for isPermitted)
|
|
1720
|
+
*
|
|
1721
|
+
* @param input - Permission check parameters
|
|
1722
|
+
* @returns Promise<boolean> - True if user has permission
|
|
1723
|
+
*/
|
|
1724
|
+
declare function hasPermission(input: PermissionCheck): Promise<boolean>;
|
|
1725
|
+
/**
|
|
1726
|
+
* Check if user has any of the specified permissions
|
|
1727
|
+
*
|
|
1728
|
+
* @param input - Permission check input with array of permissions
|
|
1729
|
+
* @returns Promise resolving to true if user has any permission
|
|
1730
|
+
*/
|
|
1731
|
+
declare function hasAnyPermission(input: {
|
|
1732
|
+
userId: UUID;
|
|
1733
|
+
scope: Scope;
|
|
1734
|
+
permissions: Permission[];
|
|
1735
|
+
pageId?: UUID;
|
|
1736
|
+
}): Promise<boolean>;
|
|
1737
|
+
/**
|
|
1738
|
+
* Check if user has all of the specified permissions
|
|
1739
|
+
*
|
|
1740
|
+
* @param input - Permission check input with array of permissions
|
|
1741
|
+
* @returns Promise resolving to true if user has all permissions
|
|
1742
|
+
*/
|
|
1743
|
+
declare function hasAllPermissions(input: {
|
|
1744
|
+
userId: UUID;
|
|
1745
|
+
scope: Scope;
|
|
1746
|
+
permissions: Permission[];
|
|
1747
|
+
pageId?: UUID;
|
|
1748
|
+
}): Promise<boolean>;
|
|
1749
|
+
|
|
1750
|
+
/**
|
|
1751
|
+
* RBAC Permissions Definitions
|
|
1752
|
+
* @package @jmruthers/pace-core
|
|
1753
|
+
* @module RBAC/Permissions
|
|
1754
|
+
* @since 1.0.0
|
|
1755
|
+
*
|
|
1756
|
+
* This module defines all permissions used in the RBAC system.
|
|
1757
|
+
* All permission strings must be imported from this file to ensure consistency.
|
|
1758
|
+
*/
|
|
1759
|
+
|
|
1760
|
+
declare const GLOBAL_PERMISSIONS: {
|
|
1761
|
+
readonly MANAGE_ALL: Permission;
|
|
1762
|
+
readonly READ_ALL: Permission;
|
|
1763
|
+
readonly CREATE_ALL: Permission;
|
|
1764
|
+
readonly UPDATE_ALL: Permission;
|
|
1765
|
+
readonly DELETE_ALL: Permission;
|
|
1766
|
+
};
|
|
1767
|
+
declare const ORGANISATION_PERMISSIONS: {
|
|
1768
|
+
readonly MANAGE_ORGANISATION: Permission;
|
|
1769
|
+
readonly READ_ORGANISATION: Permission;
|
|
1770
|
+
readonly UPDATE_ORGANISATION: Permission;
|
|
1771
|
+
readonly MANAGE_USERS: Permission;
|
|
1772
|
+
readonly READ_USERS: Permission;
|
|
1773
|
+
readonly CREATE_USERS: Permission;
|
|
1774
|
+
readonly UPDATE_USERS: Permission;
|
|
1775
|
+
readonly DELETE_USERS: Permission;
|
|
1776
|
+
readonly MANAGE_ROLES: Permission;
|
|
1777
|
+
readonly READ_ROLES: Permission;
|
|
1778
|
+
readonly CREATE_ROLES: Permission;
|
|
1779
|
+
readonly UPDATE_ROLES: Permission;
|
|
1780
|
+
readonly DELETE_ROLES: Permission;
|
|
1781
|
+
readonly MANAGE_EVENTS: Permission;
|
|
1782
|
+
readonly READ_EVENTS: Permission;
|
|
1783
|
+
readonly CREATE_EVENTS: Permission;
|
|
1784
|
+
readonly UPDATE_EVENTS: Permission;
|
|
1785
|
+
readonly DELETE_EVENTS: Permission;
|
|
1786
|
+
readonly MANAGE_APPS: Permission;
|
|
1787
|
+
readonly READ_APPS: Permission;
|
|
1788
|
+
readonly CREATE_APPS: Permission;
|
|
1789
|
+
readonly UPDATE_APPS: Permission;
|
|
1790
|
+
readonly DELETE_APPS: Permission;
|
|
1791
|
+
};
|
|
1792
|
+
declare const EVENT_APP_PERMISSIONS: {
|
|
1793
|
+
readonly MANAGE_EVENT: Permission;
|
|
1794
|
+
readonly READ_EVENT: Permission;
|
|
1795
|
+
readonly UPDATE_EVENT: Permission;
|
|
1796
|
+
readonly MANAGE_APP: Permission;
|
|
1797
|
+
readonly READ_APP: Permission;
|
|
1798
|
+
readonly UPDATE_APP: Permission;
|
|
1799
|
+
readonly MANAGE_TEAM: Permission;
|
|
1800
|
+
readonly READ_TEAM: Permission;
|
|
1801
|
+
readonly CREATE_TEAM: Permission;
|
|
1802
|
+
readonly UPDATE_TEAM: Permission;
|
|
1803
|
+
readonly DELETE_TEAM: Permission;
|
|
1804
|
+
readonly MANAGE_TEAM_MEMBERS: Permission;
|
|
1805
|
+
readonly READ_TEAM_MEMBERS: Permission;
|
|
1806
|
+
readonly CREATE_TEAM_MEMBERS: Permission;
|
|
1807
|
+
readonly UPDATE_TEAM_MEMBERS: Permission;
|
|
1808
|
+
readonly DELETE_TEAM_MEMBERS: Permission;
|
|
1809
|
+
readonly MANAGE_EVENT_CONTENT: Permission;
|
|
1810
|
+
readonly READ_EVENT_CONTENT: Permission;
|
|
1811
|
+
readonly CREATE_EVENT_CONTENT: Permission;
|
|
1812
|
+
readonly UPDATE_EVENT_CONTENT: Permission;
|
|
1813
|
+
readonly DELETE_EVENT_CONTENT: Permission;
|
|
1814
|
+
readonly MANAGE_EVENT_SETTINGS: Permission;
|
|
1815
|
+
readonly READ_EVENT_SETTINGS: Permission;
|
|
1816
|
+
readonly UPDATE_EVENT_SETTINGS: Permission;
|
|
1817
|
+
};
|
|
1818
|
+
declare const PAGE_PERMISSIONS: {
|
|
1819
|
+
readonly READ_PAGE: Permission;
|
|
1820
|
+
readonly MANAGE_PAGE: Permission;
|
|
1821
|
+
readonly READ_ADMIN: Permission;
|
|
1822
|
+
readonly MANAGE_ADMIN: Permission;
|
|
1823
|
+
readonly READ_DASHBOARD: Permission;
|
|
1824
|
+
readonly MANAGE_DASHBOARD: Permission;
|
|
1825
|
+
readonly READ_SETTINGS: Permission;
|
|
1826
|
+
readonly MANAGE_SETTINGS: Permission;
|
|
1827
|
+
readonly READ_REPORTS: Permission;
|
|
1828
|
+
readonly MANAGE_REPORTS: Permission;
|
|
1829
|
+
};
|
|
1830
|
+
declare const PERMISSION_GROUPS: {
|
|
1831
|
+
readonly GLOBAL_ADMIN: readonly [`read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`];
|
|
1832
|
+
readonly ORG_ADMIN: readonly [`read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`];
|
|
1833
|
+
readonly EVENT_ADMIN: readonly [`read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`];
|
|
1834
|
+
readonly PLANNER: readonly [`read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`];
|
|
1835
|
+
readonly PARTICIPANT: readonly [`read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`];
|
|
1836
|
+
readonly VIEWER: readonly [`read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`, `read:${string}` | `create:${string}` | `update:${string}` | `delete:${string}` | `manage:${string}`];
|
|
1837
|
+
};
|
|
1838
|
+
/**
|
|
1839
|
+
* Validate that a permission string is properly formatted
|
|
1840
|
+
*
|
|
1841
|
+
* @param permission - Permission string to validate
|
|
1842
|
+
* @returns True if valid, false otherwise
|
|
1843
|
+
*/
|
|
1844
|
+
declare function isValidPermission(permission: string): permission is Permission;
|
|
1845
|
+
/**
|
|
1846
|
+
* Get all permissions for a role
|
|
1847
|
+
*
|
|
1848
|
+
* @param role - Role name
|
|
1849
|
+
* @returns Array of permissions for the role
|
|
1850
|
+
*/
|
|
1851
|
+
declare function getPermissionsForRole(role: string): Permission[];
|
|
1852
|
+
declare const ALL_PERMISSIONS: {
|
|
1853
|
+
readonly READ_PAGE: Permission;
|
|
1854
|
+
readonly MANAGE_PAGE: Permission;
|
|
1855
|
+
readonly READ_ADMIN: Permission;
|
|
1856
|
+
readonly MANAGE_ADMIN: Permission;
|
|
1857
|
+
readonly READ_DASHBOARD: Permission;
|
|
1858
|
+
readonly MANAGE_DASHBOARD: Permission;
|
|
1859
|
+
readonly READ_SETTINGS: Permission;
|
|
1860
|
+
readonly MANAGE_SETTINGS: Permission;
|
|
1861
|
+
readonly READ_REPORTS: Permission;
|
|
1862
|
+
readonly MANAGE_REPORTS: Permission;
|
|
1863
|
+
readonly MANAGE_EVENT: Permission;
|
|
1864
|
+
readonly READ_EVENT: Permission;
|
|
1865
|
+
readonly UPDATE_EVENT: Permission;
|
|
1866
|
+
readonly MANAGE_APP: Permission;
|
|
1867
|
+
readonly READ_APP: Permission;
|
|
1868
|
+
readonly UPDATE_APP: Permission;
|
|
1869
|
+
readonly MANAGE_TEAM: Permission;
|
|
1870
|
+
readonly READ_TEAM: Permission;
|
|
1871
|
+
readonly CREATE_TEAM: Permission;
|
|
1872
|
+
readonly UPDATE_TEAM: Permission;
|
|
1873
|
+
readonly DELETE_TEAM: Permission;
|
|
1874
|
+
readonly MANAGE_TEAM_MEMBERS: Permission;
|
|
1875
|
+
readonly READ_TEAM_MEMBERS: Permission;
|
|
1876
|
+
readonly CREATE_TEAM_MEMBERS: Permission;
|
|
1877
|
+
readonly UPDATE_TEAM_MEMBERS: Permission;
|
|
1878
|
+
readonly DELETE_TEAM_MEMBERS: Permission;
|
|
1879
|
+
readonly MANAGE_EVENT_CONTENT: Permission;
|
|
1880
|
+
readonly READ_EVENT_CONTENT: Permission;
|
|
1881
|
+
readonly CREATE_EVENT_CONTENT: Permission;
|
|
1882
|
+
readonly UPDATE_EVENT_CONTENT: Permission;
|
|
1883
|
+
readonly DELETE_EVENT_CONTENT: Permission;
|
|
1884
|
+
readonly MANAGE_EVENT_SETTINGS: Permission;
|
|
1885
|
+
readonly READ_EVENT_SETTINGS: Permission;
|
|
1886
|
+
readonly UPDATE_EVENT_SETTINGS: Permission;
|
|
1887
|
+
readonly MANAGE_ORGANISATION: Permission;
|
|
1888
|
+
readonly READ_ORGANISATION: Permission;
|
|
1889
|
+
readonly UPDATE_ORGANISATION: Permission;
|
|
1890
|
+
readonly MANAGE_USERS: Permission;
|
|
1891
|
+
readonly READ_USERS: Permission;
|
|
1892
|
+
readonly CREATE_USERS: Permission;
|
|
1893
|
+
readonly UPDATE_USERS: Permission;
|
|
1894
|
+
readonly DELETE_USERS: Permission;
|
|
1895
|
+
readonly MANAGE_ROLES: Permission;
|
|
1896
|
+
readonly READ_ROLES: Permission;
|
|
1897
|
+
readonly CREATE_ROLES: Permission;
|
|
1898
|
+
readonly UPDATE_ROLES: Permission;
|
|
1899
|
+
readonly DELETE_ROLES: Permission;
|
|
1900
|
+
readonly MANAGE_EVENTS: Permission;
|
|
1901
|
+
readonly READ_EVENTS: Permission;
|
|
1902
|
+
readonly CREATE_EVENTS: Permission;
|
|
1903
|
+
readonly UPDATE_EVENTS: Permission;
|
|
1904
|
+
readonly DELETE_EVENTS: Permission;
|
|
1905
|
+
readonly MANAGE_APPS: Permission;
|
|
1906
|
+
readonly READ_APPS: Permission;
|
|
1907
|
+
readonly CREATE_APPS: Permission;
|
|
1908
|
+
readonly UPDATE_APPS: Permission;
|
|
1909
|
+
readonly DELETE_APPS: Permission;
|
|
1910
|
+
readonly MANAGE_ALL: Permission;
|
|
1911
|
+
readonly READ_ALL: Permission;
|
|
1912
|
+
readonly CREATE_ALL: Permission;
|
|
1913
|
+
readonly UPDATE_ALL: Permission;
|
|
1914
|
+
readonly DELETE_ALL: Permission;
|
|
1915
|
+
};
|
|
1916
|
+
type AllPermissions = typeof ALL_PERMISSIONS;
|
|
1917
|
+
|
|
1918
|
+
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 };
|