@jmruthers/pace-core 0.6.1 → 0.6.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +88 -10
- package/cursor-rules/00-pace-core-compliance.mdc +46 -87
- package/cursor-rules/01-standards-compliance.mdc +16 -47
- package/cursor-rules/02-project-structure.mdc +4 -4
- package/cursor-rules/03-solid-principles.mdc +45 -164
- package/cursor-rules/04-testing-standards.mdc +22 -69
- package/cursor-rules/05-bug-reports-and-features.mdc +2 -2
- package/cursor-rules/06-code-quality.mdc +42 -125
- package/cursor-rules/07-tech-stack-compliance.mdc +33 -128
- package/cursor-rules/08-markup-quality.mdc +452 -0
- package/cursor-rules/CHANGELOG.md +18 -0
- package/cursor-rules/README.md +2 -1
- package/dist/{AuthService-DjnJHDtC.d.ts → AuthService-Cb34EQs3.d.ts} +63 -1
- package/dist/{DataTable-CH1U5Tpy.d.ts → DataTable-BMRU8a1j.d.ts} +33 -1
- package/dist/{DataTable-DQ7RSOHE.js → DataTable-THFPBKTP.js} +12 -10
- package/dist/{PublicPageProvider-ce4xlHYA.d.ts → PublicPageProvider-DEMpysFR.d.ts} +394 -171
- package/dist/{UnifiedAuthProvider-185Ih4dj.d.ts → UnifiedAuthProvider-CKvHP1MK.d.ts} +30 -8
- package/dist/{UnifiedAuthProvider-ATAP5UTR.js → UnifiedAuthProvider-KAGUYQ4J.js} +5 -4
- package/dist/{api-N774RPUA.js → api-IAGWF3ZG.js} +10 -10
- package/dist/{audit-B5P6FFIR.js → audit-V53FV5AG.js} +2 -2
- package/dist/{chunk-JBKQ3SAO.js → chunk-2T2IG7T7.js} +107 -57
- package/dist/chunk-2T2IG7T7.js.map +1 -0
- package/dist/{chunk-3QRJFVBR.js → chunk-6SOIHG6Z.js} +1 -1
- package/dist/chunk-6SOIHG6Z.js.map +1 -0
- package/dist/{chunk-3XTALGJF.js → chunk-6Z7LTB3D.js} +69 -240
- package/dist/chunk-6Z7LTB3D.js.map +1 -0
- package/dist/{chunk-4ZC4GX36.js → chunk-CNCQDFLN.js} +199 -46
- package/dist/chunk-CNCQDFLN.js.map +1 -0
- package/dist/chunk-DGUM43GV.js +11 -0
- package/dist/{chunk-BYFSK72L.js → chunk-DWUBLJJM.js} +361 -187
- package/dist/chunk-DWUBLJJM.js.map +1 -0
- package/dist/{chunk-LXQLPRQ2.js → chunk-FFQEQTNW.js} +6 -8
- package/dist/chunk-FFQEQTNW.js.map +1 -0
- package/dist/chunk-FMUCXFII.js +76 -0
- package/dist/chunk-FMUCXFII.js.map +1 -0
- package/dist/{chunk-4N5C5XZU.js → chunk-HFZBI76P.js} +4 -4
- package/dist/chunk-HFZBI76P.js.map +1 -0
- package/dist/{chunk-SQGMNID3.js → chunk-L4OXEN46.js} +4 -5
- package/dist/chunk-L4OXEN46.js.map +1 -0
- package/dist/{chunk-R77UEZ4E.js → chunk-M43Y4SSO.js} +1 -1
- package/dist/chunk-M43Y4SSO.js.map +1 -0
- package/dist/{chunk-I7PSE6JW.js → chunk-M7MPQISP.js} +3 -76
- package/dist/chunk-M7MPQISP.js.map +1 -0
- package/dist/chunk-PQBSKX33.js +7793 -0
- package/dist/chunk-PQBSKX33.js.map +1 -0
- package/dist/chunk-QRPVRXYT.js +226 -0
- package/dist/chunk-QRPVRXYT.js.map +1 -0
- package/dist/{chunk-KNC55RTG.js → chunk-RWEBCB47.js} +194 -416
- package/dist/chunk-RWEBCB47.js.map +1 -0
- package/dist/{chunk-XM25TVIE.js → chunk-YDQHOZNA.js} +843 -388
- package/dist/chunk-YDQHOZNA.js.map +1 -0
- package/dist/{chunk-GLK6VM3F.js → chunk-ZNIWI3UC.js} +739 -737
- package/dist/chunk-ZNIWI3UC.js.map +1 -0
- package/dist/components.d.ts +5 -5
- package/dist/components.js +18 -16
- package/dist/components.js.map +1 -1
- package/dist/contextValidator-3JNZKUTX.js +9 -0
- package/dist/contextValidator-3JNZKUTX.js.map +1 -0
- package/dist/eslint-rules/pace-core-compliance.cjs +106 -0
- package/dist/{functions-D_kgHktt.d.ts → functions-DHebl8-F.d.ts} +1 -1
- package/dist/hooks.d.ts +55 -122
- package/dist/hooks.js +10 -13
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +60 -13
- package/dist/index.js +30 -25
- package/dist/index.js.map +1 -1
- package/dist/providers.d.ts +21 -3
- package/dist/providers.js +4 -3
- package/dist/rbac/index.d.ts +210 -139
- package/dist/rbac/index.js +17 -13
- package/dist/styles/index.js +1 -1
- package/dist/theming/runtime.d.ts +1 -13
- package/dist/theming/runtime.js +2 -2
- package/dist/{timezone-_pgH8qrY.d.ts → timezone-CHhWg6b4.d.ts} +3 -10
- package/dist/{types-UU913iLA.d.ts → types-BeoeWV5I.d.ts} +8 -0
- package/dist/{types-CEpcvwwF.d.ts → types-CkbwOr4Y.d.ts} +6 -0
- package/dist/types.d.ts +2 -2
- package/dist/types.js +1 -1
- package/dist/{usePublicRouteParams-BJAlWfuJ.d.ts → usePublicRouteParams-i3qtoBgg.d.ts} +38 -17
- package/dist/utils.d.ts +4 -5
- package/dist/utils.js +17 -19
- package/dist/utils.js.map +1 -1
- package/docs/api/README.md +21 -17
- package/docs/api/modules.md +4191 -2967
- package/docs/architecture/database-schema-requirements.md +161 -0
- package/docs/components/context-selector.md +126 -0
- package/docs/core-concepts/rbac-system.md +3 -3
- package/docs/documentation-index.md +2 -4
- package/docs/getting-started/cursor-rules.md +2 -1
- package/docs/migration/DOCUMENTATION_STRUCTURE.md +441 -0
- package/docs/migration/MIGRATION_GUIDE.md +2 -24
- package/docs/migration/RBAC_SCOPE_MIGRATION.md +385 -0
- package/docs/migration/README.md +52 -6
- package/docs/migration/V0.5.190_TO_V0.6.1_MIGRATION.md +1153 -0
- package/docs/migration/database-changes-december-2025.md +3 -3
- package/docs/pace-mint-fix-auto-selection.md +218 -0
- package/docs/pace-mint-rbac-setup.md +391 -0
- package/docs/rbac/event-based-apps.md +1 -1
- package/docs/rbac/getting-started.md +1 -1
- package/docs/rbac/quick-start.md +1 -1
- package/docs/rbac/secure-client-protection.md +330 -0
- package/docs/standards/README.md +1 -0
- package/package.json +4 -3
- package/scripts/audit/core/checks/accessibility.cjs +197 -0
- package/scripts/audit/core/checks/api-usage.cjs +191 -0
- package/scripts/audit/core/checks/bundle.cjs +142 -0
- package/scripts/{check-pace-core-compliance.cjs → audit/core/checks/compliance.cjs} +784 -685
- package/scripts/audit/core/checks/config.cjs +54 -0
- package/scripts/audit/core/checks/coverage.cjs +84 -0
- package/scripts/audit/core/checks/dependencies.cjs +985 -0
- package/scripts/audit/core/checks/documentation.cjs +268 -0
- package/scripts/audit/core/checks/environment.cjs +116 -0
- package/scripts/audit/core/checks/error-handling.cjs +340 -0
- package/scripts/audit/core/checks/forms.cjs +172 -0
- package/scripts/audit/core/checks/heuristics.cjs +68 -0
- package/scripts/audit/core/checks/hooks.cjs +334 -0
- package/scripts/audit/core/checks/imports.cjs +244 -0
- package/scripts/audit/core/checks/performance.cjs +325 -0
- package/scripts/audit/core/checks/routes.cjs +117 -0
- package/scripts/audit/core/checks/state.cjs +130 -0
- package/scripts/audit/core/checks/structure.cjs +65 -0
- package/scripts/audit/core/checks/style.cjs +584 -0
- package/scripts/audit/core/checks/testing.cjs +122 -0
- package/scripts/audit/core/checks/typescript.cjs +61 -0
- package/scripts/audit/core/scanner.cjs +199 -0
- package/scripts/audit/core/utils.cjs +137 -0
- package/scripts/audit/index.cjs +223 -0
- package/scripts/audit/reporters/console.cjs +151 -0
- package/scripts/audit/reporters/json.cjs +54 -0
- package/scripts/audit/reporters/markdown.cjs +124 -0
- package/scripts/audit-consuming-app.cjs +61 -936
- package/scripts/build-docs/build-decision.js +240 -0
- package/scripts/build-docs/cache-utils.js +105 -0
- package/scripts/build-docs/content-normalization.js +150 -0
- package/scripts/build-docs/file-utils.js +105 -0
- package/scripts/build-docs/git-utils.js +86 -0
- package/scripts/build-docs/hash-utils.js +116 -0
- package/scripts/build-docs/typedoc-runner.js +220 -0
- package/scripts/build-docs-incremental.js +77 -913
- package/scripts/utils/command-runner.js +16 -11
- package/scripts/validate-formats.js +61 -56
- package/scripts/validate-master.js +74 -69
- package/scripts/validate-pre-publish.js +70 -65
- package/src/__tests__/hooks/usePermissions.test.ts +2 -2
- package/src/components/Alert/Alert.test.tsx +12 -18
- package/src/components/Alert/Alert.tsx +5 -7
- package/src/components/Avatar/Avatar.test.tsx +4 -4
- package/src/components/Badge/Badge.tsx +14 -0
- package/src/components/Button/Button.tsx +22 -0
- package/src/components/Calendar/Calendar.tsx +8 -2
- package/src/components/Card/Card.tsx +4 -0
- package/src/components/Checkbox/Checkbox.test.tsx +12 -12
- package/src/components/Checkbox/Checkbox.tsx +2 -2
- package/src/components/ContextSelector/ContextSelector.tsx +384 -0
- package/src/components/ContextSelector/index.ts +3 -0
- package/src/components/DataTable/DataTable.tsx +38 -4
- package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +5 -6
- package/src/components/DataTable/__tests__/pagination.modes.test.tsx +18 -4
- package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +2 -3
- package/src/components/DataTable/components/AccessDeniedPage.tsx +16 -25
- package/src/components/DataTable/components/ActionButtons.tsx +10 -7
- package/src/components/DataTable/components/BulkOperationsDropdown.tsx +1 -1
- package/src/components/DataTable/components/ColumnFilter.tsx +10 -0
- package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +12 -0
- package/src/components/DataTable/components/DataTableBody.tsx +8 -0
- package/src/components/DataTable/components/DataTableCore.tsx +196 -554
- package/src/components/DataTable/components/DataTableErrorBoundary.tsx +11 -0
- package/src/components/DataTable/components/DataTableLayout.tsx +559 -0
- package/src/components/DataTable/components/DataTableModals.tsx +8 -0
- package/src/components/DataTable/components/DataTableToolbar.tsx +8 -0
- package/src/components/DataTable/components/DraggableColumnHeader.tsx +12 -0
- package/src/components/DataTable/components/EditFields.tsx +307 -0
- package/src/components/DataTable/components/EditableRow.tsx +8 -0
- package/src/components/DataTable/components/EmptyState.tsx +10 -0
- package/src/components/DataTable/components/FilterRow.tsx +12 -0
- package/src/components/DataTable/components/GroupHeader.tsx +12 -0
- package/src/components/DataTable/components/GroupingDropdown.tsx +12 -0
- package/src/components/DataTable/components/ImportModal.tsx +7 -0
- package/src/components/DataTable/components/LoadingState.tsx +6 -0
- package/src/components/DataTable/components/PaginationControls.tsx +16 -1
- package/src/components/DataTable/components/RowComponent.tsx +391 -0
- package/src/components/DataTable/components/UnifiedTableBody.tsx +63 -851
- package/src/components/DataTable/components/VirtualizedDataTable.tsx +16 -4
- package/src/components/DataTable/components/__tests__/AccessDeniedPage.test.tsx +4 -2
- package/src/components/DataTable/components/cellValueUtils.ts +40 -0
- package/src/components/DataTable/components/hooks/useImportModalFocus.ts +53 -0
- package/src/components/DataTable/components/hooks/usePermissionTracking.ts +126 -0
- package/src/components/DataTable/context/DataTableContext.tsx +50 -0
- package/src/components/DataTable/core/ColumnFactory.ts +31 -0
- package/src/components/DataTable/core/DataTableContext.tsx +32 -1
- package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +10 -0
- package/src/components/DataTable/hooks/useColumnReordering.ts +12 -0
- package/src/components/DataTable/hooks/useColumnVisibilityPersistence.ts +10 -0
- package/src/components/DataTable/hooks/useDataTableDataPipeline.ts +16 -0
- package/src/components/DataTable/hooks/useDataTablePermissions.ts +127 -33
- package/src/components/DataTable/hooks/useDataTableState.ts +35 -1
- package/src/components/DataTable/hooks/useEffectiveColumnOrder.ts +12 -0
- package/src/components/DataTable/hooks/useServerSideDataEffect.ts +11 -0
- package/src/components/DataTable/hooks/useTableColumns.ts +8 -0
- package/src/components/DataTable/hooks/useTableHandlers.ts +14 -0
- package/src/components/DataTable/styles.ts +6 -6
- package/src/components/DataTable/types.ts +6 -10
- package/src/components/DataTable/utils/a11yUtils.ts +7 -0
- package/src/components/DataTable/utils/debugTools.ts +18 -113
- package/src/components/DataTable/utils/errorHandling.ts +12 -0
- package/src/components/DataTable/utils/exportUtils.ts +9 -0
- package/src/components/DataTable/utils/flexibleImport.ts +12 -48
- package/src/components/DataTable/utils/paginationUtils.ts +8 -0
- package/src/components/DataTable/utils/performanceUtils.ts +5 -1
- package/src/components/Dialog/Dialog.tsx +31 -3
- package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +180 -1
- package/src/components/ErrorBoundary/ErrorBoundary.tsx +45 -5
- package/src/components/ErrorBoundary/ErrorBoundaryContext.tsx +129 -0
- package/src/components/ErrorBoundary/index.ts +27 -2
- package/src/components/FileDisplay/FileDisplay.tsx +74 -28
- package/src/components/FileUpload/FileUpload.tsx +22 -2
- package/src/components/Footer/Footer.test.tsx +16 -16
- package/src/components/Footer/Footer.tsx +14 -11
- package/src/components/Form/Form.tsx +1 -0
- package/src/components/Header/Header.test.tsx +43 -73
- package/src/components/Header/Header.tsx +59 -49
- package/src/components/Input/Input.test.tsx +2 -2
- package/src/components/Input/Input.tsx +8 -4
- package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +4 -4
- package/src/components/LoginForm/LoginForm.tsx +4 -0
- package/src/components/NavigationMenu/NavigationMenu.tsx +14 -513
- package/src/components/NavigationMenu/types.ts +56 -0
- package/src/components/NavigationMenu/useNavigationFiltering.ts +390 -0
- package/src/components/PaceAppLayout/PaceAppLayout.integration.test.tsx +10 -19
- package/src/components/PaceAppLayout/PaceAppLayout.performance.test.tsx +2 -2
- package/src/components/PaceAppLayout/PaceAppLayout.security.test.tsx +5 -5
- package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +13 -11
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +167 -44
- package/src/components/PaceAppLayout/README.md +14 -17
- package/src/components/PaceAppLayout/test-setup.tsx +3 -4
- package/src/components/PaceLoginPage/PaceLoginPage.tsx +3 -0
- package/src/components/PasswordChange/PasswordChangeForm.tsx +9 -0
- package/src/components/ProtectedRoute/ProtectedRoute.tsx +3 -9
- package/src/components/PublicLayout/PublicPageLayout.tsx +2 -5
- package/src/components/PublicLayout/PublicPageProvider.tsx +4 -0
- package/src/components/Select/Select.tsx +80 -434
- package/src/components/Select/context.ts +23 -0
- package/src/components/Select/hooks/useSelectEvents.ts +87 -0
- package/src/components/Select/hooks/useSelectSearch.ts +91 -0
- package/src/components/Select/hooks/useSelectState.ts +104 -0
- package/src/components/Select/index.ts +9 -1
- package/src/components/Select/types.ts +123 -0
- package/src/components/Select/utils/text.ts +26 -0
- package/src/components/SessionRestorationLoader/SessionRestorationLoader.tsx +4 -5
- package/src/components/Switch/Switch.tsx +4 -4
- package/src/components/Tabs/Tabs.tsx +1 -1
- package/src/components/Toast/Toast.tsx +4 -0
- package/src/components/Tooltip/Tooltip.tsx +2 -2
- package/src/components/UserMenu/UserMenu.test.tsx +24 -11
- package/src/components/UserMenu/UserMenu.tsx +21 -18
- package/src/components/index.ts +7 -7
- package/src/eslint-rules/pace-core-compliance.cjs +106 -0
- package/src/hooks/__tests__/index.unit.test.ts +2 -5
- package/src/hooks/__tests__/useAppConfig.unit.test.ts +4 -98
- package/src/hooks/index.ts +1 -2
- package/src/hooks/public/usePublicEvent.ts +4 -0
- package/src/hooks/public/usePublicEventLogo.ts +4 -0
- package/src/hooks/public/usePublicFileDisplay.ts +4 -0
- package/src/hooks/public/usePublicRouteParams.ts +4 -0
- package/src/hooks/services/useAuth.ts +32 -0
- package/src/hooks/services/useCurrentEvent.ts +6 -0
- package/src/hooks/services/useCurrentOrganisation.ts +6 -0
- package/src/hooks/useAppConfig.ts +15 -30
- package/src/hooks/useDebounce.ts +9 -0
- package/src/hooks/useEventTheme.ts +6 -0
- package/src/hooks/useFileDisplay.ts +81 -50
- package/src/hooks/useFileReference.ts +25 -7
- package/src/hooks/useFileUrl.ts +11 -1
- package/src/hooks/useFocusManagement.ts +14 -0
- package/src/hooks/useFocusTrap.ts +3 -0
- package/src/hooks/useInactivityTracker.ts +3 -0
- package/src/hooks/useKeyboardShortcuts.ts +4 -0
- package/src/hooks/useOrganisationPermissions.ts +4 -0
- package/src/hooks/useOrganisationSecurity.ts +4 -0
- package/src/hooks/usePerformanceMonitor.ts +4 -0
- package/src/hooks/usePermissionCache.ts +7 -0
- package/src/hooks/useQueryCache.ts +12 -1
- package/src/hooks/useSessionRestoration.ts +4 -0
- package/src/hooks/useStorage.ts +4 -0
- package/src/hooks/useToast.ts +1 -1
- package/src/index.ts +6 -6
- package/src/providers/__tests__/OrganisationProvider.test.tsx +92 -70
- package/src/providers/services/AuthServiceProvider.tsx +35 -7
- package/src/providers/services/EventServiceProvider.tsx +51 -5
- package/src/providers/services/InactivityServiceProvider.tsx +18 -0
- package/src/providers/services/OrganisationServiceProvider.tsx +18 -0
- package/src/providers/services/UnifiedAuthProvider.tsx +126 -134
- package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +29 -13
- package/src/rbac/README.md +1 -1
- package/src/rbac/__tests__/adapters.comprehensive.test.tsx +1 -1
- package/src/rbac/__tests__/scenarios.user-role.test.tsx +4 -5
- package/src/rbac/adapters.tsx +12 -3
- package/src/rbac/api.test.ts +59 -51
- package/src/rbac/api.ts +246 -167
- package/src/rbac/components/NavigationProvider.tsx +4 -1
- package/src/rbac/components/PagePermissionGuard.tsx +185 -17
- package/src/rbac/components/RoleBasedRouter.tsx +5 -1
- package/src/rbac/components/SecureDataProvider.test.tsx +84 -49
- package/src/rbac/components/SecureDataProvider.tsx +20 -5
- package/src/rbac/components/__tests__/PagePermissionGuard.race-condition.test.tsx +24 -14
- package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +7 -0
- package/src/rbac/components/__tests__/PagePermissionGuard.verification.test.tsx +14 -6
- package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +15 -4
- package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +148 -24
- package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +81 -15
- package/src/rbac/engine.ts +38 -14
- package/src/rbac/hooks/__tests__/useSecureSupabase.test.ts +32 -21
- package/src/rbac/hooks/permissions/index.ts +7 -0
- package/src/rbac/hooks/permissions/useAccessLevel.ts +105 -0
- package/src/rbac/hooks/permissions/useCachedPermissions.ts +79 -0
- package/src/rbac/hooks/permissions/useCan.ts +377 -0
- package/src/rbac/hooks/permissions/useHasAllPermissions.ts +90 -0
- package/src/rbac/hooks/permissions/useHasAnyPermission.ts +90 -0
- package/src/rbac/hooks/permissions/useMultiplePermissions.ts +93 -0
- package/src/rbac/hooks/permissions/usePermissions.ts +253 -0
- package/src/rbac/hooks/useCan.test.ts +64 -66
- package/src/rbac/hooks/usePermissions.ts +14 -995
- package/src/rbac/hooks/useRBAC.test.ts +1 -5
- package/src/rbac/hooks/useRBAC.ts +36 -37
- package/src/rbac/hooks/useResolvedScope.test.ts +120 -35
- package/src/rbac/hooks/useResolvedScope.ts +35 -40
- package/src/rbac/hooks/useResourcePermissions.test.ts +54 -18
- package/src/rbac/hooks/useResourcePermissions.ts +14 -4
- package/src/rbac/hooks/useSecureSupabase.ts +27 -7
- package/src/rbac/index.ts +7 -0
- package/src/rbac/permissions.ts +0 -30
- package/src/rbac/secureClient.test.ts +22 -18
- package/src/rbac/secureClient.ts +294 -68
- package/src/rbac/security.ts +0 -17
- package/src/rbac/types.ts +9 -0
- package/src/rbac/utils/__tests__/contextValidator.test.ts +64 -86
- package/src/rbac/utils/clientSecurity.ts +93 -0
- package/src/rbac/utils/contextValidator.ts +77 -168
- package/src/services/AuthService.ts +39 -7
- package/src/services/EventService.ts +186 -54
- package/src/services/OrganisationService.ts +81 -14
- package/src/services/__tests__/EventService.test.ts +1 -2
- package/src/services/base/BaseService.ts +3 -0
- package/src/theming/__tests__/parseEventColours.test.ts +6 -9
- package/src/theming/parseEventColours.ts +5 -19
- package/src/types/vitest-globals.d.ts +51 -26
- package/src/utils/__mocks__/supabaseMock.ts +1 -3
- package/src/utils/__tests__/formatting.unit.test.ts +4 -4
- package/src/utils/__tests__/index.unit.test.ts +2 -2
- package/src/utils/audit/audit.ts +0 -3
- package/src/utils/core/cn.ts +1 -1
- package/src/utils/dynamic/dynamicUtils.ts +7 -4
- package/src/utils/file-reference/index.ts +53 -1
- package/src/utils/formatting/formatting.ts +8 -18
- package/src/utils/index.ts +0 -1
- package/dist/chunk-3QRJFVBR.js.map +0 -1
- package/dist/chunk-3XTALGJF.js.map +0 -1
- package/dist/chunk-4N5C5XZU.js.map +0 -1
- package/dist/chunk-4ZC4GX36.js.map +0 -1
- package/dist/chunk-7D4SUZUM.js +0 -38
- package/dist/chunk-BYFSK72L.js.map +0 -1
- package/dist/chunk-EXUD6RNJ.js +0 -451
- package/dist/chunk-EXUD6RNJ.js.map +0 -1
- package/dist/chunk-GLK6VM3F.js.map +0 -1
- package/dist/chunk-I7PSE6JW.js.map +0 -1
- package/dist/chunk-JBKQ3SAO.js.map +0 -1
- package/dist/chunk-KNC55RTG.js.map +0 -1
- package/dist/chunk-LXQLPRQ2.js.map +0 -1
- package/dist/chunk-R77UEZ4E.js.map +0 -1
- package/dist/chunk-SQGMNID3.js.map +0 -1
- package/dist/chunk-T33XF5ZC.js +0 -12922
- package/dist/chunk-T33XF5ZC.js.map +0 -1
- package/dist/chunk-XM25TVIE.js.map +0 -1
- package/docs/api/classes/ColumnFactory.md +0 -243
- package/docs/api/classes/ErrorBoundary.md +0 -144
- package/docs/api/classes/InvalidScopeError.md +0 -73
- package/docs/api/classes/Logger.md +0 -178
- package/docs/api/classes/MissingUserContextError.md +0 -66
- package/docs/api/classes/OrganisationContextRequiredError.md +0 -66
- package/docs/api/classes/PermissionDeniedError.md +0 -73
- package/docs/api/classes/RBACAuditManager.md +0 -297
- package/docs/api/classes/RBACCache.md +0 -322
- package/docs/api/classes/RBACEngine.md +0 -171
- package/docs/api/classes/RBACError.md +0 -76
- package/docs/api/classes/RBACNotInitializedError.md +0 -66
- package/docs/api/classes/SecureSupabaseClient.md +0 -160
- package/docs/api/classes/StorageUtils.md +0 -328
- package/docs/api/enums/FileCategory.md +0 -184
- package/docs/api/enums/LogLevel.md +0 -54
- package/docs/api/enums/RBACErrorCode.md +0 -228
- package/docs/api/enums/RPCFunction.md +0 -118
- package/docs/api/interfaces/AddressFieldProps.md +0 -241
- package/docs/api/interfaces/AddressFieldRef.md +0 -94
- package/docs/api/interfaces/AggregateConfig.md +0 -43
- package/docs/api/interfaces/AutocompleteOptions.md +0 -75
- package/docs/api/interfaces/AvatarProps.md +0 -128
- package/docs/api/interfaces/BadgeProps.md +0 -27
- package/docs/api/interfaces/ButtonProps.md +0 -53
- package/docs/api/interfaces/CalendarProps.md +0 -70
- package/docs/api/interfaces/CardProps.md +0 -66
- package/docs/api/interfaces/ColorPalette.md +0 -7
- package/docs/api/interfaces/ColorShade.md +0 -66
- package/docs/api/interfaces/ComplianceResult.md +0 -30
- package/docs/api/interfaces/DataAccessRecord.md +0 -96
- package/docs/api/interfaces/DataRecord.md +0 -11
- package/docs/api/interfaces/DataTableAction.md +0 -249
- package/docs/api/interfaces/DataTableColumn.md +0 -504
- package/docs/api/interfaces/DataTableProps.md +0 -625
- package/docs/api/interfaces/DataTableToolbarButton.md +0 -96
- package/docs/api/interfaces/DatabaseComplianceResult.md +0 -85
- package/docs/api/interfaces/DatabaseIssue.md +0 -41
- package/docs/api/interfaces/EmptyStateConfig.md +0 -61
- package/docs/api/interfaces/EnhancedNavigationMenuProps.md +0 -235
- package/docs/api/interfaces/EventAppRoleData.md +0 -71
- package/docs/api/interfaces/ExportColumn.md +0 -90
- package/docs/api/interfaces/ExportOptions.md +0 -126
- package/docs/api/interfaces/FileDisplayProps.md +0 -249
- package/docs/api/interfaces/FileMetadata.md +0 -129
- package/docs/api/interfaces/FileReference.md +0 -118
- package/docs/api/interfaces/FileSizeLimits.md +0 -7
- package/docs/api/interfaces/FileUploadOptions.md +0 -139
- package/docs/api/interfaces/FileUploadProps.md +0 -293
- package/docs/api/interfaces/FooterProps.md +0 -105
- package/docs/api/interfaces/FormFieldProps.md +0 -166
- package/docs/api/interfaces/FormProps.md +0 -113
- package/docs/api/interfaces/GrantEventAppRoleParams.md +0 -122
- package/docs/api/interfaces/InactivityWarningModalProps.md +0 -115
- package/docs/api/interfaces/InputProps.md +0 -53
- package/docs/api/interfaces/LabelProps.md +0 -107
- package/docs/api/interfaces/LoggerConfig.md +0 -62
- package/docs/api/interfaces/LoginFormProps.md +0 -184
- package/docs/api/interfaces/NavigationAccessRecord.md +0 -107
- package/docs/api/interfaces/NavigationContextType.md +0 -164
- package/docs/api/interfaces/NavigationGuardProps.md +0 -139
- package/docs/api/interfaces/NavigationItem.md +0 -120
- package/docs/api/interfaces/NavigationMenuProps.md +0 -221
- package/docs/api/interfaces/NavigationProviderProps.md +0 -117
- package/docs/api/interfaces/Organisation.md +0 -140
- package/docs/api/interfaces/OrganisationContextType.md +0 -388
- package/docs/api/interfaces/OrganisationMembership.md +0 -140
- package/docs/api/interfaces/OrganisationProviderProps.md +0 -76
- package/docs/api/interfaces/OrganisationSecurityError.md +0 -62
- package/docs/api/interfaces/PaceAppLayoutProps.md +0 -406
- package/docs/api/interfaces/PaceLoginPageProps.md +0 -47
- package/docs/api/interfaces/PageAccessRecord.md +0 -85
- package/docs/api/interfaces/PagePermissionContextType.md +0 -140
- package/docs/api/interfaces/PagePermissionGuardProps.md +0 -153
- package/docs/api/interfaces/PagePermissionProviderProps.md +0 -119
- package/docs/api/interfaces/PaletteData.md +0 -41
- package/docs/api/interfaces/ParsedAddress.md +0 -120
- package/docs/api/interfaces/PermissionEnforcerProps.md +0 -153
- package/docs/api/interfaces/ProgressProps.md +0 -42
- package/docs/api/interfaces/ProtectedRouteProps.md +0 -97
- package/docs/api/interfaces/PublicPageFooterProps.md +0 -112
- package/docs/api/interfaces/PublicPageHeaderProps.md +0 -125
- package/docs/api/interfaces/PublicPageLayoutProps.md +0 -198
- package/docs/api/interfaces/QuickFix.md +0 -52
- package/docs/api/interfaces/RBACAccessValidateParams.md +0 -52
- package/docs/api/interfaces/RBACAccessValidateResult.md +0 -41
- package/docs/api/interfaces/RBACAuditLogParams.md +0 -85
- package/docs/api/interfaces/RBACAuditLogResult.md +0 -52
- package/docs/api/interfaces/RBACConfig.md +0 -133
- package/docs/api/interfaces/RBACContext.md +0 -52
- package/docs/api/interfaces/RBACLogger.md +0 -112
- package/docs/api/interfaces/RBACPageAccessCheckParams.md +0 -74
- package/docs/api/interfaces/RBACPerformanceMetrics.md +0 -138
- package/docs/api/interfaces/RBACPermissionCheckParams.md +0 -74
- package/docs/api/interfaces/RBACPermissionCheckResult.md +0 -52
- package/docs/api/interfaces/RBACPermissionsGetParams.md +0 -63
- package/docs/api/interfaces/RBACPermissionsGetResult.md +0 -63
- package/docs/api/interfaces/RBACResult.md +0 -58
- package/docs/api/interfaces/RBACRoleGrantParams.md +0 -63
- package/docs/api/interfaces/RBACRoleGrantResult.md +0 -52
- package/docs/api/interfaces/RBACRoleRevokeParams.md +0 -63
- package/docs/api/interfaces/RBACRoleRevokeResult.md +0 -52
- package/docs/api/interfaces/RBACRoleValidateParams.md +0 -52
- package/docs/api/interfaces/RBACRoleValidateResult.md +0 -63
- package/docs/api/interfaces/RBACRolesListParams.md +0 -52
- package/docs/api/interfaces/RBACRolesListResult.md +0 -74
- package/docs/api/interfaces/RBACSessionTrackParams.md +0 -74
- package/docs/api/interfaces/RBACSessionTrackResult.md +0 -52
- package/docs/api/interfaces/ResourcePermissions.md +0 -155
- package/docs/api/interfaces/RevokeEventAppRoleParams.md +0 -100
- package/docs/api/interfaces/RoleBasedRouterContextType.md +0 -151
- package/docs/api/interfaces/RoleBasedRouterProps.md +0 -156
- package/docs/api/interfaces/RoleManagementResult.md +0 -52
- package/docs/api/interfaces/RouteAccessRecord.md +0 -107
- package/docs/api/interfaces/RouteConfig.md +0 -134
- package/docs/api/interfaces/RuntimeComplianceResult.md +0 -55
- package/docs/api/interfaces/SecureDataContextType.md +0 -168
- package/docs/api/interfaces/SecureDataProviderProps.md +0 -132
- package/docs/api/interfaces/SessionRestorationLoaderProps.md +0 -34
- package/docs/api/interfaces/SetupIssue.md +0 -41
- package/docs/api/interfaces/StorageConfig.md +0 -41
- package/docs/api/interfaces/StorageFileInfo.md +0 -74
- package/docs/api/interfaces/StorageFileMetadata.md +0 -151
- package/docs/api/interfaces/StorageListOptions.md +0 -99
- package/docs/api/interfaces/StorageListResult.md +0 -41
- package/docs/api/interfaces/StorageUploadOptions.md +0 -101
- package/docs/api/interfaces/StorageUploadResult.md +0 -63
- package/docs/api/interfaces/StorageUrlOptions.md +0 -60
- package/docs/api/interfaces/StyleImport.md +0 -19
- package/docs/api/interfaces/SwitchProps.md +0 -34
- package/docs/api/interfaces/TabsContentProps.md +0 -9
- package/docs/api/interfaces/TabsListProps.md +0 -9
- package/docs/api/interfaces/TabsProps.md +0 -9
- package/docs/api/interfaces/TabsTriggerProps.md +0 -50
- package/docs/api/interfaces/TextareaProps.md +0 -53
- package/docs/api/interfaces/ToastActionElement.md +0 -9
- package/docs/api/interfaces/ToastProps.md +0 -9
- package/docs/api/interfaces/UnifiedAuthContextType.md +0 -820
- package/docs/api/interfaces/UnifiedAuthProviderProps.md +0 -171
- package/docs/api/interfaces/UseFormDialogOptions.md +0 -62
- package/docs/api/interfaces/UseFormDialogReturn.md +0 -117
- package/docs/api/interfaces/UseInactivityTrackerOptions.md +0 -136
- package/docs/api/interfaces/UseInactivityTrackerReturn.md +0 -123
- package/docs/api/interfaces/UsePublicEventLogoOptions.md +0 -87
- package/docs/api/interfaces/UsePublicEventLogoReturn.md +0 -81
- package/docs/api/interfaces/UsePublicEventOptions.md +0 -34
- package/docs/api/interfaces/UsePublicEventReturn.md +0 -68
- package/docs/api/interfaces/UsePublicFileDisplayOptions.md +0 -47
- package/docs/api/interfaces/UsePublicFileDisplayReturn.md +0 -120
- package/docs/api/interfaces/UsePublicRouteParamsReturn.md +0 -94
- package/docs/api/interfaces/UseResolvedScopeOptions.md +0 -47
- package/docs/api/interfaces/UseResolvedScopeReturn.md +0 -47
- package/docs/api/interfaces/UseResourcePermissionsOptions.md +0 -34
- package/docs/api/interfaces/UserEventAccess.md +0 -118
- package/docs/api/interfaces/UserMenuProps.md +0 -86
- package/docs/api/interfaces/UserProfile.md +0 -63
- package/docs/migration/quick-migration-guide.md +0 -356
- package/docs/migration/service-architecture.md +0 -281
- package/src/components/EventSelector/EventSelector.test.tsx +0 -720
- package/src/components/EventSelector/EventSelector.tsx +0 -420
- package/src/components/EventSelector/index.ts +0 -3
- package/src/components/OrganisationSelector/OrganisationSelector.test.tsx +0 -784
- package/src/components/OrganisationSelector/OrganisationSelector.tsx +0 -324
- package/src/components/OrganisationSelector/index.ts +0 -9
- package/src/hooks/__tests__/useSecureDataAccess.unit.test.tsx +0 -680
- package/src/hooks/useSecureDataAccess.test.ts +0 -559
- package/src/hooks/useSecureDataAccess.ts +0 -681
- /package/dist/{DataTable-DQ7RSOHE.js.map → DataTable-THFPBKTP.js.map} +0 -0
- /package/dist/{UnifiedAuthProvider-ATAP5UTR.js.map → UnifiedAuthProvider-KAGUYQ4J.js.map} +0 -0
- /package/dist/{api-N774RPUA.js.map → api-IAGWF3ZG.js.map} +0 -0
- /package/dist/{audit-B5P6FFIR.js.map → audit-V53FV5AG.js.map} +0 -0
- /package/dist/{chunk-7D4SUZUM.js.map → chunk-DGUM43GV.js.map} +0 -0
- /package/docs/migration/{organisation-context-timing-fix.md → V0.3.44_organisation-context-timing-fix.md} +0 -0
- /package/docs/migration/{rbac-migration.md → V0.4.0_rbac-migration.md} +0 -0
- /package/docs/migration/{person-scoped-profiles-migration-guide.md → V0.5.190_person-scoped-profiles-migration-guide.md} +0 -0
- /package/docs/migration/{REACT_19_MIGRATION.md → V0.6.0_REACT_19_MIGRATION.md} +0 -0
package/dist/rbac/index.d.ts
CHANGED
|
@@ -1,31 +1,12 @@
|
|
|
1
|
-
import { U as UUID, g as PermissionCacheKey, h as AuditEventSource, i as RBACAuditEvent, a as PermissionCheck, S as Scope, A as AccessLevel, b as PermissionMap, j as RBACAppContext, k as RBACRoleContext, P as Permission, l as UserRBACContext } from '../types-
|
|
2
|
-
export { E as EventAppRole, G as GlobalRole, I as InvalidScopeError, M as MissingUserContextError, O as Operation, e as OrganisationContextRequiredError, c as OrganisationRole, d as PermissionDeniedError, R as RBACError, f as RBACNotInitializedError } from '../types-
|
|
3
|
-
export { A as AccessLevelContext, s as AuditEventType, P as PermissionSource, d as RBACAccessValidateParams, e as RBACAccessValidateResult, q as RBACAuditLogParams, r as RBACAuditLogResult, t as RBACContext, w as RBACErrorCode, v as RBACFunctionResponse, f as RBACPageAccessCheckParams, R as RBACPermissionCheckParams, a as RBACPermissionCheckResult, b as RBACPermissionsGetParams, c as RBACPermissionsGetResult, u as RBACResult, g as RBACRoleGrantParams, h as RBACRoleGrantResult, i as RBACRoleRevokeParams, j as RBACRoleRevokeResult, m as RBACRoleValidateParams, n as RBACRoleValidateResult, k as RBACRolesListParams, l as RBACRolesListResult, o as RBACSessionTrackParams, p as RBACSessionTrackResult, x as RPCFunction, S as SessionType } from '../functions-
|
|
1
|
+
import { U as UUID, g as PermissionCacheKey, h as AuditEventSource, i as RBACAuditEvent, a as PermissionCheck, S as Scope, A as AccessLevel, b as PermissionMap, j as RBACAppContext, k as RBACRoleContext, P as Permission, l as UserRBACContext } from '../types-BeoeWV5I.js';
|
|
2
|
+
export { E as EventAppRole, G as GlobalRole, I as InvalidScopeError, M as MissingUserContextError, O as Operation, e as OrganisationContextRequiredError, c as OrganisationRole, d as PermissionDeniedError, R as RBACError, f as RBACNotInitializedError } from '../types-BeoeWV5I.js';
|
|
3
|
+
export { A as AccessLevelContext, s as AuditEventType, P as PermissionSource, d as RBACAccessValidateParams, e as RBACAccessValidateResult, q as RBACAuditLogParams, r as RBACAuditLogResult, t as RBACContext, w as RBACErrorCode, v as RBACFunctionResponse, f as RBACPageAccessCheckParams, R as RBACPermissionCheckParams, a as RBACPermissionCheckResult, b as RBACPermissionsGetParams, c as RBACPermissionsGetResult, u as RBACResult, g as RBACRoleGrantParams, h as RBACRoleGrantResult, i as RBACRoleRevokeParams, j as RBACRoleRevokeResult, m as RBACRoleValidateParams, n as RBACRoleValidateResult, k as RBACRolesListParams, l as RBACRolesListResult, o as RBACSessionTrackParams, p as RBACSessionTrackResult, x as RPCFunction, S as SessionType } from '../functions-DHebl8-F.js';
|
|
4
4
|
import { SupabaseClient } from '@supabase/supabase-js';
|
|
5
5
|
import { D as Database } from '../database.generated-CzIvgcPu.js';
|
|
6
6
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
7
7
|
import React__default, { ReactNode } from 'react';
|
|
8
8
|
import '../core-CUElvH_C.js';
|
|
9
9
|
|
|
10
|
-
/**
|
|
11
|
-
* Context Validator for RBAC
|
|
12
|
-
* @package @jmruthers/pace-core
|
|
13
|
-
* @module RBAC/ContextValidator
|
|
14
|
-
* @since 1.0.0
|
|
15
|
-
*
|
|
16
|
-
* Centralized validation for RBAC context requirements based on app configuration.
|
|
17
|
-
* Enforces app-specific context rules with single primary context:
|
|
18
|
-
* - requires_event = TRUE: Event is PRIMARY context, org derived from event (org not required in input)
|
|
19
|
-
* - requires_event = FALSE: Organisation is PRIMARY context, event optional
|
|
20
|
-
* - PORTAL/ADMIN apps: Both contexts optional (allows users to view/edit own profiles, super admin access)
|
|
21
|
-
*
|
|
22
|
-
* Key principle: Only one primary context is required based on app config. The other is derived or optional.
|
|
23
|
-
*/
|
|
24
|
-
|
|
25
|
-
interface AppConfig {
|
|
26
|
-
requires_event: boolean;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
10
|
/**
|
|
30
11
|
* RBAC Security Enhancements
|
|
31
12
|
* @package @jmruthers/pace-core
|
|
@@ -122,8 +103,10 @@ declare function isDevelopmentMode(): boolean;
|
|
|
122
103
|
* This client automatically injects organisation context into all requests
|
|
123
104
|
* and prevents queries that don't have the required context.
|
|
124
105
|
*
|
|
125
|
-
* Note:
|
|
126
|
-
*
|
|
106
|
+
* Note: For non-super-admins, organisationId is required. Super-admins can operate
|
|
107
|
+
* without organisationId to access system-wide tables (like core_organisations).
|
|
108
|
+
* Callers should derive organisationId from eventId before creating this client
|
|
109
|
+
* if working with event-required apps.
|
|
127
110
|
*/
|
|
128
111
|
declare class SecureSupabaseClient {
|
|
129
112
|
private supabase;
|
|
@@ -134,7 +117,20 @@ declare class SecureSupabaseClient {
|
|
|
134
117
|
private eventId?;
|
|
135
118
|
private appId?;
|
|
136
119
|
private isSuperAdmin;
|
|
137
|
-
|
|
120
|
+
private usesExistingClient;
|
|
121
|
+
private static rpcSignatureCache;
|
|
122
|
+
/**
|
|
123
|
+
* RPC functions that are safe to call without organisation context.
|
|
124
|
+
*
|
|
125
|
+
* These functions must:
|
|
126
|
+
* - rely on JWT context (auth.uid()) for authentication
|
|
127
|
+
* - not read or write organisation-scoped data
|
|
128
|
+
*
|
|
129
|
+
* This allowlist enables compliant consuming apps to use `secureSupabase.rpc(...)`
|
|
130
|
+
* even before an organisation is selected (common during initial page load/refresh).
|
|
131
|
+
*/
|
|
132
|
+
private static readonly GLOBAL_RPC_ALLOWLIST;
|
|
133
|
+
constructor(supabaseUrl: string, supabaseKey: string, organisationId: UUID | null, eventId?: string, appId?: UUID, isSuperAdmin?: boolean, existingClient?: SupabaseClient<Database>);
|
|
138
134
|
/**
|
|
139
135
|
* Setup context injection for all database operations
|
|
140
136
|
*/
|
|
@@ -170,18 +166,36 @@ declare class SecureSupabaseClient {
|
|
|
170
166
|
* - Super admins: No org filter (see all users) - RLS will allow access
|
|
171
167
|
* - Non-super-admins: Apply org filter as defense in depth - RLS will also filter
|
|
172
168
|
*
|
|
169
|
+
* For system-wide tables (like core_organisations):
|
|
170
|
+
* - Super admins: No org filter (see all records) - RLS will allow access
|
|
171
|
+
* - Non-super-admins: Apply org filter as defense in depth - RLS will also filter
|
|
172
|
+
*
|
|
173
173
|
* For other tables:
|
|
174
174
|
* - Always apply org filter unless super admin bypasses it
|
|
175
175
|
*/
|
|
176
176
|
private addOrganisationFilter;
|
|
177
177
|
/**
|
|
178
178
|
* Validate that required context is present
|
|
179
|
+
* Super-admins can operate without organisation context
|
|
179
180
|
*/
|
|
180
181
|
private validateContext;
|
|
182
|
+
/**
|
|
183
|
+
* Determine whether a table requires organisation context.
|
|
184
|
+
* Tables without an organisation_id column (or global configuration tables) are safe without org context.
|
|
185
|
+
*/
|
|
186
|
+
private tableRequiresOrganisationContext;
|
|
187
|
+
/**
|
|
188
|
+
* Validate context for a specific table operation.
|
|
189
|
+
*/
|
|
190
|
+
private validateContextForTable;
|
|
191
|
+
/**
|
|
192
|
+
* Validate context for a specific RPC call.
|
|
193
|
+
*/
|
|
194
|
+
private validateContextForRpc;
|
|
181
195
|
/**
|
|
182
196
|
* Get the current organisation ID
|
|
183
197
|
*/
|
|
184
|
-
getOrganisationId(): UUID;
|
|
198
|
+
getOrganisationId(): UUID | null;
|
|
185
199
|
/**
|
|
186
200
|
* Get the current event ID
|
|
187
201
|
*/
|
|
@@ -194,7 +208,7 @@ declare class SecureSupabaseClient {
|
|
|
194
208
|
* Create a new client with updated context
|
|
195
209
|
*/
|
|
196
210
|
withContext(updates: {
|
|
197
|
-
organisationId?: UUID;
|
|
211
|
+
organisationId?: UUID | null;
|
|
198
212
|
eventId?: string;
|
|
199
213
|
appId?: UUID;
|
|
200
214
|
isSuperAdmin?: boolean;
|
|
@@ -204,16 +218,28 @@ declare class SecureSupabaseClient {
|
|
|
204
218
|
* @internal
|
|
205
219
|
*/
|
|
206
220
|
getClient(): SupabaseClient<Database>;
|
|
221
|
+
/**
|
|
222
|
+
* Get the set of parameter names that an RPC function accepts.
|
|
223
|
+
* Uses a static whitelist of RPCs that we know accept context parameters.
|
|
224
|
+
*
|
|
225
|
+
* This is an opt-in approach: by default, we don't inject context unless
|
|
226
|
+
* the function is explicitly whitelisted. This prevents PGRST202 errors from
|
|
227
|
+
* injecting unexpected parameters.
|
|
228
|
+
*
|
|
229
|
+
* @param fn - The RPC function name
|
|
230
|
+
* @returns Set of parameter names the function accepts
|
|
231
|
+
*/
|
|
232
|
+
private getRpcAcceptedParams;
|
|
207
233
|
}
|
|
208
234
|
/**
|
|
209
235
|
* Create a secure Supabase client with organisation context
|
|
210
236
|
*
|
|
211
237
|
* @param supabaseUrl - Supabase project URL
|
|
212
238
|
* @param supabaseKey - Supabase publishable key or anon key (accepts both legacy anon keys and modern publishable keys)
|
|
213
|
-
* @param organisationId -
|
|
239
|
+
* @param organisationId - Organisation ID (optional for super-admins)
|
|
214
240
|
* @param eventId - Optional event ID
|
|
215
241
|
* @param appId - Optional app ID
|
|
216
|
-
* @param isSuperAdmin - Optional super admin flag (defaults to false)
|
|
242
|
+
* @param isSuperAdmin - Optional super admin flag (defaults to false). When true, organisationId can be null.
|
|
217
243
|
* @returns SecureSupabaseClient instance
|
|
218
244
|
*
|
|
219
245
|
* @example
|
|
@@ -226,9 +252,19 @@ declare class SecureSupabaseClient {
|
|
|
226
252
|
* 'app-789',
|
|
227
253
|
* false // isSuperAdmin
|
|
228
254
|
* );
|
|
255
|
+
*
|
|
256
|
+
* // For super-admins, organisationId can be null
|
|
257
|
+
* const superAdminClient = createSecureClient(
|
|
258
|
+
* 'https://your-project.supabase.co',
|
|
259
|
+
* 'your-publishable-key-or-anon-key',
|
|
260
|
+
* null, // organisationId not required for super-admins
|
|
261
|
+
* undefined,
|
|
262
|
+
* undefined,
|
|
263
|
+
* true // isSuperAdmin
|
|
264
|
+
* );
|
|
229
265
|
* ```
|
|
230
266
|
*/
|
|
231
|
-
declare function createSecureClient(supabaseUrl: string, supabaseKey: string, organisationId: UUID, eventId?: string, appId?: UUID, isSuperAdmin?: boolean): SecureSupabaseClient;
|
|
267
|
+
declare function createSecureClient(supabaseUrl: string, supabaseKey: string, organisationId: UUID | null, eventId?: string, appId?: UUID, isSuperAdmin?: boolean): SecureSupabaseClient;
|
|
232
268
|
/**
|
|
233
269
|
* Create a secure client from an existing Supabase client
|
|
234
270
|
*
|
|
@@ -238,7 +274,54 @@ declare function createSecureClient(supabaseUrl: string, supabaseKey: string, or
|
|
|
238
274
|
* @param appId - Optional app ID
|
|
239
275
|
* @returns SecureSupabaseClient instance
|
|
240
276
|
*/
|
|
241
|
-
declare function fromSupabaseClient(client: SupabaseClient<Database>, organisationId: UUID, eventId?: string, appId?: UUID): SecureSupabaseClient;
|
|
277
|
+
declare function fromSupabaseClient(client: SupabaseClient<Database>, organisationId: UUID | null, eventId?: string, appId?: UUID, isSuperAdmin?: boolean): SecureSupabaseClient;
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* Client Security Detection Utilities
|
|
281
|
+
* @package @jmruthers/pace-core
|
|
282
|
+
* @module RBAC/Utils/ClientSecurity
|
|
283
|
+
* @since 1.0.0
|
|
284
|
+
*
|
|
285
|
+
* Utilities to detect and warn about insecure Supabase client usage.
|
|
286
|
+
*/
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* Symbol to mark secure clients
|
|
290
|
+
* This is attached to clients created by SecureSupabaseClient
|
|
291
|
+
*/
|
|
292
|
+
declare const SECURE_CLIENT_SYMBOL: unique symbol;
|
|
293
|
+
/**
|
|
294
|
+
* Check if a Supabase client is a secure client (created via useSecureSupabase or createSecureClient)
|
|
295
|
+
*
|
|
296
|
+
* @param client - The Supabase client to check
|
|
297
|
+
* @returns true if the client is secure, false otherwise
|
|
298
|
+
*
|
|
299
|
+
* @example
|
|
300
|
+
* ```tsx
|
|
301
|
+
* import { isSecureClient } from '@jmruthers/pace-core/rbac/utils/clientSecurity';
|
|
302
|
+
*
|
|
303
|
+
* const supabase = useSecureSupabase();
|
|
304
|
+
* if (isSecureClient(supabase)) {
|
|
305
|
+
* // Client is secure, safe to use
|
|
306
|
+
* }
|
|
307
|
+
* ```
|
|
308
|
+
*/
|
|
309
|
+
declare function isSecureClient(client: SupabaseClient<Database> | null | undefined): boolean;
|
|
310
|
+
/**
|
|
311
|
+
* Warn about insecure client usage in development
|
|
312
|
+
*
|
|
313
|
+
* @param client - The client being used
|
|
314
|
+
* @param context - Context about where the client is being used (for better error messages)
|
|
315
|
+
*
|
|
316
|
+
* @example
|
|
317
|
+
* ```tsx
|
|
318
|
+
* import { warnIfInsecureClient } from '@jmruthers/pace-core/rbac/utils/clientSecurity';
|
|
319
|
+
*
|
|
320
|
+
* const supabase = createClient(...); // Wrong!
|
|
321
|
+
* warnIfInsecureClient(supabase, 'MyComponent');
|
|
322
|
+
* ```
|
|
323
|
+
*/
|
|
324
|
+
declare function warnIfInsecureClient(client: SupabaseClient<Database> | null | undefined, context?: string): void;
|
|
242
325
|
|
|
243
326
|
/**
|
|
244
327
|
* RBAC Cache Implementation
|
|
@@ -1376,126 +1459,118 @@ interface ResourcePermissions {
|
|
|
1376
1459
|
declare function useResourcePermissions(resource: string, options?: UseResourcePermissionsOptions): ResourcePermissions;
|
|
1377
1460
|
|
|
1378
1461
|
/**
|
|
1379
|
-
*
|
|
1380
|
-
* @package @jmruthers/pace-core
|
|
1381
|
-
* @module RBAC/Hooks
|
|
1382
|
-
* @since 1.0.0
|
|
1383
|
-
*
|
|
1384
|
-
* This module provides React hooks for RBAC functionality.
|
|
1385
|
-
*/
|
|
1386
|
-
|
|
1387
|
-
/**
|
|
1388
|
-
* Hook to get user's permissions in a scope
|
|
1462
|
+
* Hook to get user's access level in a scope
|
|
1389
1463
|
*
|
|
1390
1464
|
* @param userId - User ID
|
|
1391
|
-
* @param
|
|
1392
|
-
* @
|
|
1393
|
-
* @param appId - Application ID (optional)
|
|
1394
|
-
* @returns Permission state and methods
|
|
1465
|
+
* @param scope - Scope for access level checking
|
|
1466
|
+
* @returns Access level state and methods
|
|
1395
1467
|
*
|
|
1396
1468
|
* @example
|
|
1397
1469
|
* ```tsx
|
|
1398
1470
|
* function MyComponent() {
|
|
1399
|
-
* const {
|
|
1400
|
-
* userId,
|
|
1401
|
-
* organisationId,
|
|
1402
|
-
* eventId,
|
|
1403
|
-
* appId
|
|
1404
|
-
* );
|
|
1471
|
+
* const { accessLevel, isLoading, error } = useAccessLevel(userId, scope);
|
|
1405
1472
|
*
|
|
1406
|
-
* if (isLoading) return <div>Loading...</div>;
|
|
1473
|
+
* if (isLoading) return <div>Loading access level...</div>;
|
|
1407
1474
|
* if (error) return <div>Error: {error.message}</div>;
|
|
1408
1475
|
*
|
|
1409
1476
|
* return (
|
|
1410
1477
|
* <div>
|
|
1411
|
-
*
|
|
1412
|
-
* {
|
|
1478
|
+
* Access Level: {accessLevel}
|
|
1479
|
+
* {accessLevel >= AccessLevel.ADMIN && <AdminPanel />}
|
|
1413
1480
|
* </div>
|
|
1414
1481
|
* );
|
|
1415
1482
|
* }
|
|
1416
1483
|
* ```
|
|
1417
1484
|
*/
|
|
1418
|
-
declare function
|
|
1419
|
-
|
|
1485
|
+
declare function useAccessLevel(userId: UUID, scope: Scope): {
|
|
1486
|
+
accessLevel: AccessLevel;
|
|
1420
1487
|
isLoading: boolean;
|
|
1421
1488
|
error: Error | null;
|
|
1422
|
-
hasPermission: (permission: Permission) => boolean;
|
|
1423
|
-
hasAnyPermission: (permissionList: Permission[]) => boolean;
|
|
1424
|
-
hasAllPermissions: (permissionList: Permission[]) => boolean;
|
|
1425
1489
|
refetch: () => Promise<void>;
|
|
1426
1490
|
};
|
|
1491
|
+
|
|
1427
1492
|
/**
|
|
1428
|
-
* Hook to
|
|
1493
|
+
* Hook to get cached permissions with TTL management
|
|
1429
1494
|
*
|
|
1430
1495
|
* @param userId - User ID
|
|
1431
1496
|
* @param scope - Scope for permission checking
|
|
1432
|
-
* @
|
|
1433
|
-
* @param pageId - Optional page ID
|
|
1434
|
-
* @param useCache - Whether to use cached results
|
|
1435
|
-
* @param appName - Optional app name (for PORTAL/ADMIN special case)
|
|
1436
|
-
* @returns Permission check state and methods
|
|
1497
|
+
* @returns Cached permission state and methods
|
|
1437
1498
|
*
|
|
1438
1499
|
* @example
|
|
1439
1500
|
* ```tsx
|
|
1440
1501
|
* function MyComponent() {
|
|
1441
|
-
* const {
|
|
1502
|
+
* const { permissions, isLoading, error, invalidateCache } = useCachedPermissions(userId, scope);
|
|
1442
1503
|
*
|
|
1443
|
-
* if (isLoading) return <div>
|
|
1504
|
+
* if (isLoading) return <div>Loading cached permissions...</div>;
|
|
1444
1505
|
* if (error) return <div>Error: {error.message}</div>;
|
|
1445
1506
|
*
|
|
1446
|
-
* return
|
|
1507
|
+
* return (
|
|
1508
|
+
* <div>
|
|
1509
|
+
* {permissions['read:users'] && <UserList />}
|
|
1510
|
+
* <button onClick={invalidateCache}>Refresh Permissions</button>
|
|
1511
|
+
* </div>
|
|
1512
|
+
* );
|
|
1447
1513
|
* }
|
|
1448
1514
|
* ```
|
|
1449
1515
|
*/
|
|
1450
|
-
declare function
|
|
1451
|
-
|
|
1516
|
+
declare function useCachedPermissions(userId: UUID, scope: Scope): {
|
|
1517
|
+
permissions: PermissionMap;
|
|
1452
1518
|
isLoading: boolean;
|
|
1453
1519
|
error: Error | null;
|
|
1520
|
+
invalidateCache: () => void;
|
|
1454
1521
|
refetch: () => Promise<void>;
|
|
1455
1522
|
};
|
|
1523
|
+
|
|
1456
1524
|
/**
|
|
1457
|
-
* Hook to
|
|
1525
|
+
* Hook to check if user can perform an action
|
|
1458
1526
|
*
|
|
1459
1527
|
* @param userId - User ID
|
|
1460
|
-
* @param scope - Scope for
|
|
1461
|
-
* @
|
|
1528
|
+
* @param scope - Scope for permission checking
|
|
1529
|
+
* @param permission - Permission to check
|
|
1530
|
+
* @param pageId - Optional page ID
|
|
1531
|
+
* @param useCache - Whether to use cached results
|
|
1532
|
+
* @param appName - Optional app name (for PORTAL/ADMIN special case)
|
|
1533
|
+
* @returns Permission check state and methods
|
|
1462
1534
|
*
|
|
1463
1535
|
* @example
|
|
1464
1536
|
* ```tsx
|
|
1465
1537
|
* function MyComponent() {
|
|
1466
|
-
* const {
|
|
1538
|
+
* const { can, isLoading, error } = useCan(userId, scope, 'read:users');
|
|
1467
1539
|
*
|
|
1468
|
-
* if (isLoading) return <div>
|
|
1540
|
+
* if (isLoading) return <div>Checking permission...</div>;
|
|
1469
1541
|
* if (error) return <div>Error: {error.message}</div>;
|
|
1470
1542
|
*
|
|
1471
|
-
* return
|
|
1472
|
-
* <div>
|
|
1473
|
-
* Access Level: {accessLevel}
|
|
1474
|
-
* {accessLevel >= AccessLevel.ADMIN && <AdminPanel />}
|
|
1475
|
-
* </div>
|
|
1476
|
-
* );
|
|
1543
|
+
* return can ? <UserList /> : <div>Access denied</div>;
|
|
1477
1544
|
* }
|
|
1478
1545
|
* ```
|
|
1479
1546
|
*/
|
|
1480
|
-
declare function
|
|
1481
|
-
|
|
1547
|
+
declare function useCan(userId: UUID, scope: Scope, permission: Permission, pageId?: UUID, useCache?: boolean,
|
|
1548
|
+
/**
|
|
1549
|
+
* Pre-computed super admin flag to avoid duplicate super admin checks.
|
|
1550
|
+
* Callers should check super admin once and pass the result to all useCan hooks.
|
|
1551
|
+
* Pass null if not checked yet, false/true if checked.
|
|
1552
|
+
* Defaults to null (not checked yet) - hook will check if needed.
|
|
1553
|
+
*/
|
|
1554
|
+
precomputedSuperAdmin?: boolean | null, appName?: string): {
|
|
1555
|
+
can: boolean;
|
|
1482
1556
|
isLoading: boolean;
|
|
1483
1557
|
error: Error | null;
|
|
1484
1558
|
refetch: () => Promise<void>;
|
|
1485
1559
|
};
|
|
1560
|
+
|
|
1486
1561
|
/**
|
|
1487
|
-
* Hook to check
|
|
1562
|
+
* Hook to check if user has all of the specified permissions
|
|
1488
1563
|
*
|
|
1489
1564
|
* @param userId - User ID
|
|
1490
1565
|
* @param scope - Scope for permission checking
|
|
1491
1566
|
* @param permissions - Array of permissions to check
|
|
1492
1567
|
* @param useCache - Whether to use cached results
|
|
1493
|
-
* @returns
|
|
1568
|
+
* @returns Whether user has all of the permissions
|
|
1494
1569
|
*
|
|
1495
1570
|
* @example
|
|
1496
1571
|
* ```tsx
|
|
1497
1572
|
* function MyComponent() {
|
|
1498
|
-
* const {
|
|
1573
|
+
* const { hasAll, isLoading, error } = useHasAllPermissions(
|
|
1499
1574
|
* userId,
|
|
1500
1575
|
* scope,
|
|
1501
1576
|
* ['read:users', 'create:users', 'update:users']
|
|
@@ -1504,22 +1579,17 @@ declare function useAccessLevel(userId: UUID, scope: Scope): {
|
|
|
1504
1579
|
* if (isLoading) return <div>Checking permissions...</div>;
|
|
1505
1580
|
* if (error) return <div>Error: {error.message}</div>;
|
|
1506
1581
|
*
|
|
1507
|
-
* return
|
|
1508
|
-
* <div>
|
|
1509
|
-
* {results['read:users'] && <UserList />}
|
|
1510
|
-
* {results['create:users'] && <CreateUserButton />}
|
|
1511
|
-
* {results['update:users'] && <EditUserButton />}
|
|
1512
|
-
* </div>
|
|
1513
|
-
* );
|
|
1582
|
+
* return hasAll ? <FullUserManagementPanel /> : <div>Insufficient permissions</div>;
|
|
1514
1583
|
* }
|
|
1515
1584
|
* ```
|
|
1516
1585
|
*/
|
|
1517
|
-
declare function
|
|
1518
|
-
|
|
1586
|
+
declare function useHasAllPermissions(userId: UUID, scope: Scope, permissions: Permission[], useCache?: boolean): {
|
|
1587
|
+
hasAll: boolean;
|
|
1519
1588
|
isLoading: boolean;
|
|
1520
1589
|
error: Error | null;
|
|
1521
1590
|
refetch: () => Promise<void>;
|
|
1522
1591
|
};
|
|
1592
|
+
|
|
1523
1593
|
/**
|
|
1524
1594
|
* Hook to check if user has any of the specified permissions
|
|
1525
1595
|
*
|
|
@@ -1551,19 +1621,20 @@ declare function useHasAnyPermission(userId: UUID, scope: Scope, permissions: Pe
|
|
|
1551
1621
|
error: Error | null;
|
|
1552
1622
|
refetch: () => Promise<void>;
|
|
1553
1623
|
};
|
|
1624
|
+
|
|
1554
1625
|
/**
|
|
1555
|
-
* Hook to check
|
|
1626
|
+
* Hook to check multiple permissions at once
|
|
1556
1627
|
*
|
|
1557
1628
|
* @param userId - User ID
|
|
1558
1629
|
* @param scope - Scope for permission checking
|
|
1559
1630
|
* @param permissions - Array of permissions to check
|
|
1560
1631
|
* @param useCache - Whether to use cached results
|
|
1561
|
-
* @returns
|
|
1632
|
+
* @returns Multiple permission check results
|
|
1562
1633
|
*
|
|
1563
1634
|
* @example
|
|
1564
1635
|
* ```tsx
|
|
1565
1636
|
* function MyComponent() {
|
|
1566
|
-
* const {
|
|
1637
|
+
* const { results, isLoading, error } = useMultiplePermissions(
|
|
1567
1638
|
* userId,
|
|
1568
1639
|
* scope,
|
|
1569
1640
|
* ['read:users', 'create:users', 'update:users']
|
|
@@ -1572,45 +1643,61 @@ declare function useHasAnyPermission(userId: UUID, scope: Scope, permissions: Pe
|
|
|
1572
1643
|
* if (isLoading) return <div>Checking permissions...</div>;
|
|
1573
1644
|
* if (error) return <div>Error: {error.message}</div>;
|
|
1574
1645
|
*
|
|
1575
|
-
* return
|
|
1646
|
+
* return (
|
|
1647
|
+
* <div>
|
|
1648
|
+
* {results['read:users'] && <UserList />}
|
|
1649
|
+
* {results['create:users'] && <CreateUserButton />}
|
|
1650
|
+
* {results['update:users'] && <EditUserButton />}
|
|
1651
|
+
* </div>
|
|
1652
|
+
* );
|
|
1576
1653
|
* }
|
|
1577
1654
|
* ```
|
|
1578
1655
|
*/
|
|
1579
|
-
declare function
|
|
1580
|
-
|
|
1656
|
+
declare function useMultiplePermissions(userId: UUID, scope: Scope, permissions: Permission[], useCache?: boolean): {
|
|
1657
|
+
results: Record<Permission, boolean>;
|
|
1581
1658
|
isLoading: boolean;
|
|
1582
1659
|
error: Error | null;
|
|
1583
1660
|
refetch: () => Promise<void>;
|
|
1584
1661
|
};
|
|
1662
|
+
|
|
1585
1663
|
/**
|
|
1586
|
-
* Hook to get
|
|
1664
|
+
* Hook to get user's permissions in a scope
|
|
1587
1665
|
*
|
|
1588
1666
|
* @param userId - User ID
|
|
1589
|
-
* @param
|
|
1590
|
-
* @
|
|
1667
|
+
* @param organisationId - Organisation ID
|
|
1668
|
+
* @param eventId - Event ID (optional)
|
|
1669
|
+
* @param appId - Application ID (optional)
|
|
1670
|
+
* @returns Permission state and methods
|
|
1591
1671
|
*
|
|
1592
1672
|
* @example
|
|
1593
1673
|
* ```tsx
|
|
1594
1674
|
* function MyComponent() {
|
|
1595
|
-
* const { permissions, isLoading, error
|
|
1675
|
+
* const { permissions, isLoading, error } = usePermissions(
|
|
1676
|
+
* userId,
|
|
1677
|
+
* organisationId,
|
|
1678
|
+
* eventId,
|
|
1679
|
+
* appId
|
|
1680
|
+
* );
|
|
1596
1681
|
*
|
|
1597
|
-
* if (isLoading) return <div>Loading
|
|
1682
|
+
* if (isLoading) return <div>Loading...</div>;
|
|
1598
1683
|
* if (error) return <div>Error: {error.message}</div>;
|
|
1599
1684
|
*
|
|
1600
1685
|
* return (
|
|
1601
1686
|
* <div>
|
|
1602
1687
|
* {permissions['read:users'] && <UserList />}
|
|
1603
|
-
* <
|
|
1688
|
+
* {permissions['create:users'] && <CreateUserButton />}
|
|
1604
1689
|
* </div>
|
|
1605
1690
|
* );
|
|
1606
1691
|
* }
|
|
1607
1692
|
* ```
|
|
1608
1693
|
*/
|
|
1609
|
-
declare function
|
|
1694
|
+
declare function usePermissions(userId: UUID, organisationId: string | undefined, eventId: string | undefined, appId: string | undefined): {
|
|
1610
1695
|
permissions: PermissionMap;
|
|
1611
1696
|
isLoading: boolean;
|
|
1612
1697
|
error: Error | null;
|
|
1613
|
-
|
|
1698
|
+
hasPermission: (permission: Permission) => boolean;
|
|
1699
|
+
hasAnyPermission: (permissionList: Permission[]) => boolean;
|
|
1700
|
+
hasAllPermissions: (permissionList: Permission[]) => boolean;
|
|
1614
1701
|
refetch: () => Promise<void>;
|
|
1615
1702
|
};
|
|
1616
1703
|
|
|
@@ -2187,7 +2274,7 @@ declare function setupRBAC(supabase: SupabaseClient<Database>, config?: Partial<
|
|
|
2187
2274
|
declare function getAccessLevel(input: {
|
|
2188
2275
|
userId: UUID;
|
|
2189
2276
|
scope: Scope;
|
|
2190
|
-
},
|
|
2277
|
+
}, appName?: string): Promise<AccessLevel>;
|
|
2191
2278
|
/**
|
|
2192
2279
|
* Get user's permission map for a scope
|
|
2193
2280
|
*
|
|
@@ -2211,7 +2298,7 @@ declare function getAccessLevel(input: {
|
|
|
2211
2298
|
declare function getPermissionMap(input: {
|
|
2212
2299
|
userId: UUID;
|
|
2213
2300
|
scope: Scope;
|
|
2214
|
-
},
|
|
2301
|
+
}, appName?: string): Promise<PermissionMap>;
|
|
2215
2302
|
declare function resolveAppContext(input: {
|
|
2216
2303
|
userId: UUID;
|
|
2217
2304
|
appName: string;
|
|
@@ -2219,7 +2306,7 @@ declare function resolveAppContext(input: {
|
|
|
2219
2306
|
declare function getRoleContext(input: {
|
|
2220
2307
|
userId: UUID;
|
|
2221
2308
|
scope: Scope;
|
|
2222
|
-
},
|
|
2309
|
+
}, appName?: string): Promise<RBACRoleContext>;
|
|
2223
2310
|
/**
|
|
2224
2311
|
* Check if user has a specific permission
|
|
2225
2312
|
*
|
|
@@ -2238,7 +2325,14 @@ declare function getRoleContext(input: {
|
|
|
2238
2325
|
* });
|
|
2239
2326
|
* ```
|
|
2240
2327
|
*/
|
|
2241
|
-
declare function isPermitted(input: PermissionCheck,
|
|
2328
|
+
declare function isPermitted(input: PermissionCheck, appName?: string,
|
|
2329
|
+
/**
|
|
2330
|
+
* Pre-computed super admin status to avoid duplicate checks.
|
|
2331
|
+
* Pass null if not checked yet (will check), true if already checked and is super admin,
|
|
2332
|
+
* or false if already checked and is not super admin.
|
|
2333
|
+
* @default null
|
|
2334
|
+
*/
|
|
2335
|
+
precomputedSuperAdmin?: boolean | null): Promise<boolean>;
|
|
2242
2336
|
/**
|
|
2243
2337
|
* Check if user has a specific permission (cached version)
|
|
2244
2338
|
*
|
|
@@ -2246,11 +2340,10 @@ declare function isPermitted(input: PermissionCheck, appConfig?: AppConfig | nul
|
|
|
2246
2340
|
* and checks cache before making new requests. Uses session cache for page-level checks.
|
|
2247
2341
|
*
|
|
2248
2342
|
* @param input - Permission check input
|
|
2249
|
-
* @param
|
|
2250
|
-
* @param appName - Optional app name
|
|
2343
|
+
* @param appName - Optional app name (for PORTAL/ADMIN special case)
|
|
2251
2344
|
* @returns Promise resolving to permission result
|
|
2252
2345
|
*/
|
|
2253
|
-
declare function isPermittedCached(input: PermissionCheck,
|
|
2346
|
+
declare function isPermittedCached(input: PermissionCheck, appName?: string): Promise<boolean>;
|
|
2254
2347
|
/**
|
|
2255
2348
|
* Check if a user has a specific permission (alias for isPermitted)
|
|
2256
2349
|
*
|
|
@@ -2375,28 +2468,6 @@ declare const PAGE_PERMISSIONS: {
|
|
|
2375
2468
|
* @returns True if valid, false otherwise
|
|
2376
2469
|
*/
|
|
2377
2470
|
declare function isValidPermission(permission: string): permission is Permission;
|
|
2378
|
-
/**
|
|
2379
|
-
* Get all permissions for a role - REMOVED
|
|
2380
|
-
*
|
|
2381
|
-
* @deprecated This function has been removed to ensure RBAC compliance.
|
|
2382
|
-
* Permissions must be queried from the rbac_page_permissions database table,
|
|
2383
|
-
* not hardcoded in application code. This allows organizations to customize
|
|
2384
|
-
* their own page-level permissions as required by the RBAC specification.
|
|
2385
|
-
*
|
|
2386
|
-
* To get permissions for a role, query the database:
|
|
2387
|
-
* ```typescript
|
|
2388
|
-
* const { data } = await supabase
|
|
2389
|
-
* .from('rbac_page_permissions')
|
|
2390
|
-
* .select('operation, allowed')
|
|
2391
|
-
* .eq('role_name', roleName)
|
|
2392
|
-
* .eq('organisation_id', organisationId)
|
|
2393
|
-
* .eq('allowed', true);
|
|
2394
|
-
* ```
|
|
2395
|
-
*
|
|
2396
|
-
* @param role - Role name
|
|
2397
|
-
* @returns Empty array (function deprecated)
|
|
2398
|
-
*/
|
|
2399
|
-
declare function getPermissionsForRole(role: string): Permission[];
|
|
2400
2471
|
declare const ALL_PERMISSIONS: {
|
|
2401
2472
|
readonly READ_PAGE: Permission;
|
|
2402
2473
|
readonly CREATE_PAGE: Permission;
|
|
@@ -2609,4 +2680,4 @@ declare function getDirectSupabaseAuthFixes(): QuickFix;
|
|
|
2609
2680
|
*/
|
|
2610
2681
|
declare function getQuickFixes(issueType: string, details?: Record<string, any>): QuickFix[];
|
|
2611
2682
|
|
|
2612
|
-
export { ALL_PERMISSIONS, AccessLevel, AccessLevelGuard, type AllPermissions, CACHE_PATTERNS, type ComplianceResult, type DataAccessRecord, type DatabaseComplianceResult, type DatabaseIssue, EVENT_APP_PERMISSIONS, EnhancedNavigationMenu, type EnhancedNavigationMenuProps, type EventAppRoleData, GLOBAL_PERMISSIONS, type GrantEventAppRoleParams, type LogLevel, type NavigationAccessRecord, type NavigationContextType, NavigationGuard, type NavigationGuardProps, type NavigationItem, NavigationProvider, type NavigationProviderProps, ORGANISATION_PERMISSIONS, PAGE_PERMISSIONS, type PageAccessRecord, type PagePermissionContextType, PagePermissionGuard, type PagePermissionGuardProps, PagePermissionProvider, type PagePermissionProviderProps, Permission, PermissionCheck, PermissionEnforcer, type PermissionEnforcerProps, PermissionGuard, PermissionMap, type QuickFix, RBACAuditManager, RBACCache, type RBACConfig, RBACEngine, type RBACLogger, type RBACPerformanceMetrics, type ResourcePermissions, type RevokeEventAppRoleParams, RoleBasedRouter, type RoleBasedRouterContextType, type RoleBasedRouterProps, type RoleManagementResult, type RouteAccessRecord, type RouteConfig, type RuntimeComplianceResult, Scope, type SecureDataContextType, SecureDataProvider, type SecureDataProviderProps, SecureSupabaseClient, type SetupIssue, UUID, type UseResolvedScopeOptions, type UseResolvedScopeReturn, type UseResourcePermissionsOptions, checkRuntimeCompliance, clearInFlightRequests, createAuditManager, createRBACConfig, createRBACEngine, createRBACExpressMiddleware, createRBACMiddleware, createSecureClient, disablePerformanceMonitoring, emitAuditEvent, enablePerformanceMonitoring, fromSupabaseClient, getAccessLevel, getCustomAuthCodeFixes, getDirectSupabaseAuthFixes, getDuplicateConfigFixes, getGlobalAuditManager, getInFlightRequestCount, getPerformanceMetrics, getPerformanceSummary, getPermissionMap,
|
|
2683
|
+
export { ALL_PERMISSIONS, AccessLevel, AccessLevelGuard, type AllPermissions, CACHE_PATTERNS, type ComplianceResult, type DataAccessRecord, type DatabaseComplianceResult, type DatabaseIssue, EVENT_APP_PERMISSIONS, EnhancedNavigationMenu, type EnhancedNavigationMenuProps, type EventAppRoleData, GLOBAL_PERMISSIONS, type GrantEventAppRoleParams, type LogLevel, type NavigationAccessRecord, type NavigationContextType, NavigationGuard, type NavigationGuardProps, type NavigationItem, NavigationProvider, type NavigationProviderProps, ORGANISATION_PERMISSIONS, PAGE_PERMISSIONS, type PageAccessRecord, type PagePermissionContextType, PagePermissionGuard, type PagePermissionGuardProps, PagePermissionProvider, type PagePermissionProviderProps, Permission, PermissionCheck, PermissionEnforcer, type PermissionEnforcerProps, PermissionGuard, PermissionMap, type QuickFix, RBACAuditManager, RBACCache, type RBACConfig, RBACEngine, type RBACLogger, type RBACPerformanceMetrics, type ResourcePermissions, type RevokeEventAppRoleParams, RoleBasedRouter, type RoleBasedRouterContextType, type RoleBasedRouterProps, type RoleManagementResult, type RouteAccessRecord, type RouteConfig, type RuntimeComplianceResult, SECURE_CLIENT_SYMBOL, Scope, type SecureDataContextType, SecureDataProvider, type SecureDataProviderProps, SecureSupabaseClient, type SetupIssue, UUID, type UseResolvedScopeOptions, type UseResolvedScopeReturn, type UseResourcePermissionsOptions, checkRuntimeCompliance, clearInFlightRequests, createAuditManager, createRBACConfig, createRBACEngine, createRBACExpressMiddleware, createRBACMiddleware, createSecureClient, disablePerformanceMonitoring, emitAuditEvent, enablePerformanceMonitoring, fromSupabaseClient, getAccessLevel, getCustomAuthCodeFixes, getDirectSupabaseAuthFixes, getDuplicateConfigFixes, getGlobalAuditManager, getInFlightRequestCount, getPerformanceMetrics, getPerformanceSummary, getPermissionMap, getQuickFixes, getRBACConfig, getRBACLogger, getRoleContext, getSetupIssues, getUnprotectedPageFixes, hasAllPermissions, hasAnyPermission, hasAnyPermissionCached, hasPermission, hasPermissionCached, isDebugMode, isDevelopmentMode, isPerformanceMonitoringEnabled, isPermitted, isPermittedCached, isRBACInitialized, isSecureClient, isValidPermission, rbacCache, recordAuditEvent, recordPermissionCheck, resetPerformanceMetrics, resolveAppContext, setGlobalAuditManager, setupRBAC, useAccessLevel, useCachedPermissions, useCan, useHasAllPermissions, useHasAnyPermission, useMultiplePermissions, useNavigationPermissions, usePagePermissions, usePermissions, useRBAC, useResolvedScope, useResourcePermissions, useRoleBasedRouter, useRoleManagement, useSecureData, useSecureSupabase, validateAndWarn, validateDatabaseConfiguration, validateRBACSetup, warnIfInsecureClient, withAccessLevelGuard, withPermissionGuard, withRoleGuard };
|