@jmruthers/pace-core 0.5.193 → 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 +62 -0
- package/README.md +7 -1
- package/cursor-rules/00-pace-core-compliance.mdc +299 -0
- package/cursor-rules/01-standards-compliance.mdc +244 -0
- package/cursor-rules/02-project-structure.mdc +200 -0
- package/cursor-rules/03-solid-principles.mdc +222 -0
- package/cursor-rules/04-testing-standards.mdc +268 -0
- package/cursor-rules/05-bug-reports-and-features.mdc +246 -0
- package/cursor-rules/06-code-quality.mdc +309 -0
- package/cursor-rules/07-tech-stack-compliance.mdc +214 -0
- package/cursor-rules/08-markup-quality.mdc +452 -0
- package/cursor-rules/CHANGELOG.md +119 -0
- package/cursor-rules/README.md +192 -0
- package/dist/{AuthService-DjnJHDtC.d.ts → AuthService-BPvc3Ka0.d.ts} +54 -0
- package/dist/{DataTable-Be6dH_dR.d.ts → DataTable-BMRU8a1j.d.ts} +34 -2
- package/dist/{DataTable-5FU7IESH.js → DataTable-TPTKCX4D.js} +10 -9
- package/dist/{PublicPageProvider-C0Sm_e5k.d.ts → PublicPageProvider-DC6kCaqf.d.ts} +385 -261
- package/dist/{UnifiedAuthProvider-RGJTDE2C.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-HWIIPPNI.js → chunk-2UOI2FG5.js} +20 -20
- package/dist/chunk-2UOI2FG5.js.map +1 -0
- package/dist/{chunk-E3SPN4VZ 5.js → chunk-3XC4CPTD.js} +4345 -3986
- package/dist/chunk-3XC4CPTD.js.map +1 -0
- package/dist/{chunk-7EQTDTTJ.js → chunk-6J4GEEJR.js} +172 -45
- package/dist/chunk-6J4GEEJR.js.map +1 -0
- package/dist/{chunk-6C4YBBJM 5.js → chunk-6SOIHG6Z.js} +1 -1
- package/dist/chunk-6SOIHG6Z.js.map +1 -0
- package/dist/{chunk-7FLMSG37.js → chunk-EHMR7VYL.js} +25 -25
- 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-QWWZ5CAQ.js → chunk-FFQEQTNW.js} +7 -9
- 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-HW3OVDUF.js → chunk-J36DSWQK.js} +1 -1
- package/dist/{chunk-HW3OVDUF.js.map → chunk-J36DSWQK.js.map} +1 -1
- package/dist/{chunk-SQGMNID3.js → chunk-L4OXEN46.js} +4 -5
- package/dist/chunk-L4OXEN46.js.map +1 -0
- package/dist/{chunk-R77UEZ4E 3.js → chunk-M43Y4SSO.js} +1 -1
- package/dist/chunk-M43Y4SSO.js.map +1 -0
- package/dist/{chunk-IIELH4DL.js → chunk-MMZ7JXPU.js} +60 -223
- package/dist/chunk-MMZ7JXPU.js.map +1 -0
- package/dist/{chunk-NOAYCWCX 5.js → chunk-NECFR5MM.js} +394 -312
- package/dist/chunk-NECFR5MM.js.map +1 -0
- package/dist/{chunk-BC4IJKSL.js → chunk-SFZUDBL5.js} +40 -4
- package/dist/chunk-SFZUDBL5.js.map +1 -0
- package/dist/{chunk-XNXXZ43G.js → chunk-XWQCNGTQ.js} +748 -364
- package/dist/chunk-XWQCNGTQ.js.map +1 -0
- package/dist/components.d.ts +6 -6
- package/dist/components.js +15 -12
- 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 +59 -126
- package/dist/hooks.js +19 -28
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +63 -16
- package/dist/index.js +23 -24
- 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 +146 -115
- 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-TZe0gy-4.d.ts → usePublicRouteParams-1oMokgLF.d.ts} +34 -4
- package/dist/{useToast-C8gR5ir4.d.ts → useToast-AyaT-x7p.d.ts} +2 -2
- package/dist/utils.d.ts +4 -5
- package/dist/utils.js +15 -15
- 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 +263 -0
- package/docs/getting-started/installation-guide.md +6 -1
- package/docs/getting-started/quick-start.md +6 -1
- package/docs/migration/DOCUMENTATION_STRUCTURE.md +441 -0
- package/docs/migration/MIGRATION_GUIDE.md +6 -28
- package/docs/migration/README.md +52 -6
- package/docs/migration/V0.5.190_TO_V0.6.1_MIGRATION.md +1153 -0
- package/docs/migration/V0.6.0_REACT_19_MIGRATION.md +227 -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 +40 -0
- package/docs/troubleshooting/migration.md +4 -4
- package/examples/PublicPages/PublicEventPage.tsx +1 -1
- package/package.json +12 -6
- 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} +737 -691
- 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 +86 -0
- 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/install-cursor-rules.cjs +236 -0
- 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__/helpers/test-providers.tsx +1 -1
- package/src/__tests__/helpers/test-utils.tsx +1 -1
- 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 +16 -4
- package/src/components/Button/Button.tsx +27 -4
- package/src/components/Calendar/Calendar.tsx +9 -3
- 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.test.tsx +57 -93
- package/src/components/DataTable/DataTable.tsx +40 -6
- package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +5 -6
- package/src/components/DataTable/__tests__/pagination.modes.test.tsx +29 -7
- package/src/components/DataTable/__tests__/ssr.strict-mode.test.tsx +12 -12
- package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +2 -3
- package/src/components/DataTable/components/AccessDeniedPage.tsx +17 -26
- package/src/components/DataTable/components/ActionButtons.tsx +10 -7
- package/src/components/DataTable/components/BulkOperationsDropdown.tsx +2 -2
- 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 +200 -561
- 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 +9 -1
- 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 +9 -1
- 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 +62 -852
- 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/__tests__/DataTableModals.test.tsx +23 -23
- package/src/components/DataTable/components/__tests__/EditableRow.test.tsx +11 -11
- package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +36 -36
- package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +27 -27
- package/src/components/DataTable/components/__tests__/ImportModal.test.tsx +39 -39
- package/src/components/DataTable/components/__tests__/UnifiedTableBody.test.tsx +33 -33
- package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +29 -29
- package/src/components/DataTable/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 +14 -2
- 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/useKeyboardNavigation.ts +2 -2
- 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/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +8 -14
- package/src/components/Dialog/Dialog.tsx +8 -7
- package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +180 -1
- package/src/components/ErrorBoundary/ErrorBoundary.tsx +46 -6
- package/src/components/ErrorBoundary/ErrorBoundaryContext.tsx +129 -0
- package/src/components/ErrorBoundary/index.ts +27 -2
- package/src/components/EventSelector/EventSelector.tsx +4 -1
- package/src/components/FileDisplay/FileDisplay.test.tsx +2 -2
- 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 +15 -12
- package/src/components/Form/Form.test.tsx +36 -15
- package/src/components/Form/Form.tsx +31 -26
- package/src/components/Header/Header.tsx +22 -11
- package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +40 -40
- package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +1 -1
- package/src/components/Input/Input.test.tsx +2 -2
- package/src/components/Input/Input.tsx +36 -34
- package/src/components/Label/Label.tsx +1 -1
- package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +4 -4
- package/src/components/LoadingSpinner/LoadingSpinner.tsx +1 -1
- package/src/components/LoginForm/LoginForm.test.tsx +42 -42
- package/src/components/LoginForm/LoginForm.tsx +12 -8
- package/src/components/NavigationMenu/NavigationMenu.tsx +15 -514
- 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.performance.test.tsx +1 -1
- package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +54 -52
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +33 -12
- package/src/components/PaceAppLayout/README.md +1 -1
- package/src/components/PaceAppLayout/test-setup.tsx +1 -2
- package/src/components/PaceLoginPage/PaceLoginPage.tsx +4 -1
- package/src/components/PasswordChange/PasswordChangeForm.test.tsx +33 -33
- package/src/components/PasswordChange/PasswordChangeForm.tsx +10 -1
- package/src/components/Progress/Progress.tsx +1 -1
- package/src/components/ProtectedRoute/ProtectedRoute.tsx +3 -9
- package/src/components/PublicLayout/PublicPageLayout.tsx +3 -6
- package/src/components/PublicLayout/PublicPageProvider.tsx +4 -0
- package/src/components/Select/Select.tsx +95 -438
- 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 +5 -6
- package/src/components/Switch/Switch.tsx +4 -4
- package/src/components/Table/Table.tsx +1 -1
- package/src/components/Tabs/Tabs.tsx +1 -1
- package/src/components/Textarea/Textarea.tsx +27 -29
- package/src/components/Toast/Toast.tsx +5 -1
- package/src/components/Tooltip/Tooltip.tsx +3 -3
- package/src/components/UserMenu/UserMenu.test.tsx +24 -11
- package/src/components/UserMenu/UserMenu.tsx +22 -19
- package/src/components/index.ts +2 -2
- package/src/hooks/__tests__/hooks.integration.test.tsx +80 -55
- package/src/hooks/__tests__/index.unit.test.ts +2 -5
- package/src/hooks/__tests__/useStorage.unit.test.ts +36 -36
- package/src/hooks/index.ts +1 -2
- package/src/hooks/public/usePublicEvent.ts +5 -1
- package/src/hooks/public/usePublicEventLogo.ts +5 -1
- package/src/hooks/public/usePublicFileDisplay.ts +4 -0
- package/src/hooks/public/usePublicRouteParams.ts +5 -1
- 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/useDataTableState.ts +8 -18
- 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 +16 -2
- package/src/hooks/useFocusTrap.ts +7 -4
- package/src/hooks/useFormDialog.ts +8 -7
- package/src/hooks/useInactivityTracker.ts +4 -1
- 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 +8 -1
- 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 +3 -3
- package/src/index.ts +2 -1
- package/src/providers/__tests__/OrganisationProvider.test.tsx +115 -49
- package/src/providers/__tests__/ProviderLifecycle.test.tsx +21 -6
- package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +10 -10
- 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 +58 -22
- package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +33 -7
- package/src/rbac/README.md +1 -1
- package/src/rbac/__tests__/adapters.comprehensive.test.tsx +26 -26
- 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/EnhancedNavigationMenu.tsx +1 -1
- package/src/rbac/components/NavigationGuard.tsx +1 -1
- package/src/rbac/components/NavigationProvider.tsx +5 -2
- package/src/rbac/components/PagePermissionGuard.tsx +158 -18
- package/src/rbac/components/PagePermissionProvider.tsx +1 -1
- package/src/rbac/components/PermissionEnforcer.tsx +1 -1
- package/src/rbac/components/RoleBasedRouter.tsx +6 -2
- package/src/rbac/components/SecureDataProvider.test.tsx +84 -49
- package/src/rbac/components/SecureDataProvider.tsx +21 -6
- 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 +212 -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/src/utils/security/secureDataAccess.test.ts +31 -20
- package/src/utils/security/secureDataAccess.ts +4 -3
- package/dist/chunk-6C4YBBJM.js +0 -628
- package/dist/chunk-6C4YBBJM.js.map +0 -1
- package/dist/chunk-7D4SUZUM.js 2.map +0 -1
- package/dist/chunk-7EQTDTTJ.js 2.map +0 -1
- package/dist/chunk-7EQTDTTJ.js.map +0 -1
- package/dist/chunk-7FLMSG37.js 2.map +0 -1
- package/dist/chunk-7FLMSG37.js.map +0 -1
- package/dist/chunk-BC4IJKSL.js.map +0 -1
- package/dist/chunk-E3SPN4VZ.js +0 -12917
- package/dist/chunk-E3SPN4VZ.js.map +0 -1
- package/dist/chunk-E66EQZE6 5.js +0 -37
- package/dist/chunk-E66EQZE6.js 2.map +0 -1
- package/dist/chunk-HWIIPPNI.js.map +0 -1
- package/dist/chunk-I7PSE6JW 5.js +0 -191
- package/dist/chunk-I7PSE6JW.js 2.map +0 -1
- package/dist/chunk-I7PSE6JW.js.map +0 -1
- package/dist/chunk-IIELH4DL.js.map +0 -1
- package/dist/chunk-KNC55RTG.js 5.map +0 -1
- package/dist/chunk-KNC55RTG.js.map +0 -1
- package/dist/chunk-KQCRWDSA.js 5.map +0 -1
- package/dist/chunk-LFNCN2SP.js +0 -412
- package/dist/chunk-LFNCN2SP.js 2.map +0 -1
- package/dist/chunk-LFNCN2SP.js.map +0 -1
- package/dist/chunk-LMC26NLJ 2.js +0 -84
- package/dist/chunk-NOAYCWCX.js +0 -4993
- package/dist/chunk-NOAYCWCX.js.map +0 -1
- package/dist/chunk-QWWZ5CAQ.js 3.map +0 -1
- package/dist/chunk-QWWZ5CAQ.js.map +0 -1
- package/dist/chunk-QXHPKYJV 3.js +0 -113
- package/dist/chunk-R77UEZ4E.js +0 -68
- package/dist/chunk-R77UEZ4E.js.map +0 -1
- package/dist/chunk-SQGMNID3.js.map +0 -1
- package/dist/chunk-VBXEHIUJ.js 6.map +0 -1
- package/dist/chunk-XNXXZ43G.js.map +0 -1
- package/dist/chunk-ZSAAAMVR 6.js +0 -25
- package/dist/components.js 5.map +0 -1
- package/dist/styles/index 2.js +0 -12
- package/dist/styles/index.js 5.map +0 -1
- package/dist/theming/runtime 5.js +0 -19
- package/dist/theming/runtime.js 5.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 -666
- /package/dist/{DataTable-5FU7IESH.js.map → DataTable-TPTKCX4D.js.map} +0 -0
- /package/dist/{UnifiedAuthProvider-RGJTDE2C.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/examples/{rbac → RBAC}/CompleteRBACExample.tsx +0 -0
- /package/examples/{rbac → RBAC}/EventBasedApp.tsx +0 -0
- /package/examples/{rbac → RBAC}/PermissionExample.tsx +0 -0
- /package/examples/{rbac → RBAC}/index.ts +0 -0
|
@@ -123,6 +123,167 @@ The RBAC system uses a **single source of truth** approach:
|
|
|
123
123
|
- All functions use `rbac_organisation_roles` table for role management
|
|
124
124
|
- Views inherit RLS policies from the underlying `rbac_organisation_roles` table
|
|
125
125
|
|
|
126
|
+
## App Access Tables Architecture
|
|
127
|
+
|
|
128
|
+
The system uses three complementary tables to manage app availability and user permissions:
|
|
129
|
+
|
|
130
|
+
### Table Relationship Overview
|
|
131
|
+
|
|
132
|
+
| Table | Purpose | Question It Answers |
|
|
133
|
+
|-------|---------|-------------------|
|
|
134
|
+
| `core_organisation_app_access` | Organisation-level app configuration | "Is this app available for this organisation?" |
|
|
135
|
+
| `core_event_app_access` | Event-level app availability | "Is this app available for this event?" |
|
|
136
|
+
| `rbac_event_app_roles` | User-specific role grants | "Who can do what for this event-app?" |
|
|
137
|
+
|
|
138
|
+
### 1. `core_organisation_app_access`
|
|
139
|
+
|
|
140
|
+
**Purpose:** Organisation-level app configuration and feature flags.
|
|
141
|
+
|
|
142
|
+
**Schema:**
|
|
143
|
+
```sql
|
|
144
|
+
CREATE TABLE core_organisation_app_access (
|
|
145
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
146
|
+
organisation_id UUID NOT NULL REFERENCES core_organisations(id) ON DELETE CASCADE,
|
|
147
|
+
app_id UUID NOT NULL REFERENCES rbac_apps(id),
|
|
148
|
+
is_enabled BOOLEAN DEFAULT true,
|
|
149
|
+
settings JSONB DEFAULT '{}',
|
|
150
|
+
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
151
|
+
updated_at TIMESTAMPTZ DEFAULT NOW(),
|
|
152
|
+
created_by UUID REFERENCES auth.users(id),
|
|
153
|
+
updated_by UUID REFERENCES auth.users(id)
|
|
154
|
+
);
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
**Use Cases:**
|
|
158
|
+
- Enable/disable apps at the organisation level
|
|
159
|
+
- Store organisation-specific app settings (e.g., feature flags, configuration)
|
|
160
|
+
- Control which apps are available to an organisation
|
|
161
|
+
|
|
162
|
+
**Key Characteristics:**
|
|
163
|
+
- Organisation-scoped (one record per organisation-app combination)
|
|
164
|
+
- Contains `is_enabled` flag for feature toggling
|
|
165
|
+
- Contains `settings` JSONB field for app-specific configuration
|
|
166
|
+
|
|
167
|
+
### 2. `core_event_app_access`
|
|
168
|
+
|
|
169
|
+
**Purpose:** Event-level app availability flag.
|
|
170
|
+
|
|
171
|
+
**Schema:**
|
|
172
|
+
```sql
|
|
173
|
+
CREATE TABLE core_event_app_access (
|
|
174
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
175
|
+
event_id VARCHAR NOT NULL REFERENCES core_events(event_id),
|
|
176
|
+
app_id UUID NOT NULL REFERENCES rbac_apps(id) ON DELETE CASCADE,
|
|
177
|
+
organisation_id UUID NOT NULL REFERENCES core_organisations(id),
|
|
178
|
+
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
179
|
+
updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
180
|
+
created_by UUID REFERENCES auth.users(id),
|
|
181
|
+
updated_by UUID REFERENCES auth.users(id),
|
|
182
|
+
CONSTRAINT core_event_app_access_unique UNIQUE (event_id, app_id, organisation_id)
|
|
183
|
+
);
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
**Use Cases:**
|
|
187
|
+
- Enable an app for a specific event
|
|
188
|
+
- Track which apps are available for each event
|
|
189
|
+
- Quick check: "Is this app enabled for this event?"
|
|
190
|
+
|
|
191
|
+
**Key Characteristics:**
|
|
192
|
+
- Event-scoped (one record per event-app-organisation combination)
|
|
193
|
+
- Unique constraint prevents duplicate entries
|
|
194
|
+
- Simple boolean flag (existence = enabled)
|
|
195
|
+
|
|
196
|
+
### 3. `rbac_event_app_roles`
|
|
197
|
+
|
|
198
|
+
**Purpose:** User-specific role grants for event-app combinations.
|
|
199
|
+
|
|
200
|
+
**Schema:**
|
|
201
|
+
```sql
|
|
202
|
+
CREATE TABLE rbac_event_app_roles (
|
|
203
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
204
|
+
user_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
|
|
205
|
+
event_id VARCHAR NOT NULL REFERENCES core_events(event_id) ON DELETE CASCADE,
|
|
206
|
+
app_id UUID NOT NULL REFERENCES rbac_apps(id),
|
|
207
|
+
organisation_id UUID NOT NULL REFERENCES core_organisations(id),
|
|
208
|
+
role rbac_event_app_role NOT NULL, -- ENUM: 'viewer', 'participant', 'planner', 'event_admin'
|
|
209
|
+
status TEXT NOT NULL DEFAULT 'active' CHECK (status IN ('active', 'inactive', 'suspended')),
|
|
210
|
+
granted_at TIMESTAMPTZ DEFAULT NOW(),
|
|
211
|
+
granted_by UUID REFERENCES auth.users(id),
|
|
212
|
+
valid_from TIMESTAMPTZ DEFAULT NOW(),
|
|
213
|
+
valid_to TIMESTAMPTZ,
|
|
214
|
+
CONSTRAINT rbac_event_app_roles_unique UNIQUE (user_id, event_id, app_id, role)
|
|
215
|
+
);
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
**Use Cases:**
|
|
219
|
+
- Grant specific roles to users for event-app combinations
|
|
220
|
+
- Control what users can do (viewer, participant, planner, event_admin)
|
|
221
|
+
- Time-based role validity (valid_from, valid_to)
|
|
222
|
+
- Role status management (active, inactive, suspended)
|
|
223
|
+
|
|
224
|
+
**Key Characteristics:**
|
|
225
|
+
- User-scoped (one record per user-event-app-role combination)
|
|
226
|
+
- Includes role hierarchy and permissions
|
|
227
|
+
- Time-based validity support
|
|
228
|
+
- Status tracking for role lifecycle
|
|
229
|
+
|
|
230
|
+
### Relationship Summary
|
|
231
|
+
|
|
232
|
+
**Access Tables = "Is this app available?"**
|
|
233
|
+
- `core_organisation_app_access`: Organisation-level availability and settings
|
|
234
|
+
- `core_event_app_access`: Event-level availability flag
|
|
235
|
+
|
|
236
|
+
**Roles Table = "Who can do what?"**
|
|
237
|
+
- `rbac_event_app_roles`: User-specific role grants with permissions
|
|
238
|
+
|
|
239
|
+
### Important Notes
|
|
240
|
+
|
|
241
|
+
1. **Separation of Concerns:**
|
|
242
|
+
- Access tables handle **configuration** (feature flags, availability)
|
|
243
|
+
- Roles table handles **authorization** (user permissions)
|
|
244
|
+
|
|
245
|
+
2. **Independence:**
|
|
246
|
+
- Access records can exist without roles (app enabled, no users yet)
|
|
247
|
+
- Roles can exist without access records (legacy data or data inconsistency)
|
|
248
|
+
- These are intentionally independent to allow flexible configuration
|
|
249
|
+
|
|
250
|
+
3. **Performance:**
|
|
251
|
+
- Access tables provide fast feature flag checks without querying user roles
|
|
252
|
+
- Roles table provides detailed permission information when needed
|
|
253
|
+
|
|
254
|
+
4. **Data Integrity:**
|
|
255
|
+
- `core_event_app_access` has unique constraint on `(event_id, app_id, organisation_id)`
|
|
256
|
+
- `rbac_event_app_roles` has unique constraint on `(user_id, event_id, app_id, role)`
|
|
257
|
+
|
|
258
|
+
### Example Usage Patterns
|
|
259
|
+
|
|
260
|
+
```sql
|
|
261
|
+
-- Check if app is available for an event (configuration check)
|
|
262
|
+
SELECT EXISTS (
|
|
263
|
+
SELECT 1 FROM core_event_app_access
|
|
264
|
+
WHERE event_id = 'event-123'
|
|
265
|
+
AND app_id = 'app-456'
|
|
266
|
+
AND organisation_id = 'org-789'
|
|
267
|
+
);
|
|
268
|
+
|
|
269
|
+
-- Check if user has access to an event-app (authorization check)
|
|
270
|
+
SELECT EXISTS (
|
|
271
|
+
SELECT 1 FROM rbac_event_app_roles
|
|
272
|
+
WHERE user_id = 'user-abc'
|
|
273
|
+
AND event_id = 'event-123'
|
|
274
|
+
AND app_id = 'app-456'
|
|
275
|
+
AND status = 'active'
|
|
276
|
+
AND valid_from <= NOW()
|
|
277
|
+
AND (valid_to IS NULL OR valid_to > NOW())
|
|
278
|
+
);
|
|
279
|
+
|
|
280
|
+
-- Get organisation-level app settings
|
|
281
|
+
SELECT settings FROM core_organisation_app_access
|
|
282
|
+
WHERE organisation_id = 'org-789'
|
|
283
|
+
AND app_id = 'app-456'
|
|
284
|
+
AND is_enabled = true;
|
|
285
|
+
```
|
|
286
|
+
|
|
126
287
|
## Required RPC Functions
|
|
127
288
|
|
|
128
289
|
The following RPC functions are required and should be updated to use the correct tables/views:
|
|
@@ -10,7 +10,7 @@ reviewedBy: documentation-standards-audit
|
|
|
10
10
|
|
|
11
11
|
PACE Core provides a comprehensive Role-Based Access Control (RBAC) system that manages user permissions through roles, ensuring secure and scalable access control across your application.
|
|
12
12
|
|
|
13
|
-
> **🔄 Migrating?** If you're upgrading from the legacy RBAC system, see the [Migration Guide](../migration/
|
|
13
|
+
> **🔄 Migrating?** If you're upgrading from the legacy RBAC system, see the [Migration Guide](../migration/V0.4.0_rbac-migration.md) for step-by-step instructions.
|
|
14
14
|
|
|
15
15
|
> **⚠️ IMPORTANT**: You **must** call `setupRBAC()` before using any RBAC features. See the [Quick Start Guide](../rbac/quick-start.md) for setup instructions.
|
|
16
16
|
|
|
@@ -278,7 +278,7 @@ If you're upgrading from a system with hardcoded permissions:
|
|
|
278
278
|
3. **Replace 'manage' Operations** - Use specific CRUD operations instead
|
|
279
279
|
4. **Enable Cache Invalidation** - Ensure realtime subscriptions are active
|
|
280
280
|
|
|
281
|
-
For detailed migration instructions, see the **[RBAC Migration Guide](../migration/
|
|
281
|
+
For detailed migration instructions, see the **[RBAC Migration Guide](../migration/V0.4.0_rbac-migration.md)**.
|
|
282
282
|
|
|
283
283
|
## What's Next?
|
|
284
284
|
|
|
@@ -286,7 +286,7 @@ For detailed migration instructions, see the **[RBAC Migration Guide](../migrati
|
|
|
286
286
|
- **[RBAC Quick Start](../rbac/quick-start.md)** - Build your first RBAC-enabled app
|
|
287
287
|
- **[RBAC API Reference](../rbac/api-reference.md)** - Complete API documentation
|
|
288
288
|
- **[RBAC Examples](../rbac/examples.md)** - Practical usage examples
|
|
289
|
-
- **[Migration Guide](../migration/
|
|
289
|
+
- **[Migration Guide](../migration/V0.4.0_rbac-migration.md)** - Migrate from legacy RBAC
|
|
290
290
|
- **[Installation](../getting-started/installation-guide.md)** - Get PACE Core set up
|
|
291
291
|
- **[Authentication](./authentication.md)** - Understand authentication system
|
|
292
292
|
- **[Organisations](./organisations.md)** - Learn about multi-tenancy
|
|
@@ -96,10 +96,8 @@ This index mirrors the folder layout in `packages/core/docs/` so teams can quick
|
|
|
96
96
|
|
|
97
97
|
- [Migration overview](./migration/README.md)
|
|
98
98
|
- [Unified migration guide](./migration/MIGRATION_GUIDE.md)
|
|
99
|
-
- [
|
|
100
|
-
- [
|
|
101
|
-
- [Service architecture changes](./migration/service-architecture.md)
|
|
102
|
-
- [RBAC migration](./migration/rbac-migration.md)
|
|
99
|
+
- [Organisation context timing fix](./migration/V0.3.44_organisation-context-timing-fix.md)
|
|
100
|
+
- [RBAC migration](./migration/V0.4.0_rbac-migration.md)
|
|
103
101
|
- [Tailwind scanning updates](./migration/v0.4.15-tailwind-scanning.md)
|
|
104
102
|
- [CSS-first migration (v0.4.16)](./migration/v0.4.16-css-first-approach.md)
|
|
105
103
|
- [Source path fix (v0.4.17)](./migration/v0.4.17-source-path-fix.md)
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
# Cursor Rules Quick Start Guide
|
|
2
|
+
|
|
3
|
+
This guide helps you get started with pace-core cursor rules in your consuming app.
|
|
4
|
+
|
|
5
|
+
## What are Cursor Rules?
|
|
6
|
+
|
|
7
|
+
Cursor rules are `.mdc` (Markdown Cursor) files that guide AI assistants (like Cursor) to follow specific patterns and standards when writing code. pace-core provides a comprehensive set of rules that ensure your app maintains quality, consistency, and compliance with pace-core standards.
|
|
8
|
+
|
|
9
|
+
## Installation
|
|
10
|
+
|
|
11
|
+
### Step 1: Install pace-core
|
|
12
|
+
|
|
13
|
+
Make sure pace-core is installed in your project:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm install @jmruthers/pace-core
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### Step 2: Install Cursor Rules
|
|
20
|
+
|
|
21
|
+
Run the installation script from your app root:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
node node_modules/@jmruthers/pace-core/scripts/install-cursor-rules.cjs
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Or add to your `package.json`:
|
|
28
|
+
|
|
29
|
+
```json
|
|
30
|
+
{
|
|
31
|
+
"scripts": {
|
|
32
|
+
"setup:cursor-rules": "node node_modules/@jmruthers/pace-core/scripts/install-cursor-rules.cjs"
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Then run:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
npm run setup:cursor-rules
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
The script will:
|
|
44
|
+
- Create `.cursor/rules/` directory if it doesn't exist
|
|
45
|
+
- Copy all pace-core rules (00-08) to your project
|
|
46
|
+
- **Automatically update** pace-core rules (00-09) if they've changed
|
|
47
|
+
- Preserve any existing custom rules (50+)
|
|
48
|
+
- Skip files that are already up to date
|
|
49
|
+
|
|
50
|
+
## Quick Start Snippet
|
|
51
|
+
|
|
52
|
+
When working with Cursor, you can explicitly reference rules:
|
|
53
|
+
|
|
54
|
+
> "Use pace-core components and follow rules 00–04."
|
|
55
|
+
|
|
56
|
+
This helps Cursor focus on specific rule sets and ensures consistency.
|
|
57
|
+
|
|
58
|
+
## Rule Files Overview
|
|
59
|
+
|
|
60
|
+
The installed rules are numbered for ordering:
|
|
61
|
+
|
|
62
|
+
- **00-pace-core-compliance.mdc** - Enforce pace-core usage patterns
|
|
63
|
+
- **01-standards-compliance.mdc** - Enforce all pace-core standards
|
|
64
|
+
- **02-project-structure.mdc** - Define standard folder structure
|
|
65
|
+
- **03-solid-principles.mdc** - Enforce SOLID architecture principles
|
|
66
|
+
- **04-testing-standards.mdc** - Enforce testing framework consistency
|
|
67
|
+
- **05-bug-reports-and-features.mdc** - Templates for bug reports (guidance-only)
|
|
68
|
+
- **06-code-quality.mdc** - Enforce code quality standards
|
|
69
|
+
- **07-tech-stack-compliance.mdc** - Enforce tech stack versions and patterns
|
|
70
|
+
- **08-markup-quality.mdc** - Enforce clean markup standards, semantic HTML usage, and pace-core component patterns
|
|
71
|
+
|
|
72
|
+
## Using Rules with Cursor
|
|
73
|
+
|
|
74
|
+
### Automatic Loading
|
|
75
|
+
|
|
76
|
+
Cursor automatically loads all `.mdc` files from `.cursor/rules/` when:
|
|
77
|
+
- You open a file that matches the rule's `globs` pattern
|
|
78
|
+
- You ask Cursor to write or modify code
|
|
79
|
+
- Cursor needs context for code generation
|
|
80
|
+
|
|
81
|
+
### Explicit References
|
|
82
|
+
|
|
83
|
+
You can explicitly reference rules in your prompts:
|
|
84
|
+
|
|
85
|
+
```
|
|
86
|
+
"Create a new component following rules 00, 01, and 03"
|
|
87
|
+
"Refactor this code to follow SOLID principles (rule 03)"
|
|
88
|
+
"Write tests following rule 04"
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Rule Semantics
|
|
92
|
+
|
|
93
|
+
Rules use clear semantics:
|
|
94
|
+
- **MUST** - Hard requirement, non-negotiable
|
|
95
|
+
- **SHOULD** - Strong recommendation, best practice
|
|
96
|
+
- **MAY** - Optional, acceptable alternative
|
|
97
|
+
|
|
98
|
+
## Custom Rules
|
|
99
|
+
|
|
100
|
+
### Creating Your Own Rules
|
|
101
|
+
|
|
102
|
+
Create your own rules in `.cursor/rules/` with numbers starting at `50`:
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
.cursor/rules/
|
|
106
|
+
├── 00-pace-core-compliance.mdc # pace-core rule
|
|
107
|
+
├── 01-standards-compliance.mdc # pace-core rule
|
|
108
|
+
├── ...
|
|
109
|
+
├── 50-my-custom-rule.mdc # Your custom rule
|
|
110
|
+
└── 51-another-custom-rule.mdc # Your custom rule
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### Rule Format
|
|
114
|
+
|
|
115
|
+
Your custom rules should follow the same format:
|
|
116
|
+
|
|
117
|
+
```markdown
|
|
118
|
+
---
|
|
119
|
+
description: Brief description of your rule
|
|
120
|
+
globs: ["targeted/path/**/*.{ts,tsx}"]
|
|
121
|
+
alwaysApply: true
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
# Your Rule Title
|
|
125
|
+
|
|
126
|
+
Content with examples and guidelines.
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## Running Audits
|
|
130
|
+
|
|
131
|
+
### Comprehensive Audit
|
|
132
|
+
|
|
133
|
+
Run the comprehensive audit tool to check compliance:
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
node node_modules/@jmruthers/pace-core/scripts/audit-consuming-app.cjs
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Or add to your `package.json`:
|
|
140
|
+
|
|
141
|
+
```json
|
|
142
|
+
{
|
|
143
|
+
"scripts": {
|
|
144
|
+
"audit:pace-core": "node node_modules/@jmruthers/pace-core/scripts/audit-consuming-app.cjs"
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
This generates a timestamped markdown report in `audit/` directory.
|
|
150
|
+
|
|
151
|
+
### Compliance Check
|
|
152
|
+
|
|
153
|
+
For a quick compliance check:
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
node node_modules/@jmruthers/pace-core/scripts/check-pace-core-compliance.cjs
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
## Updating Rules
|
|
160
|
+
|
|
161
|
+
When pace-core is updated, run the installation script again:
|
|
162
|
+
|
|
163
|
+
```bash
|
|
164
|
+
npm run setup:cursor-rules
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
The script will:
|
|
168
|
+
- **Automatically update** pace-core rules (00-09) if they've changed (version or content differs)
|
|
169
|
+
- Preserve your custom rules (50+)
|
|
170
|
+
- Skip files that are already up to date
|
|
171
|
+
|
|
172
|
+
### Force Update
|
|
173
|
+
|
|
174
|
+
To force update all rules (even when versions match):
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
node node_modules/@jmruthers/pace-core/scripts/install-cursor-rules.cjs --force
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
**Note**: Normally, pace-core rules are automatically updated when they change. The `--force` flag forces an update even when versions match (useful if content changed but version metadata wasn't updated).
|
|
181
|
+
|
|
182
|
+
## Monorepo Setup
|
|
183
|
+
|
|
184
|
+
For monorepos, run the installation script from each app's root directory:
|
|
185
|
+
|
|
186
|
+
```
|
|
187
|
+
monorepo/
|
|
188
|
+
├── apps/
|
|
189
|
+
│ ├── app1/
|
|
190
|
+
│ │ └── .cursor/rules/ # Run script here
|
|
191
|
+
│ └── app2/
|
|
192
|
+
│ └── .cursor/rules/ # Run script here
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
Each app maintains its own `.cursor/rules/` directory.
|
|
196
|
+
|
|
197
|
+
## Troubleshooting
|
|
198
|
+
|
|
199
|
+
### Rules Not Loading
|
|
200
|
+
|
|
201
|
+
1. Verify rules are in `.cursor/rules/` directory
|
|
202
|
+
2. Check file extensions are `.mdc`
|
|
203
|
+
3. Restart Cursor if rules were just installed
|
|
204
|
+
4. Check rule frontmatter is valid YAML
|
|
205
|
+
|
|
206
|
+
### Rules Conflicting
|
|
207
|
+
|
|
208
|
+
1. Check rule numbering (pace-core: 00-09, yours: 50+)
|
|
209
|
+
2. Verify `globs` patterns don't overlap unnecessarily
|
|
210
|
+
3. Review rule priorities in frontmatter
|
|
211
|
+
|
|
212
|
+
### Installation Fails
|
|
213
|
+
|
|
214
|
+
1. Check you're in the app root directory
|
|
215
|
+
2. Verify `node_modules/@jmruthers/pace-core/` exists
|
|
216
|
+
3. Check file permissions
|
|
217
|
+
4. Try with `--force` flag if needed
|
|
218
|
+
|
|
219
|
+
## Best Practices
|
|
220
|
+
|
|
221
|
+
1. **Run audits regularly** - Check compliance before major commits
|
|
222
|
+
2. **Update rules** - Keep pace-core rules up to date
|
|
223
|
+
3. **Reference rules explicitly** - Tell Cursor which rules to follow
|
|
224
|
+
4. **Create custom rules** - Add app-specific rules starting at 50
|
|
225
|
+
5. **Review audit reports** - Address issues systematically
|
|
226
|
+
|
|
227
|
+
## Example Workflow
|
|
228
|
+
|
|
229
|
+
1. **Initial Setup:**
|
|
230
|
+
```bash
|
|
231
|
+
npm install @jmruthers/pace-core
|
|
232
|
+
npm run setup:cursor-rules
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
2. **Daily Development:**
|
|
236
|
+
- Cursor automatically uses rules when writing code
|
|
237
|
+
- Explicitly reference rules when needed: "Follow rules 00-04"
|
|
238
|
+
|
|
239
|
+
3. **Before Committing:**
|
|
240
|
+
```bash
|
|
241
|
+
npm run audit:pace-core
|
|
242
|
+
```
|
|
243
|
+
Review the generated report in `audit/` directory
|
|
244
|
+
|
|
245
|
+
4. **After pace-core Updates:**
|
|
246
|
+
```bash
|
|
247
|
+
npm update @jmruthers/pace-core
|
|
248
|
+
npm run setup:cursor-rules
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
## Related Documentation
|
|
252
|
+
|
|
253
|
+
- [Cursor Rules README](../../cursor-rules/README.md)
|
|
254
|
+
- [pace-core Standards](../standards/README.md)
|
|
255
|
+
- [pace-core Exports](../api-reference/README.md)
|
|
256
|
+
|
|
257
|
+
## Support
|
|
258
|
+
|
|
259
|
+
For issues with cursor rules:
|
|
260
|
+
1. Check this guide
|
|
261
|
+
2. Review rule files for guidance
|
|
262
|
+
3. File an issue in pace-core repository
|
|
263
|
+
4. Check pace-core documentation
|
|
@@ -71,7 +71,12 @@ import path from 'path'
|
|
|
71
71
|
|
|
72
72
|
export default defineConfig({
|
|
73
73
|
plugins: [
|
|
74
|
-
react(
|
|
74
|
+
react({
|
|
75
|
+
// React Compiler for automatic optimizations (React 19+)
|
|
76
|
+
babel: {
|
|
77
|
+
plugins: ['babel-plugin-react-compiler'],
|
|
78
|
+
},
|
|
79
|
+
}),
|
|
75
80
|
tailwindcss({
|
|
76
81
|
// CRITICAL: Include pace-core source files for Tailwind scanning
|
|
77
82
|
content: [
|
|
@@ -57,7 +57,12 @@ import path from 'path';
|
|
|
57
57
|
|
|
58
58
|
export default defineConfig({
|
|
59
59
|
plugins: [
|
|
60
|
-
react(
|
|
60
|
+
react({
|
|
61
|
+
// React Compiler for automatic optimizations (React 19+)
|
|
62
|
+
babel: {
|
|
63
|
+
plugins: ['babel-plugin-react-compiler'],
|
|
64
|
+
},
|
|
65
|
+
}),
|
|
61
66
|
tailwindcss({
|
|
62
67
|
content: [
|
|
63
68
|
'./src/**/*.{js,ts,jsx,tsx}',
|