@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
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Standardized templates for bug reports and feature requests for pace-core
|
|
3
|
+
globs: []
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
paceCoreVersion: "0.6.x"
|
|
6
|
+
rulesVersion: "2025-01-28"
|
|
7
|
+
---
|
|
8
|
+
# Bug Reports and Feature Requests Guide
|
|
9
|
+
|
|
10
|
+
This guide provides standardized templates for reporting bugs and requesting features in pace-core. This is a reference guide - Cursor will use this for context when helping with issue reporting.
|
|
11
|
+
|
|
12
|
+
## Identifying Issues
|
|
13
|
+
|
|
14
|
+
### Is This a pace-core Issue?
|
|
15
|
+
|
|
16
|
+
**Before reporting, determine if the issue is in pace-core or your consuming app:**
|
|
17
|
+
|
|
18
|
+
1. **Check pace-core documentation** - Is the behavior documented?
|
|
19
|
+
2. **Check pace-core source** - Can you find the relevant code?
|
|
20
|
+
3. **Test in isolation** - Can you reproduce with minimal pace-core usage?
|
|
21
|
+
4. **Check similar issues** - Has this been reported before?
|
|
22
|
+
|
|
23
|
+
**If the issue is in your consuming app:**
|
|
24
|
+
- Fix it locally
|
|
25
|
+
- Don't file a pace-core issue
|
|
26
|
+
|
|
27
|
+
**If the issue is in pace-core:**
|
|
28
|
+
- Use the templates below to file an issue
|
|
29
|
+
|
|
30
|
+
## Bug Report Template
|
|
31
|
+
|
|
32
|
+
### Required Information
|
|
33
|
+
|
|
34
|
+
```markdown
|
|
35
|
+
## Bug Description
|
|
36
|
+
[Clear, concise description of the bug]
|
|
37
|
+
|
|
38
|
+
## Expected Behavior
|
|
39
|
+
[What should happen]
|
|
40
|
+
|
|
41
|
+
## Actual Behavior
|
|
42
|
+
[What actually happens]
|
|
43
|
+
|
|
44
|
+
## Steps to Reproduce
|
|
45
|
+
1. [First step]
|
|
46
|
+
2. [Second step]
|
|
47
|
+
3. [Third step]
|
|
48
|
+
...
|
|
49
|
+
|
|
50
|
+
## Minimal Reproduction
|
|
51
|
+
[Link to minimal reproduction or code snippet]
|
|
52
|
+
|
|
53
|
+
## Environment
|
|
54
|
+
- pace-core version: [e.g., 0.5.193]
|
|
55
|
+
- React version: [e.g., 19.2.3]
|
|
56
|
+
- Node version: [e.g., 20.10.0]
|
|
57
|
+
- Browser: [e.g., Chrome 120]
|
|
58
|
+
- OS: [e.g., macOS 14.2]
|
|
59
|
+
|
|
60
|
+
## Code Example
|
|
61
|
+
\`\`\`tsx
|
|
62
|
+
// Minimal code that reproduces the issue
|
|
63
|
+
import { Component } from '@jmruthers/pace-core';
|
|
64
|
+
|
|
65
|
+
function App() {
|
|
66
|
+
return <Component />;
|
|
67
|
+
}
|
|
68
|
+
\`\`\`
|
|
69
|
+
|
|
70
|
+
## Error Messages
|
|
71
|
+
[Any error messages or console output]
|
|
72
|
+
|
|
73
|
+
## Additional Context
|
|
74
|
+
[Screenshots, videos, or other relevant information]
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Example Bug Report
|
|
78
|
+
|
|
79
|
+
```markdown
|
|
80
|
+
## Bug Description
|
|
81
|
+
DataTable component throws error when `rbac` prop is missing, but error message is unclear.
|
|
82
|
+
|
|
83
|
+
## Expected Behavior
|
|
84
|
+
DataTable should either:
|
|
85
|
+
1. Work without rbac prop (if not required), OR
|
|
86
|
+
2. Show clear error message explaining rbac is required
|
|
87
|
+
|
|
88
|
+
## Actual Behavior
|
|
89
|
+
DataTable throws: "Cannot read property 'pageId' of undefined" with no context about missing rbac prop.
|
|
90
|
+
|
|
91
|
+
## Steps to Reproduce
|
|
92
|
+
1. Import DataTable from pace-core
|
|
93
|
+
2. Use DataTable without rbac prop
|
|
94
|
+
3. See error in console
|
|
95
|
+
|
|
96
|
+
## Minimal Reproduction
|
|
97
|
+
\`\`\`tsx
|
|
98
|
+
import { DataTable } from '@jmruthers/pace-core';
|
|
99
|
+
|
|
100
|
+
function App() {
|
|
101
|
+
return (
|
|
102
|
+
<DataTable
|
|
103
|
+
data={[]}
|
|
104
|
+
columns={[]}
|
|
105
|
+
// Missing rbac prop
|
|
106
|
+
/>
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
\`\`\`
|
|
110
|
+
|
|
111
|
+
## Environment
|
|
112
|
+
- pace-core version: 0.5.193
|
|
113
|
+
- React version: 19.2.3
|
|
114
|
+
- Node version: 20.10.0
|
|
115
|
+
- Browser: Chrome 120
|
|
116
|
+
- OS: macOS 14.2
|
|
117
|
+
|
|
118
|
+
## Error Messages
|
|
119
|
+
```
|
|
120
|
+
Uncaught TypeError: Cannot read property 'pageId' of undefined
|
|
121
|
+
at DataTable (DataTable.tsx:123)
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## Additional Context
|
|
125
|
+
The error occurs immediately on render. The documentation mentions rbac is required, but the error doesn't reference this.
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## Feature Request Template
|
|
129
|
+
|
|
130
|
+
### Required Information
|
|
131
|
+
|
|
132
|
+
```markdown
|
|
133
|
+
## Feature Description
|
|
134
|
+
[Clear, concise description of the feature]
|
|
135
|
+
|
|
136
|
+
## Problem Statement
|
|
137
|
+
[What problem does this solve? Why is it needed?]
|
|
138
|
+
|
|
139
|
+
## Proposed Solution
|
|
140
|
+
[How should this work? What would the API look like?]
|
|
141
|
+
|
|
142
|
+
## Use Case
|
|
143
|
+
[Real-world scenario where this would be useful]
|
|
144
|
+
|
|
145
|
+
## Alternatives Considered
|
|
146
|
+
[Other approaches you've considered]
|
|
147
|
+
|
|
148
|
+
## Code Example
|
|
149
|
+
\`\`\`tsx
|
|
150
|
+
// How you would use this feature
|
|
151
|
+
import { NewFeature } from '@jmruthers/pace-core';
|
|
152
|
+
|
|
153
|
+
function App() {
|
|
154
|
+
return <NewFeature prop="value" />;
|
|
155
|
+
}
|
|
156
|
+
\`\`\`
|
|
157
|
+
|
|
158
|
+
## Additional Context
|
|
159
|
+
[Screenshots, mockups, or other relevant information]
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### Example Feature Request
|
|
163
|
+
|
|
164
|
+
```markdown
|
|
165
|
+
## Feature Description
|
|
166
|
+
Add `onRowDoubleClick` prop to DataTable component for double-click row interactions.
|
|
167
|
+
|
|
168
|
+
## Problem Statement
|
|
169
|
+
Currently, DataTable only supports single-click row selection. Many users expect double-click to open/edit a row, which is a common pattern in data tables.
|
|
170
|
+
|
|
171
|
+
## Proposed Solution
|
|
172
|
+
Add optional `onRowDoubleClick` callback prop:
|
|
173
|
+
- Fires when user double-clicks a row
|
|
174
|
+
- Receives row data and event
|
|
175
|
+
- Works alongside existing selection behavior
|
|
176
|
+
|
|
177
|
+
## Use Case
|
|
178
|
+
In an event management app, users want to double-click an event row to open the event details modal, while single-click selects the row for bulk operations.
|
|
179
|
+
|
|
180
|
+
## Alternatives Considered
|
|
181
|
+
1. Using `onRowClick` and detecting double-clicks - but this conflicts with selection
|
|
182
|
+
2. Custom row component - but this loses DataTable features
|
|
183
|
+
3. External double-click handler - but this is less integrated
|
|
184
|
+
|
|
185
|
+
## Code Example
|
|
186
|
+
\`\`\`tsx
|
|
187
|
+
import { DataTable } from '@jmruthers/pace-core';
|
|
188
|
+
|
|
189
|
+
function EventList() {
|
|
190
|
+
const handleRowDoubleClick = (row: Event) => {
|
|
191
|
+
openEventDetails(row.id);
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
return (
|
|
195
|
+
<DataTable
|
|
196
|
+
data={events}
|
|
197
|
+
columns={columns}
|
|
198
|
+
rbac={{ pageName: 'events' }}
|
|
199
|
+
onRowDoubleClick={handleRowDoubleClick}
|
|
200
|
+
/>
|
|
201
|
+
);
|
|
202
|
+
}
|
|
203
|
+
\`\`\`
|
|
204
|
+
|
|
205
|
+
## Additional Context
|
|
206
|
+
This is a common pattern in enterprise data tables. Many similar libraries support this.
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
## Where to File Issues
|
|
210
|
+
|
|
211
|
+
**File issues in the pace-core repository:**
|
|
212
|
+
- GitHub Issues: [Repository URL]
|
|
213
|
+
- Include all required information from templates
|
|
214
|
+
- Use appropriate labels if available
|
|
215
|
+
|
|
216
|
+
## Before Filing
|
|
217
|
+
|
|
218
|
+
**Check:**
|
|
219
|
+
- [ ] Issue hasn't been reported already
|
|
220
|
+
- [ ] You're using the latest pace-core version
|
|
221
|
+
- [ ] Issue is actually in pace-core (not your app)
|
|
222
|
+
- [ ] You've checked documentation
|
|
223
|
+
- [ ] You have a minimal reproduction
|
|
224
|
+
- [ ] You've included all required information
|
|
225
|
+
|
|
226
|
+
## After Filing
|
|
227
|
+
|
|
228
|
+
**Be prepared to:**
|
|
229
|
+
- Provide additional information if requested
|
|
230
|
+
- Test fixes in development versions
|
|
231
|
+
- Verify the fix works in your app
|
|
232
|
+
- Close the issue if resolved
|
|
233
|
+
|
|
234
|
+
## Tips for Effective Reports
|
|
235
|
+
|
|
236
|
+
1. **Be specific** - Vague descriptions waste time
|
|
237
|
+
2. **Include reproduction** - Minimal code that shows the issue
|
|
238
|
+
3. **Check existing issues** - Don't duplicate reports
|
|
239
|
+
4. **Be patient** - Maintainers are volunteers
|
|
240
|
+
5. **Be respectful** - Constructive feedback helps
|
|
241
|
+
|
|
242
|
+
## Reference
|
|
243
|
+
|
|
244
|
+
- pace-core Documentation: `packages/core/docs/`
|
|
245
|
+
- pace-core Source: `packages/core/src/`
|
|
246
|
+
- GitHub Issues: [Repository URL]
|
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Enforce code quality standards including TypeScript, ESLint, formatting, performance, and accessibility
|
|
3
|
+
globs: ["src/**/*.{ts,tsx,js,jsx}"]
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
paceCoreVersion: "0.6.x"
|
|
6
|
+
rulesVersion: "2025-01-28"
|
|
7
|
+
---
|
|
8
|
+
# Code Quality Guide
|
|
9
|
+
|
|
10
|
+
This guide enforces code quality standards to ensure maintainable, performant, and accessible code.
|
|
11
|
+
|
|
12
|
+
## TypeScript Standards
|
|
13
|
+
|
|
14
|
+
### MUST: Use Strict Mode
|
|
15
|
+
|
|
16
|
+
**TypeScript MUST use strict mode:**
|
|
17
|
+
|
|
18
|
+
```json
|
|
19
|
+
// tsconfig.json
|
|
20
|
+
{
|
|
21
|
+
"compilerOptions": {
|
|
22
|
+
"strict": true,
|
|
23
|
+
"noImplicitAny": true,
|
|
24
|
+
"strictNullChecks": true,
|
|
25
|
+
"strictFunctionTypes": true,
|
|
26
|
+
"strictBindCallApply": true,
|
|
27
|
+
"strictPropertyInitialization": true,
|
|
28
|
+
"noImplicitThis": true,
|
|
29
|
+
"alwaysStrict": true
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### MUST NOT: Use `any`
|
|
35
|
+
|
|
36
|
+
**MUST NOT use `any` type. Use `unknown` if type is truly unknown:**
|
|
37
|
+
|
|
38
|
+
```tsx
|
|
39
|
+
// ❌ WRONG: Using any
|
|
40
|
+
function processData(data: any) { return data.value; }
|
|
41
|
+
|
|
42
|
+
// ✅ CORRECT: Using unknown with type guard or proper types
|
|
43
|
+
function processData(data: unknown) {
|
|
44
|
+
if (typeof data === 'object' && data !== null && 'value' in data) {
|
|
45
|
+
return (data as { value: string }).value;
|
|
46
|
+
}
|
|
47
|
+
throw new Error('Invalid data');
|
|
48
|
+
}
|
|
49
|
+
// Or: interface Data { value: string; } function processData(data: Data) { return data.value; }
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### MUST: Use Discriminated Unions
|
|
53
|
+
|
|
54
|
+
**MUST use discriminated unions instead of boolean flags:**
|
|
55
|
+
|
|
56
|
+
```tsx
|
|
57
|
+
// ❌ WRONG: Boolean flags (confusing: what if both are true?)
|
|
58
|
+
interface User { isAdmin: boolean; isGuest: boolean; }
|
|
59
|
+
|
|
60
|
+
// ✅ CORRECT: Discriminated union
|
|
61
|
+
type User = { type: 'admin'; permissions: Permission[] } | { type: 'guest'; limitedAccess: boolean } | { type: 'user'; role: UserRole };
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### SHOULD: Use ReadonlyArray
|
|
65
|
+
|
|
66
|
+
**SHOULD use ReadonlyArray for immutable arrays:**
|
|
67
|
+
|
|
68
|
+
```tsx
|
|
69
|
+
// ✅ CORRECT - ReadonlyArray
|
|
70
|
+
function processItems(items: ReadonlyArray<Item>) {
|
|
71
|
+
// Can't mutate items
|
|
72
|
+
return items.map(item => transform(item));
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## ESLint Configuration
|
|
77
|
+
|
|
78
|
+
### MUST: Use pace-core ESLint Config
|
|
79
|
+
|
|
80
|
+
**MUST extend pace-core ESLint configuration:**
|
|
81
|
+
|
|
82
|
+
```javascript
|
|
83
|
+
// eslint.config.js
|
|
84
|
+
import paceCoreConfig from '@jmruthers/pace-core/eslint-config';
|
|
85
|
+
|
|
86
|
+
export default [
|
|
87
|
+
...paceCoreConfig,
|
|
88
|
+
// Your additional config
|
|
89
|
+
];
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### MUST: Fix ESLint Errors
|
|
93
|
+
|
|
94
|
+
**MUST fix all ESLint errors before committing:**
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
npm run lint
|
|
98
|
+
npm run lint:fix # Auto-fix where possible
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Code Formatting
|
|
102
|
+
|
|
103
|
+
### MUST: Use Consistent Formatting
|
|
104
|
+
|
|
105
|
+
**MUST use Prettier or equivalent for consistent formatting:**
|
|
106
|
+
|
|
107
|
+
```json
|
|
108
|
+
// .prettierrc
|
|
109
|
+
{
|
|
110
|
+
"semi": true,
|
|
111
|
+
"singleQuote": true,
|
|
112
|
+
"tabWidth": 2,
|
|
113
|
+
"trailingComma": "es5",
|
|
114
|
+
"printWidth": 100
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### MUST: Format Before Committing
|
|
119
|
+
|
|
120
|
+
**MUST format code before committing:**
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
npm run format
|
|
124
|
+
# Or use pre-commit hook
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Performance Considerations
|
|
128
|
+
|
|
129
|
+
### SHOULD: Optimize Re-renders
|
|
130
|
+
|
|
131
|
+
**SHOULD use React.memo, useMemo, useCallback appropriately:**
|
|
132
|
+
|
|
133
|
+
```tsx
|
|
134
|
+
// ✅ CORRECT: Memoize expensive computations, callbacks, and components
|
|
135
|
+
const expensiveValue = useMemo(() => computeExpensiveValue(data), [data]);
|
|
136
|
+
const handleClick = useCallback(() => doSomething(id), [id]);
|
|
137
|
+
const ExpensiveComponent = React.memo(({ data }) => <div>{/* ... */}</div>);
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### SHOULD: Avoid Unnecessary Re-renders
|
|
141
|
+
|
|
142
|
+
**SHOULD avoid causing unnecessary re-renders:**
|
|
143
|
+
|
|
144
|
+
```tsx
|
|
145
|
+
// ❌ WRONG: New object on every render (causes unnecessary re-renders)
|
|
146
|
+
function Component({ items }) { const config = { items, enabled: true }; return <Child config={config} />; }
|
|
147
|
+
|
|
148
|
+
// ✅ CORRECT: Memoize object
|
|
149
|
+
function Component({ items }) {
|
|
150
|
+
const config = useMemo(() => ({ items, enabled: true }), [items]);
|
|
151
|
+
return <Child config={config} />;
|
|
152
|
+
}
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### SHOULD: Lazy Load Heavy Components
|
|
156
|
+
|
|
157
|
+
**SHOULD lazy load heavy components:**
|
|
158
|
+
|
|
159
|
+
```tsx
|
|
160
|
+
// ✅ CORRECT: Lazy load heavy components
|
|
161
|
+
import { lazy, Suspense } from 'react';
|
|
162
|
+
const HeavyComponent = lazy(() => import('./HeavyComponent'));
|
|
163
|
+
function App() {
|
|
164
|
+
return <Suspense fallback={<Loading />}><HeavyComponent /></Suspense>;
|
|
165
|
+
}
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
## Accessibility Requirements
|
|
169
|
+
|
|
170
|
+
### MUST: Use Semantic HTML
|
|
171
|
+
|
|
172
|
+
**MUST use semantic HTML elements:**
|
|
173
|
+
|
|
174
|
+
```tsx
|
|
175
|
+
// ❌ WRONG: Non-semantic (<div onClick={...}>)
|
|
176
|
+
// ✅ CORRECT: Semantic HTML (<button onClick={...}>)
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### MUST: Provide ARIA Labels
|
|
180
|
+
|
|
181
|
+
**MUST provide ARIA labels for interactive elements:**
|
|
182
|
+
|
|
183
|
+
```tsx
|
|
184
|
+
// ✅ CORRECT: Provide ARIA labels for interactive elements
|
|
185
|
+
<button aria-label="Close dialog">×</button>
|
|
186
|
+
<input aria-label="Search" type="search" />
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### MUST: Ensure Keyboard Navigation
|
|
190
|
+
|
|
191
|
+
**MUST ensure all interactive elements are keyboard accessible:**
|
|
192
|
+
|
|
193
|
+
```tsx
|
|
194
|
+
// ✅ CORRECT: Ensure keyboard navigation (Enter or Space key)
|
|
195
|
+
<button onClick={handleClick} onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') handleClick(); }}>Click me</button>
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### MUST: Provide Focus Indicators
|
|
199
|
+
|
|
200
|
+
**MUST provide visible focus indicators:**
|
|
201
|
+
|
|
202
|
+
```tsx
|
|
203
|
+
// ✅ CORRECT: Provide visible focus indicators
|
|
204
|
+
<button className="focus:outline-none focus:ring-2 focus:ring-main-500">Click me</button>
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
## Code Review Checklist
|
|
208
|
+
|
|
209
|
+
**Before submitting code for review, verify:**
|
|
210
|
+
|
|
211
|
+
- [ ] TypeScript strict mode enabled
|
|
212
|
+
- [ ] No `any` types used
|
|
213
|
+
- [ ] ESLint passes with no errors
|
|
214
|
+
- [ ] Code is formatted consistently
|
|
215
|
+
- [ ] Performance optimizations applied where needed
|
|
216
|
+
- [ ] Accessibility requirements met
|
|
217
|
+
- [ ] Semantic HTML used
|
|
218
|
+
- [ ] ARIA labels provided
|
|
219
|
+
- [ ] Keyboard navigation works
|
|
220
|
+
- [ ] Focus indicators visible
|
|
221
|
+
- [ ] Code is readable and maintainable
|
|
222
|
+
- [ ] Comments explain "why", not "what"
|
|
223
|
+
|
|
224
|
+
## Code Complexity
|
|
225
|
+
|
|
226
|
+
### SHOULD: Keep Functions Small
|
|
227
|
+
|
|
228
|
+
**Functions SHOULD be small and focused:**
|
|
229
|
+
|
|
230
|
+
```tsx
|
|
231
|
+
// ❌ WRONG: Large function (100+ lines, multiple responsibilities)
|
|
232
|
+
function processUserData(user) { /* 100+ lines of logic */ }
|
|
233
|
+
|
|
234
|
+
// ✅ CORRECT: Small, focused functions
|
|
235
|
+
function validateUser(user: User): ValidationResult { /* Validation logic */ }
|
|
236
|
+
function transformUser(user: User): TransformedUser { /* Transformation logic */ }
|
|
237
|
+
function processUserData(user: User) {
|
|
238
|
+
const validation = validateUser(user);
|
|
239
|
+
if (!validation.valid) return validation;
|
|
240
|
+
return transformUser(user);
|
|
241
|
+
}
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
### SHOULD: Limit Cyclomatic Complexity
|
|
245
|
+
|
|
246
|
+
**Functions SHOULD have low cyclomatic complexity (< 10):**
|
|
247
|
+
|
|
248
|
+
```tsx
|
|
249
|
+
// ❌ WRONG: High complexity (many nested conditions)
|
|
250
|
+
function processData(data) { if (condition1) { if (condition2) { if (condition3) { /* ... */ } } } }
|
|
251
|
+
|
|
252
|
+
// ✅ CORRECT: Lower complexity (early returns)
|
|
253
|
+
function processData(data) { if (!condition1) return; if (!condition2) return; if (!condition3) return; /* Process */ }
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
## Error Handling
|
|
257
|
+
|
|
258
|
+
### MUST: Handle Errors Gracefully
|
|
259
|
+
|
|
260
|
+
**MUST handle errors and provide user feedback:**
|
|
261
|
+
|
|
262
|
+
```tsx
|
|
263
|
+
// ✅ CORRECT: Handle errors gracefully with user feedback
|
|
264
|
+
try {
|
|
265
|
+
const data = await fetchData();
|
|
266
|
+
setData(data);
|
|
267
|
+
} catch (error) {
|
|
268
|
+
logger.error('Failed to fetch data', error);
|
|
269
|
+
toast.error('Failed to load data. Please try again.');
|
|
270
|
+
}
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
### MUST: Use Type-Safe Error Handling
|
|
274
|
+
|
|
275
|
+
**MUST use type-safe error handling:**
|
|
276
|
+
|
|
277
|
+
```tsx
|
|
278
|
+
// ✅ CORRECT: Type-safe error handling
|
|
279
|
+
function isApiError(error: unknown): error is ApiError {
|
|
280
|
+
return typeof error === 'object' && error !== null && 'code' in error && 'message' in error;
|
|
281
|
+
}
|
|
282
|
+
try {
|
|
283
|
+
await apiCall();
|
|
284
|
+
} catch (error) {
|
|
285
|
+
if (isApiError(error)) handleApiError(error);
|
|
286
|
+
else handleUnknownError(error);
|
|
287
|
+
}
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
## Code Quality Checklist
|
|
291
|
+
|
|
292
|
+
Before committing, verify:
|
|
293
|
+
- [ ] TypeScript strict mode enabled
|
|
294
|
+
- [ ] No `any` types
|
|
295
|
+
- [ ] ESLint passes
|
|
296
|
+
- [ ] Code formatted
|
|
297
|
+
- [ ] Performance optimized
|
|
298
|
+
- [ ] Accessible (semantic HTML, ARIA, keyboard)
|
|
299
|
+
- [ ] Functions are small and focused
|
|
300
|
+
- [ ] Error handling in place
|
|
301
|
+
- [ ] Code is readable
|
|
302
|
+
- [ ] Comments explain "why"
|
|
303
|
+
|
|
304
|
+
## Reference
|
|
305
|
+
|
|
306
|
+
- TypeScript Handbook: https://www.typescriptlang.org/docs/
|
|
307
|
+
- ESLint Rules: pace-core eslint-config
|
|
308
|
+
- React Performance: https://react.dev/learn/render-and-commit
|
|
309
|
+
- Web Accessibility: https://www.w3.org/WAI/
|