@jmruthers/pace-core 0.6.1 → 0.6.2
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 +43 -10
- package/cursor-rules/00-pace-core-compliance.mdc +18 -91
- 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-BPvc3Ka0.d.ts} +54 -0
- package/dist/{DataTable-CH1U5Tpy.d.ts → DataTable-BMRU8a1j.d.ts} +33 -1
- package/dist/{DataTable-DQ7RSOHE.js → DataTable-TPTKCX4D.js} +10 -9
- package/dist/{PublicPageProvider-ce4xlHYA.d.ts → PublicPageProvider-DC6kCaqf.d.ts} +356 -111
- package/dist/{UnifiedAuthProvider-ATAP5UTR.js → UnifiedAuthProvider-CH6Z342H.js} +3 -3
- package/dist/{UnifiedAuthProvider-185Ih4dj.d.ts → UnifiedAuthProvider-CVcTjx-d.d.ts} +29 -0
- package/dist/{api-N774RPUA.js → api-MVVQZLJI.js} +2 -2
- package/dist/{chunk-KNC55RTG.js → chunk-24UVZUZG.js} +90 -54
- package/dist/chunk-24UVZUZG.js.map +1 -0
- package/dist/{chunk-4N5C5XZU.js → chunk-2UOI2FG5.js} +4 -4
- package/dist/chunk-2UOI2FG5.js.map +1 -0
- package/dist/{chunk-T33XF5ZC.js → chunk-3XC4CPTD.js} +4317 -3963
- package/dist/chunk-3XC4CPTD.js.map +1 -0
- package/dist/{chunk-4ZC4GX36.js → chunk-6J4GEEJR.js} +172 -45
- package/dist/chunk-6J4GEEJR.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-BYFSK72L.js → chunk-EHMR7VYL.js} +4 -4
- package/dist/chunk-EHMR7VYL.js.map +1 -0
- package/dist/{chunk-I7PSE6JW.js → chunk-F2IMUDXZ.js} +2 -75
- package/dist/chunk-F2IMUDXZ.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-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-3XTALGJF.js → chunk-MMZ7JXPU.js} +60 -223
- package/dist/chunk-MMZ7JXPU.js.map +1 -0
- package/dist/{chunk-GLK6VM3F.js → chunk-NECFR5MM.js} +254 -170
- package/dist/chunk-NECFR5MM.js.map +1 -0
- package/dist/{chunk-JBKQ3SAO.js → chunk-SFZUDBL5.js} +40 -4
- package/dist/chunk-SFZUDBL5.js.map +1 -0
- package/dist/{chunk-XM25TVIE.js → chunk-XWQCNGTQ.js} +724 -363
- package/dist/chunk-XWQCNGTQ.js.map +1 -0
- package/dist/components.d.ts +5 -5
- package/dist/components.js +14 -11
- package/dist/components.js.map +1 -1
- 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 +8 -12
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +60 -13
- package/dist/index.js +19 -19
- package/dist/index.js.map +1 -1
- package/dist/providers.d.ts +21 -3
- package/dist/providers.js +2 -2
- package/dist/rbac/index.d.ts +145 -114
- package/dist/rbac/index.js +8 -11
- package/dist/theming/runtime.d.ts +1 -13
- package/dist/theming/runtime.js +1 -1
- 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/{usePublicRouteParams-BJAlWfuJ.d.ts → usePublicRouteParams-1oMokgLF.d.ts} +31 -1
- package/dist/utils.d.ts +4 -5
- package/dist/utils.js +14 -14
- package/dist/utils.js.map +1 -1
- package/docs/api/README.md +7 -1
- package/docs/api/classes/ColumnFactory.md +8 -8
- package/docs/api/classes/InvalidScopeError.md +4 -4
- package/docs/api/classes/Logger.md +1 -1
- package/docs/api/classes/MissingUserContextError.md +4 -4
- package/docs/api/classes/OrganisationContextRequiredError.md +4 -4
- package/docs/api/classes/PermissionDeniedError.md +4 -4
- package/docs/api/classes/RBACAuditManager.md +1 -1
- package/docs/api/classes/RBACCache.md +1 -1
- package/docs/api/classes/RBACEngine.md +1 -1
- package/docs/api/classes/RBACError.md +4 -4
- package/docs/api/classes/RBACNotInitializedError.md +4 -4
- package/docs/api/classes/SecureSupabaseClient.md +18 -15
- package/docs/api/classes/StorageUtils.md +1 -1
- package/docs/api/enums/FileCategory.md +1 -1
- package/docs/api/enums/LogLevel.md +1 -1
- package/docs/api/enums/RBACErrorCode.md +1 -1
- package/docs/api/enums/RPCFunction.md +1 -1
- package/docs/api/interfaces/AddressFieldProps.md +1 -1
- package/docs/api/interfaces/AddressFieldRef.md +1 -1
- package/docs/api/interfaces/AggregateConfig.md +4 -4
- package/docs/api/interfaces/AutocompleteOptions.md +1 -1
- package/docs/api/interfaces/AvatarProps.md +1 -1
- package/docs/api/interfaces/BadgeProps.md +9 -2
- package/docs/api/interfaces/ButtonProps.md +7 -4
- package/docs/api/interfaces/CalendarProps.md +8 -5
- package/docs/api/interfaces/CardProps.md +8 -5
- package/docs/api/interfaces/ColorPalette.md +1 -1
- package/docs/api/interfaces/ColorShade.md +1 -1
- package/docs/api/interfaces/ComplianceResult.md +1 -1
- package/docs/api/interfaces/DataAccessRecord.md +9 -9
- package/docs/api/interfaces/DataRecord.md +1 -1
- package/docs/api/interfaces/DataTableAction.md +24 -21
- package/docs/api/interfaces/DataTableColumn.md +31 -31
- package/docs/api/interfaces/DataTableProps.md +1 -1
- package/docs/api/interfaces/DataTableToolbarButton.md +7 -7
- package/docs/api/interfaces/DatabaseComplianceResult.md +1 -1
- package/docs/api/interfaces/DatabaseIssue.md +1 -1
- package/docs/api/interfaces/EmptyStateConfig.md +5 -5
- package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
- package/docs/api/interfaces/ErrorBoundaryProps.md +147 -0
- package/docs/api/interfaces/ErrorBoundaryProviderProps.md +36 -0
- package/docs/api/interfaces/ErrorBoundaryState.md +75 -0
- package/docs/api/interfaces/EventAppRoleData.md +1 -1
- package/docs/api/interfaces/ExportColumn.md +1 -1
- package/docs/api/interfaces/ExportOptions.md +8 -8
- package/docs/api/interfaces/FileDisplayProps.md +1 -1
- package/docs/api/interfaces/FileMetadata.md +1 -1
- package/docs/api/interfaces/FileReference.md +1 -1
- package/docs/api/interfaces/FileSizeLimits.md +1 -1
- package/docs/api/interfaces/FileUploadOptions.md +1 -1
- package/docs/api/interfaces/FileUploadProps.md +26 -23
- package/docs/api/interfaces/FooterProps.md +10 -8
- package/docs/api/interfaces/FormFieldProps.md +10 -10
- package/docs/api/interfaces/FormProps.md +1 -1
- package/docs/api/interfaces/GrantEventAppRoleParams.md +1 -1
- package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
- package/docs/api/interfaces/InputProps.md +7 -4
- package/docs/api/interfaces/LabelProps.md +1 -1
- package/docs/api/interfaces/LoggerConfig.md +1 -1
- package/docs/api/interfaces/LoginFormProps.md +14 -11
- package/docs/api/interfaces/NavigationAccessRecord.md +1 -1
- package/docs/api/interfaces/NavigationContextType.md +1 -1
- package/docs/api/interfaces/NavigationGuardProps.md +1 -1
- package/docs/api/interfaces/NavigationItem.md +11 -11
- package/docs/api/interfaces/NavigationMenuProps.md +15 -15
- package/docs/api/interfaces/NavigationProviderProps.md +1 -1
- package/docs/api/interfaces/Organisation.md +1 -1
- package/docs/api/interfaces/OrganisationContextType.md +1 -1
- package/docs/api/interfaces/OrganisationMembership.md +1 -1
- package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
- package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
- package/docs/api/interfaces/PaceAppLayoutProps.md +30 -27
- package/docs/api/interfaces/PaceLoginPageProps.md +6 -4
- package/docs/api/interfaces/PageAccessRecord.md +1 -1
- package/docs/api/interfaces/PagePermissionContextType.md +1 -1
- package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
- package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
- package/docs/api/interfaces/PaletteData.md +1 -1
- package/docs/api/interfaces/ParsedAddress.md +1 -1
- package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
- package/docs/api/interfaces/ProgressProps.md +1 -1
- package/docs/api/interfaces/ProtectedRouteProps.md +7 -26
- package/docs/api/interfaces/PublicPageFooterProps.md +9 -9
- package/docs/api/interfaces/PublicPageHeaderProps.md +10 -10
- package/docs/api/interfaces/PublicPageLayoutProps.md +7 -20
- package/docs/api/interfaces/QuickFix.md +1 -1
- package/docs/api/interfaces/RBACAccessValidateParams.md +1 -1
- package/docs/api/interfaces/RBACAccessValidateResult.md +1 -1
- package/docs/api/interfaces/RBACAuditLogParams.md +1 -1
- package/docs/api/interfaces/RBACAuditLogResult.md +1 -1
- package/docs/api/interfaces/RBACConfig.md +1 -1
- package/docs/api/interfaces/RBACContext.md +1 -1
- package/docs/api/interfaces/RBACLogger.md +1 -1
- package/docs/api/interfaces/RBACPageAccessCheckParams.md +1 -1
- package/docs/api/interfaces/RBACPerformanceMetrics.md +1 -1
- package/docs/api/interfaces/RBACPermissionCheckParams.md +1 -1
- package/docs/api/interfaces/RBACPermissionCheckResult.md +1 -1
- package/docs/api/interfaces/RBACPermissionsGetParams.md +1 -1
- package/docs/api/interfaces/RBACPermissionsGetResult.md +1 -1
- package/docs/api/interfaces/RBACResult.md +1 -1
- package/docs/api/interfaces/RBACRoleGrantParams.md +1 -1
- package/docs/api/interfaces/RBACRoleGrantResult.md +1 -1
- package/docs/api/interfaces/RBACRoleRevokeParams.md +1 -1
- package/docs/api/interfaces/RBACRoleRevokeResult.md +1 -1
- package/docs/api/interfaces/RBACRoleValidateParams.md +1 -1
- package/docs/api/interfaces/RBACRoleValidateResult.md +1 -1
- package/docs/api/interfaces/RBACRolesListParams.md +1 -1
- package/docs/api/interfaces/RBACRolesListResult.md +1 -1
- package/docs/api/interfaces/RBACSessionTrackParams.md +1 -1
- package/docs/api/interfaces/RBACSessionTrackResult.md +1 -1
- package/docs/api/interfaces/ResourcePermissions.md +1 -1
- package/docs/api/interfaces/RevokeEventAppRoleParams.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
- package/docs/api/interfaces/RoleManagementResult.md +1 -1
- package/docs/api/interfaces/RouteAccessRecord.md +1 -1
- package/docs/api/interfaces/RouteConfig.md +1 -1
- package/docs/api/interfaces/RuntimeComplianceResult.md +1 -1
- package/docs/api/interfaces/SecureDataContextType.md +9 -9
- package/docs/api/interfaces/SecureDataProviderProps.md +8 -8
- package/docs/api/interfaces/SessionRestorationLoaderProps.md +3 -3
- package/docs/api/interfaces/SetupIssue.md +1 -1
- package/docs/api/interfaces/StorageConfig.md +1 -1
- package/docs/api/interfaces/StorageFileInfo.md +1 -1
- package/docs/api/interfaces/StorageFileMetadata.md +1 -1
- package/docs/api/interfaces/StorageListOptions.md +1 -1
- package/docs/api/interfaces/StorageListResult.md +1 -1
- package/docs/api/interfaces/StorageUploadOptions.md +1 -1
- package/docs/api/interfaces/StorageUploadResult.md +1 -1
- package/docs/api/interfaces/StorageUrlOptions.md +1 -1
- package/docs/api/interfaces/StyleImport.md +1 -1
- package/docs/api/interfaces/SwitchProps.md +1 -1
- package/docs/api/interfaces/TabsContentProps.md +1 -1
- package/docs/api/interfaces/TabsListProps.md +1 -1
- package/docs/api/interfaces/TabsProps.md +1 -1
- package/docs/api/interfaces/TabsTriggerProps.md +3 -3
- package/docs/api/interfaces/TextareaProps.md +1 -1
- package/docs/api/interfaces/ToastActionElement.md +4 -1
- package/docs/api/interfaces/ToastProps.md +1 -1
- package/docs/api/interfaces/UnifiedAuthContextType.md +58 -55
- package/docs/api/interfaces/UnifiedAuthProviderProps.md +15 -13
- package/docs/api/interfaces/UseFormDialogOptions.md +1 -1
- package/docs/api/interfaces/UseFormDialogReturn.md +1 -1
- package/docs/api/interfaces/UseInactivityTrackerOptions.md +11 -9
- package/docs/api/interfaces/UseInactivityTrackerReturn.md +8 -8
- package/docs/api/interfaces/UsePublicEventLogoOptions.md +6 -6
- package/docs/api/interfaces/UsePublicEventLogoReturn.md +9 -6
- package/docs/api/interfaces/UsePublicEventOptions.md +3 -3
- package/docs/api/interfaces/UsePublicEventReturn.md +8 -5
- package/docs/api/interfaces/UsePublicFileDisplayOptions.md +4 -4
- package/docs/api/interfaces/UsePublicFileDisplayReturn.md +12 -9
- package/docs/api/interfaces/UsePublicRouteParamsReturn.md +10 -7
- package/docs/api/interfaces/UseResolvedScopeOptions.md +1 -1
- package/docs/api/interfaces/UseResolvedScopeReturn.md +1 -1
- package/docs/api/interfaces/UseResourcePermissionsOptions.md +1 -1
- package/docs/api/interfaces/UserEventAccess.md +14 -11
- package/docs/api/interfaces/UserMenuProps.md +8 -6
- package/docs/api/interfaces/UserProfile.md +1 -1
- package/docs/api/modules.md +575 -634
- package/docs/architecture/database-schema-requirements.md +161 -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/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/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/standards/README.md +1 -0
- package/package.json +2 -1
- 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} +714 -687
- 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 +454 -0
- package/scripts/audit/core/checks/documentation.cjs +203 -0
- package/scripts/audit/core/checks/environment.cjs +128 -0
- package/scripts/audit/core/checks/error-handling.cjs +299 -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/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 +61 -849
- 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 +124 -32
- 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 +2 -2
- 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/EventSelector/EventSelector.tsx +3 -0
- package/src/components/FileDisplay/FileDisplay.tsx +32 -18
- 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.tsx +21 -10
- 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/OrganisationSelector/OrganisationSelector.tsx +3 -0
- package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +4 -2
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +32 -11
- package/src/components/PaceAppLayout/test-setup.tsx +1 -2
- 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 +2 -2
- package/src/hooks/__tests__/index.unit.test.ts +2 -5
- 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/useDebounce.ts +9 -0
- package/src/hooks/useEventTheme.ts +6 -0
- package/src/hooks/useFileDisplay.ts +4 -0
- 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 +2 -1
- package/src/providers/__tests__/OrganisationProvider.test.tsx +92 -70
- package/src/providers/services/AuthServiceProvider.tsx +18 -0
- package/src/providers/services/EventServiceProvider.tsx +18 -0
- package/src/providers/services/InactivityServiceProvider.tsx +18 -0
- package/src/providers/services/OrganisationServiceProvider.tsx +18 -0
- package/src/providers/services/UnifiedAuthProvider.tsx +36 -0
- 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 +2 -2
- package/src/rbac/__tests__/scenarios.user-role.test.tsx +4 -5
- package/src/rbac/adapters.tsx +14 -5
- package/src/rbac/api.ts +100 -67
- package/src/rbac/components/NavigationProvider.tsx +4 -1
- package/src/rbac/components/PagePermissionGuard.tsx +157 -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/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 +347 -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 +71 -64
- package/src/rbac/hooks/usePermissions.ts +14 -995
- package/src/rbac/hooks/useResourcePermissions.test.ts +54 -18
- package/src/rbac/hooks/useResourcePermissions.ts +14 -4
- package/src/rbac/hooks/useSecureSupabase.ts +33 -13
- package/src/rbac/permissions.ts +0 -30
- package/src/rbac/secureClient.ts +200 -61
- package/src/rbac/types.ts +8 -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/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-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.map +0 -1
- package/dist/chunk-XM25TVIE.js.map +0 -1
- package/docs/api/classes/ErrorBoundary.md +0 -144
- package/docs/migration/quick-migration-guide.md +0 -356
- package/docs/migration/service-architecture.md +0 -281
- 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-TPTKCX4D.js.map} +0 -0
- /package/dist/{UnifiedAuthProvider-ATAP5UTR.js.map → UnifiedAuthProvider-CH6Z342H.js.map} +0 -0
- /package/dist/{api-N774RPUA.js.map → api-MVVQZLJI.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
|
@@ -2,24 +2,23 @@ import {
|
|
|
2
2
|
scopeEqual,
|
|
3
3
|
useAccessLevel,
|
|
4
4
|
useCan,
|
|
5
|
-
useMultiplePermissions
|
|
6
|
-
|
|
5
|
+
useMultiplePermissions,
|
|
6
|
+
useResolvedScope,
|
|
7
|
+
useSecureSupabase
|
|
8
|
+
} from "./chunk-XWQCNGTQ.js";
|
|
7
9
|
import {
|
|
8
|
-
|
|
9
|
-
} from "./chunk-
|
|
10
|
-
import {
|
|
11
|
-
useResolvedScope
|
|
12
|
-
} from "./chunk-3XTALGJF.js";
|
|
10
|
+
useOrganisationSecurity
|
|
11
|
+
} from "./chunk-MMZ7JXPU.js";
|
|
13
12
|
import {
|
|
14
13
|
useUnifiedAuth
|
|
15
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-EHMR7VYL.js";
|
|
16
15
|
import {
|
|
17
16
|
RBACCache,
|
|
18
17
|
RBACNotInitializedError,
|
|
19
18
|
getRBACConfig,
|
|
20
19
|
getRBACLogger,
|
|
21
20
|
rbacCache
|
|
22
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-24UVZUZG.js";
|
|
23
22
|
import {
|
|
24
23
|
createLogger,
|
|
25
24
|
logger
|
|
@@ -177,11 +176,61 @@ var PagePermissionGuardComponent = ({
|
|
|
177
176
|
const instanceId = useMemo2(() => Math.random().toString(36).substr(2, 9), []);
|
|
178
177
|
const { user, selectedOrganisation, selectedEvent, supabase, appId: contextAppId, appName } = useUnifiedAuth();
|
|
179
178
|
const [hasChecked, setHasChecked] = useState2(false);
|
|
179
|
+
const effectivePageId = useMemo2(() => {
|
|
180
|
+
return pageId || pageName;
|
|
181
|
+
}, [pageId, pageName]);
|
|
182
|
+
const [isSuperAdmin, setIsSuperAdmin] = useState2(null);
|
|
183
|
+
useEffect2(() => {
|
|
184
|
+
if (!user?.id) {
|
|
185
|
+
setIsSuperAdmin(false);
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
let cancelled = false;
|
|
189
|
+
const checkSuperAdmin = async () => {
|
|
190
|
+
const startTime = Date.now();
|
|
191
|
+
try {
|
|
192
|
+
const { isSuperAdmin: checkSuperAdmin2 } = await import("./api-MVVQZLJI.js");
|
|
193
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
194
|
+
setTimeout(() => reject(new Error("Super admin check timeout")), 1e4);
|
|
195
|
+
});
|
|
196
|
+
const isSuper = await Promise.race([
|
|
197
|
+
checkSuperAdmin2(user.id),
|
|
198
|
+
timeoutPromise
|
|
199
|
+
]);
|
|
200
|
+
const elapsed = Date.now() - startTime;
|
|
201
|
+
if (!cancelled) {
|
|
202
|
+
setIsSuperAdmin(isSuper);
|
|
203
|
+
if (false) {
|
|
204
|
+
console.log("[PagePermissionGuard] Super admin check completed", {
|
|
205
|
+
userId: user.id,
|
|
206
|
+
isSuperAdmin: isSuper,
|
|
207
|
+
elapsedMs: elapsed
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
} catch (err) {
|
|
212
|
+
const elapsed = Date.now() - startTime;
|
|
213
|
+
if (!cancelled) {
|
|
214
|
+
console.error("[PagePermissionGuard] Error checking super admin", {
|
|
215
|
+
error: err,
|
|
216
|
+
userId: user.id,
|
|
217
|
+
elapsedMs: elapsed
|
|
218
|
+
});
|
|
219
|
+
setIsSuperAdmin(false);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
};
|
|
223
|
+
checkSuperAdmin();
|
|
224
|
+
return () => {
|
|
225
|
+
cancelled = true;
|
|
226
|
+
};
|
|
227
|
+
}, [user?.id]);
|
|
180
228
|
const { resolvedScope: hookResolvedScope, isLoading: scopeLoading, error: scopeError } = useResolvedScope({
|
|
181
229
|
supabase,
|
|
182
230
|
selectedOrganisationId: selectedOrganisation?.id || null,
|
|
183
231
|
selectedEventId: selectedEvent?.event_id || null
|
|
184
232
|
});
|
|
233
|
+
const shouldBypassScopeForSuperAdmin = isSuperAdmin === true;
|
|
185
234
|
const allowsOptionalContexts = appName === "PORTAL" || appName === "ADMIN";
|
|
186
235
|
const effectiveScope = scope || (hookResolvedScope ? {
|
|
187
236
|
...hookResolvedScope,
|
|
@@ -197,9 +246,6 @@ var PagePermissionGuardComponent = ({
|
|
|
197
246
|
appId: contextAppId || void 0
|
|
198
247
|
} : null);
|
|
199
248
|
const checkError = scopeError;
|
|
200
|
-
const effectivePageId = useMemo2(() => {
|
|
201
|
-
return pageId || pageName;
|
|
202
|
-
}, [pageId, pageName]);
|
|
203
249
|
const permission = useMemo2(() => {
|
|
204
250
|
return `${operation}:page.${pageName}`;
|
|
205
251
|
}, [operation, pageName]);
|
|
@@ -232,28 +278,38 @@ var PagePermissionGuardComponent = ({
|
|
|
232
278
|
prevScopeRef.current = newScope;
|
|
233
279
|
return newScope;
|
|
234
280
|
}, [effectiveScope, appName, contextAppId, selectedEvent?.event_id]);
|
|
281
|
+
const scopeForPermissionCheck = shouldBypassScopeForSuperAdmin && !stableScope?.organisationId ? {
|
|
282
|
+
organisationId: void 0,
|
|
283
|
+
appId: contextAppId || void 0,
|
|
284
|
+
eventId: selectedEvent?.event_id || void 0
|
|
285
|
+
} : stableScope;
|
|
286
|
+
const shouldSkipPermissionCheck = isSuperAdmin === true;
|
|
235
287
|
const { can, isLoading: canIsLoading, error: canError } = useCan(
|
|
236
288
|
user?.id || "",
|
|
237
|
-
|
|
289
|
+
shouldSkipPermissionCheck ? { organisationId: void 0, appId: contextAppId || void 0, eventId: void 0 } : scopeForPermissionCheck,
|
|
238
290
|
permission,
|
|
239
291
|
effectivePageId,
|
|
240
292
|
true,
|
|
241
293
|
// Use cache
|
|
294
|
+
isSuperAdmin,
|
|
295
|
+
// precomputedSuperAdmin - null if checking, true/false if checked
|
|
242
296
|
appName
|
|
243
297
|
// Pass appName for PORTAL/ADMIN special case
|
|
244
298
|
);
|
|
245
|
-
const
|
|
299
|
+
const effectiveCan = shouldSkipPermissionCheck ? true : can;
|
|
300
|
+
const effectiveIsLoading = shouldSkipPermissionCheck ? false : canIsLoading;
|
|
301
|
+
const isLoading = shouldBypassScopeForSuperAdmin ? effectiveIsLoading : scopeLoading || effectiveIsLoading;
|
|
246
302
|
const error = checkError || canError;
|
|
247
303
|
useEffect2(() => {
|
|
248
304
|
if (!isLoading && !error) {
|
|
249
305
|
setHasChecked(true);
|
|
250
|
-
if (!
|
|
306
|
+
if (!effectiveCan && onDenied) {
|
|
251
307
|
onDenied(pageName, operation);
|
|
252
308
|
}
|
|
253
309
|
} else if (error) {
|
|
254
310
|
setHasChecked(true);
|
|
255
311
|
}
|
|
256
|
-
}, [
|
|
312
|
+
}, [effectiveCan, isLoading, error, pageName, operation, onDenied]);
|
|
257
313
|
useEffect2(() => {
|
|
258
314
|
if (auditLog && hasChecked && !isLoading) {
|
|
259
315
|
const rbacLogger = getRBACLogger();
|
|
@@ -262,13 +318,14 @@ var PagePermissionGuardComponent = ({
|
|
|
262
318
|
operation,
|
|
263
319
|
userId: user?.id,
|
|
264
320
|
scope: effectiveScope,
|
|
265
|
-
allowed:
|
|
321
|
+
allowed: effectiveCan,
|
|
322
|
+
isSuperAdmin,
|
|
266
323
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
267
324
|
});
|
|
268
325
|
}
|
|
269
|
-
}, [auditLog, hasChecked, isLoading, pageName, operation, user?.id, effectiveScope,
|
|
326
|
+
}, [auditLog, hasChecked, isLoading, pageName, operation, user?.id, effectiveScope, effectiveCan, isSuperAdmin]);
|
|
270
327
|
useEffect2(() => {
|
|
271
|
-
if (strictMode && hasChecked && !isLoading && !
|
|
328
|
+
if (strictMode && hasChecked && !isLoading && !effectiveCan && !shouldBypassScopeForSuperAdmin) {
|
|
272
329
|
const logger2 = getRBACLogger();
|
|
273
330
|
logger2.error(`STRICT MODE VIOLATION: User attempted to access protected page without permission`, {
|
|
274
331
|
pageName,
|
|
@@ -281,18 +338,62 @@ var PagePermissionGuardComponent = ({
|
|
|
281
338
|
// PORTAL/ADMIN allow scope without org/event
|
|
282
339
|
checkError,
|
|
283
340
|
canError,
|
|
341
|
+
isSuperAdmin,
|
|
284
342
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
285
343
|
});
|
|
286
344
|
}
|
|
287
|
-
}, [strictMode, hasChecked, isLoading,
|
|
288
|
-
const hasValidScopeForPagePermissions = allowsOptionalContexts ? true : effectiveScope !== null;
|
|
345
|
+
}, [strictMode, hasChecked, isLoading, effectiveCan, shouldBypassScopeForSuperAdmin, pageName, operation, effectivePageId, user?.id, effectiveScope, allowsOptionalContexts, checkError, canError, isSuperAdmin]);
|
|
346
|
+
const hasValidScopeForPagePermissions = shouldBypassScopeForSuperAdmin ? true : allowsOptionalContexts ? true : effectiveScope !== null;
|
|
289
347
|
const hasValidUser = user && user.id;
|
|
290
348
|
const isPermissionCheckComplete = hasChecked && !isLoading;
|
|
291
|
-
const shouldShowAccessDenied = isPermissionCheckComplete && hasValidScopeForPagePermissions && hasValidUser && !checkError && !
|
|
292
|
-
const shouldShowContent = isPermissionCheckComplete && hasValidScopeForPagePermissions && hasValidUser && !checkError &&
|
|
349
|
+
const shouldShowAccessDenied = isPermissionCheckComplete && hasValidScopeForPagePermissions && hasValidUser && !checkError && !effectiveCan;
|
|
350
|
+
const shouldShowContent = isPermissionCheckComplete && hasValidScopeForPagePermissions && hasValidUser && !checkError && effectiveCan;
|
|
293
351
|
const scopeKey = effectiveScope ? `${effectiveScope.organisationId}-${effectiveScope.eventId}-${effectiveScope.appId}` : "no-scope";
|
|
294
352
|
const permissionKey = `${scopeKey}-${can}-${isLoading}-${!!checkError}-${hasChecked}`;
|
|
295
|
-
|
|
353
|
+
useEffect2(() => {
|
|
354
|
+
if (false) {
|
|
355
|
+
console.log("[PagePermissionGuard] Permission check state", {
|
|
356
|
+
pageName,
|
|
357
|
+
userId: user?.id,
|
|
358
|
+
isSuperAdmin,
|
|
359
|
+
isLoading,
|
|
360
|
+
scopeLoading,
|
|
361
|
+
canIsLoading,
|
|
362
|
+
hasChecked,
|
|
363
|
+
hasValidUser,
|
|
364
|
+
effectiveCan,
|
|
365
|
+
stableScope,
|
|
366
|
+
effectiveScope
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
}, [pageName, user?.id, isSuperAdmin, isLoading, scopeLoading, canIsLoading, hasChecked, hasValidUser, effectiveCan, stableScope, effectiveScope]);
|
|
370
|
+
useEffect2(() => {
|
|
371
|
+
if (isLoading && isSuperAdmin === null && hasValidUser) {
|
|
372
|
+
const timeout = setTimeout(() => {
|
|
373
|
+
console.warn("[PagePermissionGuard] Permission check taking longer than expected", {
|
|
374
|
+
pageName,
|
|
375
|
+
userId: user?.id,
|
|
376
|
+
isSuperAdmin,
|
|
377
|
+
scopeLoading,
|
|
378
|
+
canIsLoading,
|
|
379
|
+
hasChecked,
|
|
380
|
+
stableScope,
|
|
381
|
+
effectiveScope,
|
|
382
|
+
appName
|
|
383
|
+
});
|
|
384
|
+
}, 5e3);
|
|
385
|
+
return () => clearTimeout(timeout);
|
|
386
|
+
}
|
|
387
|
+
}, [isLoading, isSuperAdmin, hasValidUser, pageName, user?.id, scopeLoading, canIsLoading, hasChecked, stableScope, effectiveScope, appName]);
|
|
388
|
+
if (isSuperAdmin === true && hasValidUser) {
|
|
389
|
+
console.log("[PagePermissionGuard] Super admin access granted - bypassing all checks", {
|
|
390
|
+
pageName,
|
|
391
|
+
userId: user?.id,
|
|
392
|
+
operation
|
|
393
|
+
});
|
|
394
|
+
return /* @__PURE__ */ jsx2(Fragment, { children });
|
|
395
|
+
}
|
|
396
|
+
if (isLoading || !hasValidUser || !hasChecked || isSuperAdmin === null) {
|
|
296
397
|
return loading || /* @__PURE__ */ jsx2("div", { children: "Checking permissions..." });
|
|
297
398
|
}
|
|
298
399
|
if (checkError && !can) {
|
|
@@ -343,7 +444,8 @@ function SecureDataProvider({
|
|
|
343
444
|
enforceRLS = true
|
|
344
445
|
}) {
|
|
345
446
|
const { user, selectedOrganisation, selectedEvent, supabase } = useUnifiedAuth();
|
|
346
|
-
const
|
|
447
|
+
const secureSupabase = useSecureSupabase(supabase);
|
|
448
|
+
const { superAdminContext } = useOrganisationSecurity();
|
|
347
449
|
const [dataAccessHistory, setDataAccessHistory] = useState3([]);
|
|
348
450
|
const [isEnabled, setIsEnabled] = useState3(true);
|
|
349
451
|
const { resolvedScope } = useResolvedScope({
|
|
@@ -351,6 +453,17 @@ function SecureDataProvider({
|
|
|
351
453
|
selectedOrganisationId: selectedOrganisation?.id || null,
|
|
352
454
|
selectedEventId: selectedEvent?.event_id || null
|
|
353
455
|
});
|
|
456
|
+
const validateContext = useCallback3(() => {
|
|
457
|
+
if (!secureSupabase) {
|
|
458
|
+
throw new Error("No Supabase client available");
|
|
459
|
+
}
|
|
460
|
+
if (!user) {
|
|
461
|
+
throw new Error("User must be authenticated");
|
|
462
|
+
}
|
|
463
|
+
if (!superAdminContext.isSuperAdmin && !resolvedScope?.organisationId) {
|
|
464
|
+
throw new Error("Organisation context is required for data access");
|
|
465
|
+
}
|
|
466
|
+
}, [secureSupabase, user, superAdminContext.isSuperAdmin, resolvedScope?.organisationId]);
|
|
354
467
|
const currentScope = resolvedScope;
|
|
355
468
|
const isDataAccessAllowed = useCallback3((table, operation, scope) => {
|
|
356
469
|
if (!isEnabled) return true;
|
|
@@ -626,7 +739,13 @@ function RoleBasedRouter({
|
|
|
626
739
|
user?.id || "",
|
|
627
740
|
currentScope || { organisationId: "", eventId: void 0, appId: void 0 },
|
|
628
741
|
currentRouteConfig?.permissions?.[0] || "read:page",
|
|
629
|
-
currentRouteConfig?.pageId
|
|
742
|
+
currentRouteConfig?.pageId,
|
|
743
|
+
true,
|
|
744
|
+
// useCache
|
|
745
|
+
null,
|
|
746
|
+
// precomputedSuperAdmin - not checked yet
|
|
747
|
+
void 0
|
|
748
|
+
// appName
|
|
630
749
|
);
|
|
631
750
|
const isPublicRoute = currentRouteConfig?.public === true;
|
|
632
751
|
const hasPermissions = currentRouteConfig?.permissions && currentRouteConfig.permissions.length > 0;
|
|
@@ -801,8 +920,12 @@ function NavigationProvider({
|
|
|
801
920
|
currentScope,
|
|
802
921
|
permission,
|
|
803
922
|
item.pageId,
|
|
804
|
-
true
|
|
923
|
+
true,
|
|
805
924
|
// useCache
|
|
925
|
+
null,
|
|
926
|
+
// precomputedSuperAdmin - not checked yet
|
|
927
|
+
void 0
|
|
928
|
+
// appName
|
|
806
929
|
);
|
|
807
930
|
if (error) {
|
|
808
931
|
logger.warn("NavigationProvider", `Permission check error for "${item.id}": ${error.message} - allowing access for graceful degradation`);
|
|
@@ -1135,7 +1258,18 @@ function PermissionGuard({
|
|
|
1135
1258
|
}
|
|
1136
1259
|
}
|
|
1137
1260
|
const effectiveUserId = userId ?? authContext?.user?.id ?? null;
|
|
1138
|
-
const { can, isLoading, error } = useCan(
|
|
1261
|
+
const { can, isLoading, error } = useCan(
|
|
1262
|
+
effectiveUserId || "",
|
|
1263
|
+
scope,
|
|
1264
|
+
permission,
|
|
1265
|
+
pageId,
|
|
1266
|
+
true,
|
|
1267
|
+
// useCache
|
|
1268
|
+
null,
|
|
1269
|
+
// precomputedSuperAdmin - not checked yet
|
|
1270
|
+
void 0
|
|
1271
|
+
// appName
|
|
1272
|
+
);
|
|
1139
1273
|
if (!effectiveUserId) {
|
|
1140
1274
|
logger2.error("PermissionGuard: No userId provided and could not infer from context");
|
|
1141
1275
|
return fallback ?? null;
|
|
@@ -1220,13 +1354,13 @@ function withPermissionGuard(config, handler) {
|
|
|
1220
1354
|
if (!userId || !organisationId) {
|
|
1221
1355
|
throw new Error("User context required for permission check");
|
|
1222
1356
|
}
|
|
1223
|
-
const { isPermitted: isPermitted2 } = await import("./api-
|
|
1357
|
+
const { isPermitted: isPermitted2 } = await import("./api-MVVQZLJI.js");
|
|
1224
1358
|
const hasPermission2 = await isPermitted2({
|
|
1225
1359
|
userId,
|
|
1226
1360
|
scope: { organisationId, eventId, appId },
|
|
1227
1361
|
permission: config.permission,
|
|
1228
1362
|
pageId: config.pageId
|
|
1229
|
-
});
|
|
1363
|
+
}, null, void 0, null);
|
|
1230
1364
|
if (!hasPermission2) {
|
|
1231
1365
|
throw new Error(`Permission denied: ${config.permission}`);
|
|
1232
1366
|
}
|
|
@@ -1243,7 +1377,7 @@ function withAccessLevelGuard(minLevel, handler) {
|
|
|
1243
1377
|
if (!userId || !organisationId) {
|
|
1244
1378
|
throw new Error("User context required for access level check");
|
|
1245
1379
|
}
|
|
1246
|
-
const { getAccessLevel: getAccessLevel2 } = await import("./api-
|
|
1380
|
+
const { getAccessLevel: getAccessLevel2 } = await import("./api-MVVQZLJI.js");
|
|
1247
1381
|
const accessLevel = await getAccessLevel2({
|
|
1248
1382
|
userId,
|
|
1249
1383
|
scope: { organisationId, eventId, appId }
|
|
@@ -1268,7 +1402,7 @@ function withRoleGuard(config, handler) {
|
|
|
1268
1402
|
throw new Error("User context required for role check");
|
|
1269
1403
|
}
|
|
1270
1404
|
if (config.globalRoles && config.globalRoles.length > 0) {
|
|
1271
|
-
const { isSuperAdmin } = await import("./api-
|
|
1405
|
+
const { isSuperAdmin } = await import("./api-MVVQZLJI.js");
|
|
1272
1406
|
const isSuper = await isSuperAdmin(userId);
|
|
1273
1407
|
if (isSuper) {
|
|
1274
1408
|
if (organisationId) {
|
|
@@ -1294,14 +1428,14 @@ function withRoleGuard(config, handler) {
|
|
|
1294
1428
|
}
|
|
1295
1429
|
}
|
|
1296
1430
|
if (config.organisationRoles && config.organisationRoles.length > 0) {
|
|
1297
|
-
const { isOrganisationAdmin } = await import("./api-
|
|
1431
|
+
const { isOrganisationAdmin } = await import("./api-MVVQZLJI.js");
|
|
1298
1432
|
const isOrgAdmin = await isOrganisationAdmin(userId, organisationId);
|
|
1299
1433
|
if (!isOrgAdmin && config.requireAll !== false) {
|
|
1300
1434
|
throw new Error(`Organisation admin role required`);
|
|
1301
1435
|
}
|
|
1302
1436
|
}
|
|
1303
1437
|
if (config.eventAppRoles && config.eventAppRoles.length > 0 && eventId && appId) {
|
|
1304
|
-
const { isEventAdmin } = await import("./api-
|
|
1438
|
+
const { isEventAdmin } = await import("./api-MVVQZLJI.js");
|
|
1305
1439
|
const isEventAdminUser = await isEventAdmin(userId, { organisationId, eventId, appId });
|
|
1306
1440
|
if (!isEventAdminUser && config.requireAll !== false) {
|
|
1307
1441
|
throw new Error(`Event admin role required`);
|
|
@@ -1341,13 +1475,13 @@ function createRBACMiddleware(config) {
|
|
|
1341
1475
|
);
|
|
1342
1476
|
if (protectedRoute) {
|
|
1343
1477
|
try {
|
|
1344
|
-
const { isPermitted: isPermitted2 } = await import("./api-
|
|
1478
|
+
const { isPermitted: isPermitted2 } = await import("./api-MVVQZLJI.js");
|
|
1345
1479
|
const hasPermission2 = await isPermitted2({
|
|
1346
1480
|
userId,
|
|
1347
1481
|
scope: { organisationId },
|
|
1348
1482
|
permission: protectedRoute.permission,
|
|
1349
1483
|
pageId: protectedRoute.pageId
|
|
1350
|
-
});
|
|
1484
|
+
}, null, void 0, null);
|
|
1351
1485
|
if (!hasPermission2) {
|
|
1352
1486
|
return res.redirect(config.fallbackUrl || "/access-denied");
|
|
1353
1487
|
}
|
|
@@ -1368,7 +1502,7 @@ function createRBACExpressMiddleware(config) {
|
|
|
1368
1502
|
return res.status(401).json({ error: "User context required" });
|
|
1369
1503
|
}
|
|
1370
1504
|
try {
|
|
1371
|
-
const { isPermitted: isPermitted2 } = await import("./api-
|
|
1505
|
+
const { isPermitted: isPermitted2 } = await import("./api-MVVQZLJI.js");
|
|
1372
1506
|
const hasPermission2 = await isPermitted2({
|
|
1373
1507
|
userId,
|
|
1374
1508
|
scope: { organisationId, eventId, appId },
|
|
@@ -1496,12 +1630,6 @@ function isValidPermission(permission) {
|
|
|
1496
1630
|
const pattern = /^(read|create|update|delete):[a-z0-9]+(\.[a-z0-9]+)*$|^(read|create|update|delete):\*$/;
|
|
1497
1631
|
return pattern.test(permission);
|
|
1498
1632
|
}
|
|
1499
|
-
function getPermissionsForRole(role) {
|
|
1500
|
-
log3.warn(
|
|
1501
|
-
`getPermissionsForRole() is deprecated. Permissions must be queried from rbac_page_permissions table. Called with role: ${role}`
|
|
1502
|
-
);
|
|
1503
|
-
return [];
|
|
1504
|
-
}
|
|
1505
1633
|
var ALL_PERMISSIONS = {
|
|
1506
1634
|
...GLOBAL_PERMISSIONS,
|
|
1507
1635
|
...ORGANISATION_PERMISSIONS,
|
|
@@ -1883,7 +2011,6 @@ export {
|
|
|
1883
2011
|
EVENT_APP_PERMISSIONS,
|
|
1884
2012
|
PAGE_PERMISSIONS,
|
|
1885
2013
|
isValidPermission,
|
|
1886
|
-
getPermissionsForRole,
|
|
1887
2014
|
ALL_PERMISSIONS,
|
|
1888
2015
|
isRBACInitialized,
|
|
1889
2016
|
getSetupIssues,
|
|
@@ -1897,4 +2024,4 @@ export {
|
|
|
1897
2024
|
getDirectSupabaseAuthFixes,
|
|
1898
2025
|
getQuickFixes
|
|
1899
2026
|
};
|
|
1900
|
-
//# sourceMappingURL=chunk-
|
|
2027
|
+
//# sourceMappingURL=chunk-6J4GEEJR.js.map
|