@jmruthers/pace-core 0.5.76 → 0.5.78
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 +8 -0
- package/dist/{RBACService-C4udt_Zp.d.ts → AuthService-Df3IozMG.d.ts} +10 -118
- package/dist/{DataTable-ntgmhO2W.d.ts → DataTable-BE0OXZKQ.d.ts} +9 -2
- package/dist/{DataTable-4GAVPIEG.js → DataTable-ETGVF4Y5.js} +50 -13
- package/dist/{PublicLoadingSpinner-BiNER8F5.d.ts → PublicLoadingSpinner-CnUaz0vG.d.ts} +5 -2
- package/dist/{UnifiedAuthProvider-Bj6YCf7c.d.ts → UnifiedAuthProvider-B391Aqum.d.ts} +42 -45
- package/dist/{UnifiedAuthProvider-3NKDOSOK.js → UnifiedAuthProvider-P5SOJAQ6.js} +4 -5
- package/dist/{api-DDMUKIUD.js → api-KG4A2X7P.js} +9 -3
- package/dist/{audit-6TOCAMKO.js → audit-65VNHEV2.js} +2 -2
- package/dist/{chunk-K34IM5CT.js → chunk-2OGV6IRV.js} +196 -626
- package/dist/chunk-2OGV6IRV.js.map +1 -0
- package/dist/{chunk-NTNILOBC.js → chunk-5BO3MI5Y.js} +4 -4
- package/dist/{chunk-XLZ7U46Z.js → chunk-CVMVPYAL.js} +9 -60
- package/dist/chunk-CVMVPYAL.js.map +1 -0
- package/dist/{chunk-URUTVZ7N.js → chunk-FL4ZCQLD.js} +2 -2
- package/dist/{chunk-LW7MMEAQ.js → chunk-FT2M4R4F.js} +2 -2
- package/dist/{chunk-5BSLGBYI.js → chunk-JCQZ6LA7.js} +2 -8
- package/dist/{chunk-5BSLGBYI.js.map → chunk-JCQZ6LA7.js.map} +1 -1
- package/dist/{chunk-KHJS6VIA.js → chunk-LRQ6RBJC.js} +157 -112
- package/dist/chunk-LRQ6RBJC.js.map +1 -0
- package/dist/{chunk-WN6XJWOS.js → chunk-MNJXXD6C.js} +274 -743
- package/dist/chunk-MNJXXD6C.js.map +1 -0
- package/dist/{chunk-KK73ZB4E.js → chunk-PTR5PMPE.js} +153 -132
- package/dist/chunk-PTR5PMPE.js.map +1 -0
- package/dist/{chunk-B2WTCLCV.js → chunk-Q7APDV6H.js} +18 -8
- package/dist/chunk-Q7APDV6H.js.map +1 -0
- package/dist/{chunk-A4FUBC7B.js → chunk-QGVSOUJ2.js} +2 -4
- package/dist/{chunk-A4FUBC7B.js.map → chunk-QGVSOUJ2.js.map} +1 -1
- package/dist/{chunk-FGMFQSHX.js → chunk-S63MFSY6.js} +500 -551
- package/dist/chunk-S63MFSY6.js.map +1 -0
- package/dist/{chunk-AFGTSUAD.js → chunk-VSOKOFRF.js} +4 -4
- package/dist/chunk-WUXCWRL6.js +20 -0
- package/dist/chunk-WUXCWRL6.js.map +1 -0
- package/dist/{chunk-Y6TXWPJO.js → chunk-YVVGHRGI.js} +105 -31
- package/dist/chunk-YVVGHRGI.js.map +1 -0
- package/dist/{chunk-M5IWZRBT.js → chunk-ZMNXIJP4.js} +2187 -981
- package/dist/chunk-ZMNXIJP4.js.map +1 -0
- package/dist/components.d.ts +6 -6
- package/dist/components.js +14 -18
- package/dist/components.js.map +1 -1
- package/dist/{database-C3Szpi5J.d.ts → database-BXAfr2Y_.d.ts} +18 -0
- package/dist/hooks.d.ts +5 -5
- package/dist/hooks.js +8 -9
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +19 -27
- package/dist/index.js +21 -29
- package/dist/index.js.map +1 -1
- package/dist/{organisation-BtshODVF.d.ts → organisation-D6qRDtbF.d.ts} +1 -1
- package/dist/providers.d.ts +7 -21
- package/dist/providers.js +3 -10
- package/dist/rbac/index.d.ts +71 -221
- package/dist/rbac/index.js +15 -16
- package/dist/{types-CGX9Vyf5.d.ts → types-BDg1mAGG.d.ts} +36 -6
- package/dist/types.d.ts +3 -3
- package/dist/types.js +61 -18
- package/dist/types.js.map +1 -1
- package/dist/{unified-CM7T0aTK.d.ts → unified-DQ4VcT7H.d.ts} +1 -1
- package/dist/{usePublicRouteParams-B-CumWRc.d.ts → usePublicRouteParams-BlgwXweB.d.ts} +3 -3
- package/dist/utils.d.ts +2 -2
- package/dist/utils.js +52 -9
- package/dist/utils.js.map +1 -1
- package/docs/CONTENT_AUDIT_REPORT.md +253 -0
- package/docs/DOCUMENTATION_AUDIT.md +172 -0
- package/docs/README.md +142 -147
- package/docs/STYLE_GUIDE.md +37 -0
- package/docs/api/classes/ColumnFactory.md +17 -17
- package/docs/api/classes/ErrorBoundary.md +1 -1
- package/docs/api/classes/InvalidScopeError.md +4 -4
- package/docs/api/classes/MissingUserContextError.md +4 -4
- package/docs/api/classes/OrganisationContextRequiredError.md +4 -4
- package/docs/api/classes/PermissionDeniedError.md +5 -5
- package/docs/api/classes/PublicErrorBoundary.md +1 -1
- package/docs/api/classes/RBACAuditManager.md +8 -8
- package/docs/api/classes/RBACCache.md +35 -5
- package/docs/api/classes/RBACEngine.md +49 -20
- package/docs/api/classes/RBACError.md +4 -4
- package/docs/api/classes/RBACNotInitializedError.md +4 -4
- package/docs/api/classes/SecureSupabaseClient.md +1 -1
- package/docs/api/classes/StorageUtils.md +1 -1
- package/docs/api/enums/FileCategory.md +1 -1
- package/docs/api/interfaces/AggregateConfig.md +4 -4
- package/docs/api/interfaces/ButtonProps.md +1 -1
- package/docs/api/interfaces/CardProps.md +1 -1
- package/docs/api/interfaces/ColorPalette.md +1 -1
- package/docs/api/interfaces/ColorShade.md +1 -1
- package/docs/api/interfaces/DataAccessRecord.md +1 -1
- package/docs/api/interfaces/DataRecord.md +11 -0
- package/docs/api/interfaces/DataTableAction.md +65 -29
- package/docs/api/interfaces/DataTableColumn.md +36 -23
- package/docs/api/interfaces/DataTableProps.md +80 -38
- package/docs/api/interfaces/DataTableToolbarButton.md +7 -7
- package/docs/api/interfaces/EmptyStateConfig.md +5 -5
- package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
- package/docs/api/interfaces/EventLogoProps.md +1 -1
- 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 +1 -1
- package/docs/api/interfaces/FooterProps.md +1 -1
- package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
- package/docs/api/interfaces/InputProps.md +1 -1
- package/docs/api/interfaces/LabelProps.md +1 -1
- package/docs/api/interfaces/LoginFormProps.md +1 -1
- package/docs/api/interfaces/NavigationAccessRecord.md +11 -11
- package/docs/api/interfaces/NavigationContextType.md +9 -9
- package/docs/api/interfaces/NavigationGuardProps.md +1 -1
- package/docs/api/interfaces/NavigationItem.md +1 -1
- package/docs/api/interfaces/NavigationMenuProps.md +1 -1
- package/docs/api/interfaces/NavigationProviderProps.md +7 -7
- 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 +1 -1
- package/docs/api/interfaces/PaceLoginPageProps.md +16 -3
- package/docs/api/interfaces/PageAccessRecord.md +1 -1
- package/docs/api/interfaces/PagePermissionContextType.md +1 -1
- package/docs/api/interfaces/PagePermissionGuardProps.md +2 -2
- package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
- package/docs/api/interfaces/PaletteData.md +1 -1
- package/docs/api/interfaces/PermissionEnforcerProps.md +4 -4
- package/docs/api/interfaces/PublicErrorBoundaryProps.md +1 -1
- package/docs/api/interfaces/PublicErrorBoundaryState.md +1 -1
- package/docs/api/interfaces/PublicLoadingSpinnerProps.md +1 -1
- package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
- package/docs/api/interfaces/PublicPageHeaderProps.md +1 -1
- package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
- package/docs/api/interfaces/RBACConfig.md +1 -1
- package/docs/api/interfaces/RBACLogger.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
- package/docs/api/interfaces/RouteAccessRecord.md +2 -2
- package/docs/api/interfaces/RouteConfig.md +2 -2
- package/docs/api/interfaces/SecureDataContextType.md +1 -1
- package/docs/api/interfaces/SecureDataProviderProps.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/ToastActionElement.md +1 -1
- package/docs/api/interfaces/ToastProps.md +1 -1
- package/docs/api/interfaces/UnifiedAuthContextType.md +94 -521
- package/docs/api/interfaces/UnifiedAuthProviderProps.md +16 -16
- package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
- package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
- package/docs/api/interfaces/UsePublicEventLogoOptions.md +1 -1
- package/docs/api/interfaces/UsePublicEventLogoReturn.md +1 -1
- package/docs/api/interfaces/UsePublicEventOptions.md +1 -1
- package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
- package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
- package/docs/api/interfaces/UseResolvedScopeOptions.md +1 -1
- package/docs/api/interfaces/UseResolvedScopeReturn.md +1 -1
- package/docs/api/interfaces/UserEventAccess.md +11 -11
- package/docs/api/interfaces/UserMenuProps.md +1 -1
- package/docs/api/interfaces/UserProfile.md +1 -1
- package/docs/api/modules.md +251 -269
- package/docs/api-reference/components.md +193 -0
- package/docs/api-reference/hooks.md +265 -0
- package/docs/api-reference/providers.md +6 -0
- package/docs/api-reference/types.md +6 -0
- package/docs/api-reference/utilities.md +207 -0
- package/docs/architecture/README.md +6 -0
- package/docs/{database-schema-requirements.md → architecture/database-schema-requirements.md} +6 -0
- package/docs/architecture/rbac-security-architecture.md +258 -0
- package/docs/architecture/services.md +9 -1
- package/docs/best-practices/README.md +6 -0
- package/docs/best-practices/accessibility.md +6 -0
- package/docs/{common-patterns.md → best-practices/common-patterns.md} +6 -0
- package/docs/best-practices/deployment.md +6 -0
- package/docs/best-practices/performance.md +475 -2
- package/docs/best-practices/security.md +6 -0
- package/docs/best-practices/testing.md +6 -0
- package/docs/core-concepts/authentication.md +6 -0
- package/docs/core-concepts/events.md +6 -0
- package/docs/core-concepts/organisations.md +6 -0
- package/docs/core-concepts/permissions.md +6 -0
- package/docs/core-concepts/rbac-system.md +8 -0
- package/docs/documentation-index.md +121 -182
- package/docs/{consuming-app-vite-config.md → getting-started/consuming-app-vite-config.md} +6 -0
- package/docs/getting-started/documentation-index.md +40 -0
- package/docs/getting-started/examples/README.md +878 -35
- package/docs/{faq.md → getting-started/faq.md} +7 -1
- package/docs/getting-started/installation-guide.md +6 -0
- package/docs/{quick-reference.md → getting-started/quick-reference.md} +6 -0
- package/docs/implementation-guides/app-layout.md +6 -0
- package/docs/implementation-guides/authentication.md +1021 -0
- package/docs/implementation-guides/component-styling.md +6 -0
- package/docs/implementation-guides/data-tables.md +1264 -2076
- package/docs/implementation-guides/dynamic-colors.md +6 -0
- package/docs/implementation-guides/event-theming-summary.md +6 -0
- package/docs/{file-reference-system.md → implementation-guides/file-reference-system.md} +6 -0
- package/docs/implementation-guides/file-upload-storage.md +6 -0
- package/docs/implementation-guides/forms.md +6 -0
- package/docs/implementation-guides/inactivity-tracking.md +6 -0
- package/docs/implementation-guides/navigation.md +6 -0
- package/docs/implementation-guides/organisation-security.md +6 -0
- package/docs/implementation-guides/permission-enforcement.md +6 -0
- package/docs/implementation-guides/public-pages-advanced.md +6 -0
- package/docs/implementation-guides/public-pages.md +6 -0
- package/docs/migration/MIGRATION_GUIDE.md +827 -351
- package/docs/migration/README.md +7 -1
- package/docs/migration/organisation-context-timing-fix.md +6 -0
- package/docs/migration/rbac-migration.md +44 -1
- package/docs/migration/service-architecture.md +6 -0
- package/docs/migration/v0.4.15-tailwind-scanning.md +6 -0
- package/docs/migration/v0.4.16-css-first-approach.md +6 -0
- package/docs/migration/v0.4.17-source-path-fix.md +6 -0
- package/docs/rbac/README-rbac-rls-integration.md +6 -0
- package/docs/rbac/README.md +6 -0
- package/docs/rbac/advanced-patterns.md +6 -0
- package/docs/rbac/api-reference.md +7 -1
- package/docs/rbac/breaking-changes-v3.md +222 -0
- package/docs/rbac/examples/rbac-rls-integration-example.md +6 -0
- package/docs/rbac/examples.md +6 -0
- package/docs/rbac/getting-started.md +6 -0
- package/docs/rbac/migration-guide.md +260 -0
- package/docs/rbac/quick-start.md +70 -13
- package/docs/rbac/rbac-rls-integration.md +6 -0
- package/docs/rbac/super-admin-guide.md +6 -0
- package/docs/rbac/troubleshooting.md +6 -0
- package/docs/security/README.md +6 -0
- package/docs/security/checklist.md +6 -0
- package/docs/styles/README.md +7 -1
- package/docs/{usage.md → styles/usage.md} +6 -0
- package/docs/testing/README.md +6 -0
- package/docs/{visual-testing.md → testing/visual-testing.md} +6 -0
- package/docs/troubleshooting/README.md +387 -5
- package/docs/troubleshooting/cake-page-permission-guard-issue-summary.md +6 -0
- package/docs/troubleshooting/common-issues.md +6 -0
- package/docs/troubleshooting/database-view-compatibility.md +6 -0
- package/docs/troubleshooting/organisation-context-setup.md +6 -0
- package/docs/troubleshooting/react-hooks-issue-analysis.md +6 -0
- package/docs/troubleshooting/styling-issues.md +6 -0
- package/docs/troubleshooting/tailwind-content-scanning.md +6 -0
- package/package.json +1 -1
- package/src/__tests__/helpers/__tests__/test-providers.test.tsx +2 -1
- package/src/__tests__/helpers/test-providers.tsx +3 -53
- package/src/components/DataTable/DataTable.test.tsx +319 -0
- package/src/components/DataTable/DataTable.tsx +32 -11
- package/src/components/DataTable/__tests__/{DataTable.comprehensive.test.tsx → DataTable.comprehensive.test.tsx.skip} +6 -4
- package/src/components/DataTable/__tests__/{DataTable.test.tsx → DataTable.test.tsx.skip} +6 -4
- package/src/components/DataTable/__tests__/DataTableCore.test.tsx +31 -9
- package/src/components/DataTable/__tests__/a11y.basic.test.tsx +601 -0
- package/src/components/DataTable/__tests__/keyboard.test.tsx +615 -0
- package/src/components/DataTable/__tests__/pagination.modes.test.tsx +639 -0
- package/src/components/DataTable/__tests__/ssr.strict-mode.test.tsx.skip +330 -0
- package/src/components/DataTable/components/AccessDeniedPage.tsx +2 -2
- package/src/components/DataTable/components/ActionButtons.tsx +88 -104
- package/src/components/DataTable/components/DataTableCore.tsx +309 -337
- package/src/components/DataTable/components/DataTableErrorBoundary.tsx +4 -2
- package/src/components/DataTable/components/DataTableModals.tsx +22 -1
- package/src/components/DataTable/components/EditableRow.tsx +69 -84
- package/src/components/DataTable/components/EmptyState.tsx +5 -1
- package/src/components/DataTable/components/ImportModal.tsx +65 -36
- package/src/components/DataTable/components/PaginationControls.tsx +40 -100
- package/src/components/DataTable/components/UnifiedTableBody.tsx +125 -148
- package/src/components/DataTable/context/DataTableContext.tsx +1 -1
- package/src/components/DataTable/core/ColumnFactory.ts +5 -0
- package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +12 -10
- package/src/components/DataTable/examples/HierarchicalExample.tsx +1 -1
- package/src/components/DataTable/examples/InitialPageSizeExample.tsx +1 -0
- package/src/components/DataTable/examples/PerformanceExample.tsx +1 -0
- package/src/components/DataTable/hooks/__tests__/useColumnOrderPersistence.test.ts +1 -5
- package/src/components/DataTable/hooks/__tests__/useColumnVisibilityPersistence.test.ts +167 -0
- package/src/components/DataTable/hooks/index.ts +7 -0
- package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +32 -15
- package/src/components/DataTable/hooks/useColumnVisibilityPersistence.ts +102 -0
- package/src/components/DataTable/hooks/useDataTableConfiguration.ts +89 -0
- package/src/components/DataTable/hooks/useDataTableDataPipeline.ts +117 -0
- package/src/components/DataTable/hooks/useDataTablePermissions.ts +71 -27
- package/src/components/DataTable/hooks/useDataTableState.ts +39 -11
- package/src/components/DataTable/hooks/useEffectiveColumnOrder.ts +33 -0
- package/src/components/DataTable/hooks/useHierarchicalState.ts +15 -1
- package/src/components/DataTable/hooks/useKeyboardNavigation.ts +447 -0
- package/src/components/DataTable/hooks/useServerSideDataEffect.ts +94 -0
- package/src/components/DataTable/hooks/useTableColumns.ts +10 -7
- package/src/components/DataTable/hooks/useTableHandlers.ts +174 -0
- package/src/components/DataTable/index.ts +12 -3
- package/src/components/DataTable/types.ts +129 -9
- package/src/components/DataTable/utils/__tests__/exportUtils.test.ts +159 -22
- package/src/components/DataTable/utils/__tests__/flexibleImport.test.ts +111 -0
- package/src/components/DataTable/utils/__tests__/rowUtils.test.ts +15 -29
- package/src/components/DataTable/utils/a11yUtils.ts +244 -0
- package/src/components/DataTable/utils/debugTools.ts +609 -0
- package/src/components/DataTable/utils/exportUtils.ts +114 -16
- package/src/components/DataTable/utils/flexibleImport.ts +202 -32
- package/src/components/DataTable/utils/hierarchicalUtils.ts +1 -1
- package/src/components/DataTable/utils/index.ts +2 -0
- package/src/components/DataTable/utils/paginationUtils.ts +350 -0
- package/src/components/DataTable/utils/rowUtils.ts +6 -5
- package/src/components/NavigationMenu/NavigationMenu.test.tsx +19 -24
- package/src/components/NavigationMenu/NavigationMenu.tsx +19 -8
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.security.test.tsx +1 -23
- package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +56 -6
- package/src/components/PaceLoginPage/PaceLoginPage.tsx +137 -13
- package/src/components/PublicLayout/__tests__/PublicPageHeader.test.tsx +1 -1
- package/src/components/Select/Select.tsx +1 -0
- package/src/components/examples/PermissionExample.tsx +173 -0
- package/src/examples/CorrectPublicPageImplementation.tsx +301 -0
- package/src/examples/PublicEventPage.tsx +274 -0
- package/src/examples/PublicPageApp.tsx +308 -0
- package/src/examples/PublicPageUsageExample.tsx +216 -0
- package/src/hooks/__tests__/useOrganisationPermissions.unit.test.tsx +12 -1
- package/src/hooks/__tests__/useOrganisationSecurity.unit.test.tsx +129 -17
- package/src/hooks/__tests__/useRBAC.unit.test.ts +151 -846
- package/src/hooks/useOrganisationPermissions.test.ts +42 -18
- package/src/hooks/useOrganisationPermissions.ts +12 -6
- package/src/hooks/useOrganisationSecurity.test.ts +138 -85
- package/src/hooks/useOrganisationSecurity.ts +41 -10
- package/src/index.ts +0 -1
- package/src/providers/AuthProvider.simplified.tsx +880 -0
- package/src/providers/UnifiedAuthProvider.test.simple.tsx +8 -8
- package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +29 -19
- package/src/providers/index.ts +0 -1
- package/src/providers/services/EventServiceProvider.tsx +19 -15
- package/src/providers/services/InactivityServiceProvider.tsx +19 -15
- package/src/providers/services/OrganisationServiceProvider.tsx +19 -15
- package/src/providers/services/UnifiedAuthProvider.tsx +156 -127
- package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +1 -1
- package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +3 -3
- package/src/rbac/README.md +1 -1
- package/src/rbac/__tests__/adapters.comprehensive.test.tsx +25 -27
- package/src/rbac/__tests__/auth-rbac-security.integration.test.tsx +313 -0
- package/src/rbac/__tests__/engine.comprehensive.test.ts +114 -348
- package/src/rbac/__tests__/rbac-engine-core-logic.test.ts +28 -110
- package/src/rbac/__tests__/rbac-engine-simplified.test.ts +33 -85
- package/src/rbac/__tests__/scenarios.user-role.test.tsx +2 -2
- package/src/rbac/adapters.tsx +26 -69
- package/src/rbac/api.test.ts +90 -27
- package/src/rbac/api.ts +61 -10
- package/src/rbac/audit.test.ts +33 -38
- package/src/rbac/audit.ts +21 -6
- package/src/rbac/cache.ts +33 -1
- package/src/rbac/components/NavigationGuard.tsx +11 -11
- package/src/rbac/components/NavigationProvider.test.tsx +11 -5
- package/src/rbac/components/NavigationProvider.tsx +37 -13
- package/src/rbac/components/PagePermissionGuard.tsx +111 -50
- package/src/rbac/components/PagePermissionProvider.tsx +5 -5
- package/src/rbac/components/PermissionEnforcer.tsx +11 -11
- package/src/rbac/components/RoleBasedRouter.tsx +5 -5
- package/src/rbac/components/SecureDataProvider.tsx +5 -5
- package/src/rbac/components/__tests__/NavigationGuard.test.tsx +8 -8
- package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +14 -14
- package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +12 -12
- package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +6 -6
- package/src/rbac/engine.test.simple.ts +19 -13
- package/src/rbac/engine.test.ts +1 -0
- package/src/rbac/engine.ts +330 -766
- package/src/rbac/errors.ts +156 -0
- package/src/rbac/hooks/usePermissions.ts +32 -10
- package/src/rbac/hooks/useRBAC.test.ts +126 -512
- package/src/rbac/hooks/useRBAC.ts +147 -193
- package/src/rbac/hooks/useResolvedScope.ts +12 -0
- package/src/rbac/index.ts +7 -4
- package/src/rbac/security.ts +109 -18
- package/src/rbac/types.ts +12 -1
- package/src/services/AuthService.ts +2 -15
- package/src/services/EventService.ts +43 -46
- package/src/services/OrganisationService.ts +51 -31
- package/src/services/__tests__/AuthService.test.ts +1 -1
- package/src/services/__tests__/EventService.test.ts +1 -1
- package/src/services/__tests__/OrganisationService.test.ts +1 -1
- package/src/services/base/BaseService.ts +8 -0
- package/src/styles/base.css +208 -0
- package/src/styles/semantic.css +24 -0
- package/src/types/database.generated.ts +7347 -0
- package/src/types/database.ts +20 -0
- package/src/utils/logger.ts +179 -0
- package/src/utils/organisationContext.ts +11 -4
- package/src/utils/storage/__tests__/helpers.unit.test.ts +6 -2
- package/dist/appNameResolver-UURKN7NF.js +0 -22
- package/dist/audit-6TOCAMKO.js.map +0 -1
- package/dist/chunk-B2WTCLCV.js.map +0 -1
- package/dist/chunk-FGMFQSHX.js.map +0 -1
- package/dist/chunk-K34IM5CT.js.map +0 -1
- package/dist/chunk-KHJS6VIA.js.map +0 -1
- package/dist/chunk-KK73ZB4E.js.map +0 -1
- package/dist/chunk-M5IWZRBT.js.map +0 -1
- package/dist/chunk-ULBI5JGB.js +0 -109
- package/dist/chunk-ULBI5JGB.js.map +0 -1
- package/dist/chunk-WN6XJWOS.js.map +0 -1
- package/dist/chunk-XLZ7U46Z.js.map +0 -1
- package/dist/chunk-Y6TXWPJO.js.map +0 -1
- package/docs/DOCUMENTATION_CHECKLIST.md +0 -281
- package/docs/TERMINOLOGY.md +0 -231
- package/docs/api/interfaces/RBACContextType.md +0 -468
- package/docs/api/interfaces/RBACProviderProps.md +0 -107
- package/docs/best-practices/performance-expansion.md +0 -473
- package/docs/breaking-changes.md +0 -179
- package/docs/consuming-app-example.md +0 -290
- package/docs/documentation-templates.md +0 -539
- package/docs/examples/navigation-menu-auth-fix.md +0 -344
- package/docs/getting-started/examples/basic-auth-app.md +0 -520
- package/docs/getting-started/examples/full-featured-app.md +0 -616
- package/docs/getting-started/quick-start.md +0 -376
- package/docs/implementation-guides/datatable-filtering.md +0 -313
- package/docs/implementation-guides/datatable-rbac-usage.md +0 -317
- package/docs/implementation-guides/hierarchical-datatable.md +0 -850
- package/docs/implementation-guides/large-datasets.md +0 -281
- package/docs/implementation-guides/performance.md +0 -403
- package/docs/migration/quick-migration-guide.md +0 -320
- package/docs/migration-guide.md +0 -193
- package/docs/migration-guides/unified-auth-provider-mandatory-timeouts.md +0 -226
- package/docs/performance/README.md +0 -551
- package/docs/style-guide.md +0 -964
- package/docs/troubleshooting/authentication-issues.md +0 -334
- package/docs/troubleshooting/debugging.md +0 -1117
- package/docs/troubleshooting/migration.md +0 -918
- package/src/__tests__/hooks/usePermissions.test.ts +0 -261
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.rbac.test.tsx +0 -574
- package/src/hooks/__tests__/ServiceHooks.test.tsx +0 -613
- package/src/hooks/services/__tests__/useServiceHooks.test.tsx +0 -137
- package/src/hooks/services/usePermissions.ts +0 -70
- package/src/hooks/services/useRBACService.ts +0 -30
- package/src/hooks/usePermissionCheck.ts +0 -150
- package/src/providers/__tests__/ServiceProviders.test.tsx +0 -477
- package/src/providers/services/RBACServiceProvider.tsx +0 -79
- package/src/rbac/__tests__/integration.authflow.test.tsx +0 -119
- package/src/rbac/__tests__/integration.navigation.test.tsx +0 -69
- package/src/rbac/__tests__/integration.securedata.test.tsx +0 -92
- package/src/rbac/__tests__/integration.smoke.test.tsx +0 -73
- package/src/rbac/providers/RBACProvider.tsx +0 -645
- package/src/rbac/providers/__tests__/RBACProvider.integration.test.tsx +0 -688
- package/src/rbac/providers/__tests__/RBACProvider.test.tsx +0 -1186
- package/src/rbac/providers/index.ts +0 -11
- package/src/services/RBACService.ts +0 -522
- package/src/services/__tests__/RBACService.test.ts +0 -492
- package/src/services/interfaces/IRBACService.ts +0 -62
- package/src/utils/appNameResolver.test 2.ts +0 -494
- /package/dist/{DataTable-4GAVPIEG.js.map → DataTable-ETGVF4Y5.js.map} +0 -0
- /package/dist/{UnifiedAuthProvider-3NKDOSOK.js.map → UnifiedAuthProvider-P5SOJAQ6.js.map} +0 -0
- /package/dist/{api-DDMUKIUD.js.map → api-KG4A2X7P.js.map} +0 -0
- /package/dist/{appNameResolver-UURKN7NF.js.map → audit-65VNHEV2.js.map} +0 -0
- /package/dist/{chunk-NTNILOBC.js.map → chunk-5BO3MI5Y.js.map} +0 -0
- /package/dist/{chunk-URUTVZ7N.js.map → chunk-FL4ZCQLD.js.map} +0 -0
- /package/dist/{chunk-LW7MMEAQ.js.map → chunk-FT2M4R4F.js.map} +0 -0
- /package/dist/{chunk-AFGTSUAD.js.map → chunk-VSOKOFRF.js.map} +0 -0
- /package/docs/{app.css.example → styles/app.css.example} +0 -0
|
@@ -1,551 +0,0 @@
|
|
|
1
|
-
# Performance Best Practices
|
|
2
|
-
|
|
3
|
-
> **⚡ Optimize Your App** | [Bundle Optimization](#bundle-optimization) | [Runtime Performance](#runtime-performance) | [Monitoring](#monitoring)
|
|
4
|
-
|
|
5
|
-
[← Back to Documentation](../README.md) | [↑ Table of Contents](#table-of-contents) | [Next: Security Checklist →](../security/checklist.md)
|
|
6
|
-
|
|
7
|
-
Complete guide to optimizing PACE Core applications for maximum performance.
|
|
8
|
-
|
|
9
|
-
## 📋 Table of Contents
|
|
10
|
-
|
|
11
|
-
- [Performance Overview](#-performance-overview)
|
|
12
|
-
- [Quick Performance Checklist](#-quick-performance-checklist)
|
|
13
|
-
- [Bundle Optimization](#-bundle-optimization)
|
|
14
|
-
- [Runtime Performance](#-runtime-performance)
|
|
15
|
-
- [Caching Strategies](#-caching-strategies)
|
|
16
|
-
- [Monitoring](#-monitoring)
|
|
17
|
-
- [Performance Best Practices](#-performance-best-practices)
|
|
18
|
-
- [Performance Tools](#-performance-tools)
|
|
19
|
-
- [Additional Resources](#-additional-resources)
|
|
20
|
-
- [Troubleshooting](#-troubleshooting)
|
|
21
|
-
|
|
22
|
-
## 📊 Performance Overview
|
|
23
|
-
|
|
24
|
-
This guide covers:
|
|
25
|
-
- **Bundle Optimization** - Reducing bundle size and load time
|
|
26
|
-
- **Runtime Performance** - Optimizing component rendering and state management
|
|
27
|
-
- **Caching Strategies** - Implementing effective caching
|
|
28
|
-
- **Monitoring** - Measuring and tracking performance
|
|
29
|
-
|
|
30
|
-
## 🚀 Quick Performance Checklist
|
|
31
|
-
|
|
32
|
-
### Before You Start
|
|
33
|
-
- [ ] **Measure baseline** - Use React DevTools Profiler
|
|
34
|
-
- [ ] **Check bundle size** - Use webpack-bundle-analyzer
|
|
35
|
-
- [ ] **Audit dependencies** - Remove unused packages
|
|
36
|
-
- [ ] **Enable production mode** - Ensure optimizations are enabled
|
|
37
|
-
|
|
38
|
-
### Performance Targets
|
|
39
|
-
- [ ] **Bundle size** - < 500KB gzipped
|
|
40
|
-
- [ ] **First Contentful Paint** - < 1.5s
|
|
41
|
-
- [ ] **Time to Interactive** - < 3s
|
|
42
|
-
- [ ] **Largest Contentful Paint** - < 2.5s
|
|
43
|
-
|
|
44
|
-
## 📦 Bundle Optimization
|
|
45
|
-
|
|
46
|
-
### Tree Shaking
|
|
47
|
-
|
|
48
|
-
**Enable Tree Shaking**
|
|
49
|
-
```js
|
|
50
|
-
// webpack.config.js
|
|
51
|
-
module.exports = {
|
|
52
|
-
mode: 'production',
|
|
53
|
-
optimization: {
|
|
54
|
-
usedExports: true,
|
|
55
|
-
sideEffects: false,
|
|
56
|
-
},
|
|
57
|
-
};
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
**Import Only What You Need**
|
|
61
|
-
```tsx
|
|
62
|
-
// ❌ Bad - imports entire library
|
|
63
|
-
import * as PACE from '@jmruthers/pace-core';
|
|
64
|
-
|
|
65
|
-
// ✅ Good - imports only what you need
|
|
66
|
-
import { Button, DataTable } from '@jmruthers/pace-core';
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
**Use Dynamic Imports**
|
|
70
|
-
```tsx
|
|
71
|
-
// Lazy load heavy components
|
|
72
|
-
const HeavyComponent = React.lazy(() => import('./HeavyComponent'));
|
|
73
|
-
|
|
74
|
-
function App() {
|
|
75
|
-
return (
|
|
76
|
-
<Suspense fallback={<div>Loading...</div>}>
|
|
77
|
-
<HeavyComponent />
|
|
78
|
-
</Suspense>
|
|
79
|
-
);
|
|
80
|
-
}
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
### Code Splitting
|
|
84
|
-
|
|
85
|
-
**Route-based Code Splitting**
|
|
86
|
-
```tsx
|
|
87
|
-
import { lazy, Suspense } from 'react';
|
|
88
|
-
import { BrowserRouter, Routes, Route } from 'react-router-dom';
|
|
89
|
-
|
|
90
|
-
const Dashboard = lazy(() => import('./pages/Dashboard'));
|
|
91
|
-
const Users = lazy(() => import('./pages/Users'));
|
|
92
|
-
const Settings = lazy(() => import('./pages/Settings'));
|
|
93
|
-
|
|
94
|
-
function App() {
|
|
95
|
-
return (
|
|
96
|
-
<BrowserRouter>
|
|
97
|
-
<Suspense fallback={<div>Loading...</div>}>
|
|
98
|
-
<Routes>
|
|
99
|
-
<Route path="/" element={<Dashboard />} />
|
|
100
|
-
<Route path="/users" element={<Users />} />
|
|
101
|
-
<Route path="/settings" element={<Settings />} />
|
|
102
|
-
</Routes>
|
|
103
|
-
</Suspense>
|
|
104
|
-
</BrowserRouter>
|
|
105
|
-
);
|
|
106
|
-
}
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
**Component-based Code Splitting**
|
|
110
|
-
```tsx
|
|
111
|
-
import { lazy, Suspense } from 'react';
|
|
112
|
-
|
|
113
|
-
const DataTable = lazy(() => import('@jmruthers/pace-core').then(module => ({
|
|
114
|
-
default: module.DataTable
|
|
115
|
-
})));
|
|
116
|
-
|
|
117
|
-
function MyComponent() {
|
|
118
|
-
return (
|
|
119
|
-
<Suspense fallback={<div>Loading table...</div>}>
|
|
120
|
-
<DataTable data={data} columns={columns} />
|
|
121
|
-
</Suspense>
|
|
122
|
-
);
|
|
123
|
-
}
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
### Bundle Analysis
|
|
127
|
-
|
|
128
|
-
**Analyze Bundle Size**
|
|
129
|
-
```bash
|
|
130
|
-
# Install analyzer
|
|
131
|
-
npm install -D webpack-bundle-analyzer
|
|
132
|
-
|
|
133
|
-
# Add to package.json
|
|
134
|
-
{
|
|
135
|
-
"scripts": {
|
|
136
|
-
"analyze": "webpack-bundle-analyzer build/static/js/*.js"
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
# Run analysis
|
|
141
|
-
npm run build
|
|
142
|
-
npm run analyze
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
**Optimize Dependencies**
|
|
146
|
-
```bash
|
|
147
|
-
# Check for duplicate dependencies
|
|
148
|
-
npm ls --depth=0
|
|
149
|
-
|
|
150
|
-
# Check bundle size
|
|
151
|
-
npx bundlephobia @jmruthers/pace-core
|
|
152
|
-
|
|
153
|
-
# Find unused dependencies
|
|
154
|
-
npx depcheck
|
|
155
|
-
```
|
|
156
|
-
|
|
157
|
-
## ⚡ Runtime Performance
|
|
158
|
-
|
|
159
|
-
### Component Optimization
|
|
160
|
-
|
|
161
|
-
**Use React.memo for Expensive Components**
|
|
162
|
-
```tsx
|
|
163
|
-
import React, { memo } from 'react';
|
|
164
|
-
import { DataTable } from '@jmruthers/pace-core';
|
|
165
|
-
|
|
166
|
-
const ExpensiveTable = memo(({ data, columns }) => {
|
|
167
|
-
return <DataTable data={data} columns={columns} />;
|
|
168
|
-
});
|
|
169
|
-
|
|
170
|
-
// Only re-renders when data or columns change
|
|
171
|
-
function App() {
|
|
172
|
-
const [data, setData] = useState([]);
|
|
173
|
-
const [otherState, setOtherState] = useState('');
|
|
174
|
-
|
|
175
|
-
return (
|
|
176
|
-
<div>
|
|
177
|
-
<ExpensiveTable data={data} columns={columns} />
|
|
178
|
-
<button onClick={() => setOtherState('new value')}>
|
|
179
|
-
Update Other State
|
|
180
|
-
</button>
|
|
181
|
-
</div>
|
|
182
|
-
);
|
|
183
|
-
}
|
|
184
|
-
```
|
|
185
|
-
|
|
186
|
-
**Optimize Callbacks with useCallback**
|
|
187
|
-
```tsx
|
|
188
|
-
import { useCallback, useState } from 'react';
|
|
189
|
-
import { DataTable } from '@jmruthers/pace-core';
|
|
190
|
-
|
|
191
|
-
function MyComponent() {
|
|
192
|
-
const [data, setData] = useState([]);
|
|
193
|
-
|
|
194
|
-
// Memoize expensive callbacks
|
|
195
|
-
const handleDataChange = useCallback((newData) => {
|
|
196
|
-
setData(newData);
|
|
197
|
-
}, []);
|
|
198
|
-
|
|
199
|
-
const handleSort = useCallback((column, direction) => {
|
|
200
|
-
// Expensive sorting logic
|
|
201
|
-
const sorted = [...data].sort((a, b) => {
|
|
202
|
-
// Sorting logic
|
|
203
|
-
});
|
|
204
|
-
setData(sorted);
|
|
205
|
-
}, [data]);
|
|
206
|
-
|
|
207
|
-
return (
|
|
208
|
-
<DataTable
|
|
209
|
-
data={data}
|
|
210
|
-
columns={columns}
|
|
211
|
-
onDataChange={handleDataChange}
|
|
212
|
-
onSort={handleSort}
|
|
213
|
-
/>
|
|
214
|
-
);
|
|
215
|
-
}
|
|
216
|
-
```
|
|
217
|
-
|
|
218
|
-
**Optimize Expensive Calculations with useMemo**
|
|
219
|
-
```tsx
|
|
220
|
-
import { useMemo } from 'react';
|
|
221
|
-
import { DataTable } from '@jmruthers/pace-core';
|
|
222
|
-
|
|
223
|
-
function MyComponent() {
|
|
224
|
-
const [data, setData] = useState([]);
|
|
225
|
-
const [filter, setFilter] = useState('');
|
|
226
|
-
|
|
227
|
-
// Memoize expensive calculations
|
|
228
|
-
const filteredData = useMemo(() => {
|
|
229
|
-
return data.filter(item =>
|
|
230
|
-
item.name.toLowerCase().includes(filter.toLowerCase())
|
|
231
|
-
);
|
|
232
|
-
}, [data, filter]);
|
|
233
|
-
|
|
234
|
-
const sortedData = useMemo(() => {
|
|
235
|
-
return [...filteredData].sort((a, b) => a.name.localeCompare(b.name));
|
|
236
|
-
}, [filteredData]);
|
|
237
|
-
|
|
238
|
-
return (
|
|
239
|
-
<DataTable data={sortedData} columns={columns} />
|
|
240
|
-
);
|
|
241
|
-
}
|
|
242
|
-
```
|
|
243
|
-
|
|
244
|
-
### State Management Optimization
|
|
245
|
-
|
|
246
|
-
**Avoid Unnecessary Re-renders**
|
|
247
|
-
```tsx
|
|
248
|
-
// ❌ Bad - causes re-render on every state change
|
|
249
|
-
function App() {
|
|
250
|
-
const [user, setUser] = useState(null);
|
|
251
|
-
const [theme, setTheme] = useState('light');
|
|
252
|
-
|
|
253
|
-
return (
|
|
254
|
-
<div>
|
|
255
|
-
<UserProfile user={user} />
|
|
256
|
-
<ThemeToggle theme={theme} onThemeChange={setTheme} />
|
|
257
|
-
</div>
|
|
258
|
-
);
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
// ✅ Good - separate concerns
|
|
262
|
-
function App() {
|
|
263
|
-
return (
|
|
264
|
-
<UserProvider>
|
|
265
|
-
<UserProfile />
|
|
266
|
-
</UserProvider>
|
|
267
|
-
);
|
|
268
|
-
}
|
|
269
|
-
```
|
|
270
|
-
|
|
271
|
-
**Use Context Selectors**
|
|
272
|
-
```tsx
|
|
273
|
-
import { useContext, useMemo } from 'react';
|
|
274
|
-
import { UserContext } from '@jmruthers/pace-core';
|
|
275
|
-
|
|
276
|
-
function UserProfile() {
|
|
277
|
-
// Only re-renders when user changes, not when other context values change
|
|
278
|
-
const user = useContext(UserContext, (state) => state.user);
|
|
279
|
-
|
|
280
|
-
return <div>{user?.name}</div>;
|
|
281
|
-
}
|
|
282
|
-
```
|
|
283
|
-
|
|
284
|
-
### Data Table Performance
|
|
285
|
-
|
|
286
|
-
**Optimize Large Datasets**
|
|
287
|
-
```tsx
|
|
288
|
-
import { DataTable, useVirtualization } from '@jmruthers/pace-core';
|
|
289
|
-
|
|
290
|
-
function LargeDataTable() {
|
|
291
|
-
const [data, setData] = useState([]);
|
|
292
|
-
|
|
293
|
-
return (
|
|
294
|
-
<DataTable
|
|
295
|
-
data={data}
|
|
296
|
-
columns={columns}
|
|
297
|
-
// Enable virtualization for large datasets
|
|
298
|
-
enableVirtualization
|
|
299
|
-
// Set reasonable page size
|
|
300
|
-
pageSize={50}
|
|
301
|
-
// Enable server-side pagination
|
|
302
|
-
serverSidePagination
|
|
303
|
-
// Optimize rendering
|
|
304
|
-
enableRowSelection={false}
|
|
305
|
-
enableColumnResizing={false}
|
|
306
|
-
/>
|
|
307
|
-
);
|
|
308
|
-
}
|
|
309
|
-
```
|
|
310
|
-
|
|
311
|
-
**Implement Pagination**
|
|
312
|
-
```tsx
|
|
313
|
-
import { DataTable } from '@jmruthers/pace-core';
|
|
314
|
-
|
|
315
|
-
function PaginatedTable() {
|
|
316
|
-
const [data, setData] = useState([]);
|
|
317
|
-
const [currentPage, setCurrentPage] = useState(1);
|
|
318
|
-
const [pageSize, setPageSize] = useState(50);
|
|
319
|
-
|
|
320
|
-
const paginatedData = useMemo(() => {
|
|
321
|
-
const start = (currentPage - 1) * pageSize;
|
|
322
|
-
const end = start + pageSize;
|
|
323
|
-
return data.slice(start, end);
|
|
324
|
-
}, [data, currentPage, pageSize]);
|
|
325
|
-
|
|
326
|
-
return (
|
|
327
|
-
<DataTable
|
|
328
|
-
data={paginatedData}
|
|
329
|
-
columns={columns}
|
|
330
|
-
pagination={{
|
|
331
|
-
currentPage,
|
|
332
|
-
pageSize,
|
|
333
|
-
totalItems: data.length,
|
|
334
|
-
onPageChange: setCurrentPage,
|
|
335
|
-
onPageSizeChange: setPageSize,
|
|
336
|
-
}}
|
|
337
|
-
/>
|
|
338
|
-
);
|
|
339
|
-
}
|
|
340
|
-
```
|
|
341
|
-
|
|
342
|
-
## 💾 Caching Strategies
|
|
343
|
-
|
|
344
|
-
### API Response Caching
|
|
345
|
-
|
|
346
|
-
**Implement React Query**
|
|
347
|
-
```tsx
|
|
348
|
-
import { useQuery } from '@tanstack/react-query';
|
|
349
|
-
import { DataTable } from '@jmruthers/pace-core';
|
|
350
|
-
|
|
351
|
-
function UsersTable() {
|
|
352
|
-
const { data, isLoading, error } = useQuery({
|
|
353
|
-
queryKey: ['users'],
|
|
354
|
-
queryFn: fetchUsers,
|
|
355
|
-
staleTime: 5 * 60 * 1000, // 5 minutes
|
|
356
|
-
cacheTime: 10 * 60 * 1000, // 10 minutes
|
|
357
|
-
});
|
|
358
|
-
|
|
359
|
-
if (isLoading) return <div>Loading...</div>;
|
|
360
|
-
if (error) return <div>Error: {error.message}</div>;
|
|
361
|
-
|
|
362
|
-
return <DataTable data={data} columns={columns} />;
|
|
363
|
-
}
|
|
364
|
-
```
|
|
365
|
-
|
|
366
|
-
**Implement SWR**
|
|
367
|
-
```tsx
|
|
368
|
-
import useSWR from 'swr';
|
|
369
|
-
import { DataTable } from '@jmruthers/pace-core';
|
|
370
|
-
|
|
371
|
-
function UsersTable() {
|
|
372
|
-
const { data, error } = useSWR('/api/users', fetcher, {
|
|
373
|
-
revalidateOnFocus: false,
|
|
374
|
-
revalidateOnReconnect: true,
|
|
375
|
-
dedupingInterval: 60000, // 1 minute
|
|
376
|
-
});
|
|
377
|
-
|
|
378
|
-
if (error) return <div>Error: {error.message}</div>;
|
|
379
|
-
if (!data) return <div>Loading...</div>;
|
|
380
|
-
|
|
381
|
-
return <DataTable data={data} columns={columns} />;
|
|
382
|
-
}
|
|
383
|
-
```
|
|
384
|
-
|
|
385
|
-
### Component Caching
|
|
386
|
-
|
|
387
|
-
**Cache Expensive Components**
|
|
388
|
-
```tsx
|
|
389
|
-
import { memo, useMemo } from 'react';
|
|
390
|
-
import { DataTable } from '@jmruthers/pace-core';
|
|
391
|
-
|
|
392
|
-
const CachedDataTable = memo(({ data, columns, filters }) => {
|
|
393
|
-
const filteredData = useMemo(() => {
|
|
394
|
-
return data.filter(item =>
|
|
395
|
-
filters.every(filter => filter.predicate(item))
|
|
396
|
-
);
|
|
397
|
-
}, [data, filters]);
|
|
398
|
-
|
|
399
|
-
return <DataTable data={filteredData} columns={columns} />;
|
|
400
|
-
});
|
|
401
|
-
```
|
|
402
|
-
|
|
403
|
-
## 📊 Monitoring
|
|
404
|
-
|
|
405
|
-
### Performance Monitoring
|
|
406
|
-
|
|
407
|
-
**Use React DevTools Profiler**
|
|
408
|
-
```tsx
|
|
409
|
-
import { Profiler } from 'react';
|
|
410
|
-
|
|
411
|
-
function onRenderCallback(id, phase, actualDuration) {
|
|
412
|
-
console.log('Render:', { id, phase, actualDuration });
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
function App() {
|
|
416
|
-
return (
|
|
417
|
-
<Profiler id="App" onRender={onRenderCallback}>
|
|
418
|
-
<YourApp />
|
|
419
|
-
</Profiler>
|
|
420
|
-
);
|
|
421
|
-
}
|
|
422
|
-
```
|
|
423
|
-
|
|
424
|
-
**Implement Performance Metrics**
|
|
425
|
-
```tsx
|
|
426
|
-
import { useEffect } from 'react';
|
|
427
|
-
|
|
428
|
-
function usePerformanceMetrics() {
|
|
429
|
-
useEffect(() => {
|
|
430
|
-
// Measure First Contentful Paint
|
|
431
|
-
const observer = new PerformanceObserver((list) => {
|
|
432
|
-
for (const entry of list.getEntries()) {
|
|
433
|
-
if (entry.name === 'first-contentful-paint') {
|
|
434
|
-
console.log('FCP:', entry.startTime);
|
|
435
|
-
}
|
|
436
|
-
}
|
|
437
|
-
});
|
|
438
|
-
observer.observe({ entryTypes: ['paint'] });
|
|
439
|
-
|
|
440
|
-
return () => observer.disconnect();
|
|
441
|
-
}, []);
|
|
442
|
-
}
|
|
443
|
-
```
|
|
444
|
-
|
|
445
|
-
**Monitor Bundle Size**
|
|
446
|
-
```tsx
|
|
447
|
-
// Add to your build process
|
|
448
|
-
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
|
|
449
|
-
|
|
450
|
-
module.exports = {
|
|
451
|
-
plugins: [
|
|
452
|
-
new BundleAnalyzerPlugin({
|
|
453
|
-
analyzerMode: 'static',
|
|
454
|
-
openAnalyzer: false,
|
|
455
|
-
}),
|
|
456
|
-
],
|
|
457
|
-
};
|
|
458
|
-
```
|
|
459
|
-
|
|
460
|
-
### Real User Monitoring
|
|
461
|
-
|
|
462
|
-
**Implement RUM**
|
|
463
|
-
```tsx
|
|
464
|
-
import { useEffect } from 'react';
|
|
465
|
-
|
|
466
|
-
function useRUM() {
|
|
467
|
-
useEffect(() => {
|
|
468
|
-
// Send performance data to your analytics
|
|
469
|
-
const sendMetrics = () => {
|
|
470
|
-
const navigation = performance.getEntriesByType('navigation')[0];
|
|
471
|
-
const metrics = {
|
|
472
|
-
loadTime: navigation.loadEventEnd - navigation.loadEventStart,
|
|
473
|
-
domContentLoaded: navigation.domContentLoadedEventEnd - navigation.domContentLoadedEventStart,
|
|
474
|
-
firstPaint: performance.getEntriesByName('first-paint')[0]?.startTime,
|
|
475
|
-
firstContentfulPaint: performance.getEntriesByName('first-contentful-paint')[0]?.startTime,
|
|
476
|
-
};
|
|
477
|
-
|
|
478
|
-
// Send to your analytics service
|
|
479
|
-
analytics.track('performance', metrics);
|
|
480
|
-
};
|
|
481
|
-
|
|
482
|
-
window.addEventListener('load', sendMetrics);
|
|
483
|
-
return () => window.removeEventListener('load', sendMetrics);
|
|
484
|
-
}, []);
|
|
485
|
-
}
|
|
486
|
-
```
|
|
487
|
-
|
|
488
|
-
## 🎯 Performance Best Practices
|
|
489
|
-
|
|
490
|
-
### General Guidelines
|
|
491
|
-
|
|
492
|
-
1. **Measure First** - Always measure before optimizing
|
|
493
|
-
2. **Optimize Bottlenecks** - Focus on the biggest performance issues
|
|
494
|
-
3. **Test on Real Devices** - Use actual devices, not just desktop
|
|
495
|
-
4. **Monitor Continuously** - Set up performance monitoring
|
|
496
|
-
5. **Keep Dependencies Updated** - Regular updates often include performance improvements
|
|
497
|
-
|
|
498
|
-
### PACE Core Specific
|
|
499
|
-
|
|
500
|
-
1. **Use Design Tokens** - Import only the tokens you need
|
|
501
|
-
2. **Lazy Load Components** - Use dynamic imports for heavy components
|
|
502
|
-
3. **Optimize Data Tables** - Use virtualization for large datasets
|
|
503
|
-
4. **Cache API Responses** - Implement proper caching strategies
|
|
504
|
-
5. **Minimize Re-renders** - Use React.memo and useCallback appropriately
|
|
505
|
-
|
|
506
|
-
## 🛠️ Performance Tools
|
|
507
|
-
|
|
508
|
-
### Development Tools
|
|
509
|
-
- **React DevTools Profiler** - Component performance analysis
|
|
510
|
-
- **Chrome DevTools** - Network and performance analysis
|
|
511
|
-
- **webpack-bundle-analyzer** - Bundle size analysis
|
|
512
|
-
- **Lighthouse** - Performance auditing
|
|
513
|
-
|
|
514
|
-
### Production Tools
|
|
515
|
-
- **Web Vitals** - Core web vitals monitoring
|
|
516
|
-
- **Sentry** - Error and performance monitoring
|
|
517
|
-
- **DataDog** - Application performance monitoring
|
|
518
|
-
- **New Relic** - Full-stack performance monitoring
|
|
519
|
-
|
|
520
|
-
## 📚 Additional Resources
|
|
521
|
-
|
|
522
|
-
- **[Bundle Optimization Guide](./bundle-optimization.md)** - Detailed bundle optimization
|
|
523
|
-
- **[Runtime Performance Guide](./runtime-performance.md)** - Component optimization
|
|
524
|
-
- **[Caching Strategies](./caching-strategies.md)** - Advanced caching techniques
|
|
525
|
-
- **[Monitoring Guide](./monitoring.md)** - Performance monitoring setup
|
|
526
|
-
|
|
527
|
-
## 🆘 Troubleshooting
|
|
528
|
-
|
|
529
|
-
### Common Performance Issues
|
|
530
|
-
|
|
531
|
-
**Issue 1: Large Bundle Size**
|
|
532
|
-
- Use tree shaking
|
|
533
|
-
- Implement code splitting
|
|
534
|
-
- Remove unused dependencies
|
|
535
|
-
|
|
536
|
-
**Issue 2: Slow Rendering**
|
|
537
|
-
- Use React.memo
|
|
538
|
-
- Optimize callbacks with useCallback
|
|
539
|
-
- Implement virtualization
|
|
540
|
-
|
|
541
|
-
**Issue 3: Memory Leaks**
|
|
542
|
-
- Clean up event listeners
|
|
543
|
-
- Cancel API requests
|
|
544
|
-
- Clear timers and intervals
|
|
545
|
-
|
|
546
|
-
**Issue 4: Slow API Responses**
|
|
547
|
-
- Implement caching
|
|
548
|
-
- Use pagination
|
|
549
|
-
- Optimize database queries
|
|
550
|
-
|
|
551
|
-
Remember: **Performance is a feature, not an afterthought!**
|