@jmruthers/pace-core 0.6.5 → 0.6.7
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 +104 -0
- package/README.md +5 -403
- package/audit-tool/00-dependencies.cjs +394 -0
- package/audit-tool/audits/01-pace-core-compliance.cjs +556 -0
- package/audit-tool/audits/02-project-structure.cjs +255 -0
- package/audit-tool/audits/03-architecture.cjs +196 -0
- package/audit-tool/audits/04-code-quality.cjs +149 -0
- package/audit-tool/audits/05-styling.cjs +224 -0
- package/audit-tool/audits/06-security-rbac.cjs +544 -0
- package/audit-tool/audits/07-api-tech-stack.cjs +301 -0
- package/audit-tool/audits/08-testing-documentation.cjs +202 -0
- package/audit-tool/audits/09-operations.cjs +208 -0
- package/audit-tool/index.cjs +291 -0
- package/audit-tool/utils/code-utils.cjs +218 -0
- package/audit-tool/utils/file-utils.cjs +230 -0
- package/audit-tool/utils/report-utils.cjs +241 -0
- package/core-usage-manifest.json +93 -0
- package/cursor-rules/00-standards-overview.mdc +156 -0
- package/cursor-rules/01-pace-core-compliance.mdc +586 -0
- package/cursor-rules/02-project-structure.mdc +42 -4
- package/cursor-rules/{03-solid-principles.mdc → 03-architecture.mdc} +126 -10
- package/cursor-rules/04-code-quality.mdc +419 -0
- package/cursor-rules/{08-markup-quality.mdc → 05-styling.mdc} +104 -34
- package/cursor-rules/06-security-rbac.mdc +518 -0
- package/cursor-rules/07-api-tech-stack.mdc +377 -0
- package/cursor-rules/08-testing-documentation.mdc +324 -0
- package/cursor-rules/09-operations.mdc +365 -0
- package/dist/{AuthService-Cb34EQs3.d.ts → AuthService-DmfO5rGS.d.ts} +10 -0
- package/dist/DataTable-7PMH7XN7.js +15 -0
- package/dist/{DataTable-BMRU8a1j.d.ts → DataTable-DRUIgtUH.d.ts} +1 -1
- package/dist/{PublicPageProvider-QTFVrL-Z.d.ts → PublicPageProvider-DlsCaR5v.d.ts} +33 -72
- package/dist/UnifiedAuthProvider-ZT6TIGM7.js +7 -0
- package/dist/api-Y4MQWOFW.js +4 -0
- package/dist/audit-MYQXYZFU.js +3 -0
- package/dist/{chunk-DGUM43GV.js → chunk-3RG5ZIWI.js} +1 -4
- package/dist/{chunk-QXHPKYJV.js → chunk-4SXLQIZO.js} +1 -26
- package/dist/{chunk-UPPMRMYG.js → chunk-5X4QLXRG.js} +73 -151
- package/dist/chunk-6F3IILHI.js +62 -0
- package/dist/{chunk-E66EQZE6.js → chunk-6GLLNA6U.js} +3 -9
- package/dist/{chunk-ZSAAAMVR.js → chunk-6QYDGKQY.js} +1 -4
- package/dist/{chunk-FMUCXFII.js → chunk-7ILTDCL2.js} +9 -5
- package/dist/{chunk-M43Y4SSO.js → chunk-A3W6LW53.js} +15 -13
- package/dist/{chunk-63FOKYGO.js → chunk-AHU7G2R5.js} +2 -11
- package/dist/{chunk-HU2C6SSC.js → chunk-BM4CQ5P3.js} +606 -559
- package/dist/chunk-C7NSAPTL.js +1 -0
- package/dist/{chunk-J36DSWQK.js → chunk-FEJLJNWA.js} +7 -41
- package/dist/{chunk-IHB5DR3H.js → chunk-FTCRZOG2.js} +188 -387
- package/dist/{chunk-G37KK66H.js → chunk-FYHN4DD5.js} +60 -19
- package/dist/chunk-GHYHJTYV.js +994 -0
- package/dist/{chunk-VBXEHIUJ.js → chunk-HF6O3O37.js} +6 -88
- package/dist/{chunk-FFQEQTNW.js → chunk-IUBRCBSY.js} +134 -45
- package/dist/{chunk-6COVEUS7.js → chunk-JGWDVX64.js} +983 -1034
- package/dist/{chunk-RGAWHO7N.js → chunk-L4XMVJKY.js} +77 -222
- package/dist/chunk-MBADTM7L.js +64 -0
- package/dist/{chunk-M7MPQISP.js → chunk-OJ4SKRSV.js} +3 -16
- package/dist/{chunk-IVOFDYWT.js → chunk-Q7Q7V5NV.js} +2109 -1604
- package/dist/{chunk-JGRYX5UX.js → chunk-S7DKJPLT.js} +29 -58
- package/dist/{chunk-PWLANIRT.js → chunk-TTRFSOKR.js} +1 -7
- package/dist/{chunk-5DRSZLL2.js → chunk-UH3NTO3F.js} +1 -6
- package/dist/{chunk-NTM7ZSB6.js → chunk-VBCS3DUA.js} +261 -168
- package/dist/{chunk-EFN2EIMK.js → chunk-ZFYPMX46.js} +271 -87
- package/dist/{chunk-L4OXEN46.js → chunk-ZKAWKYT4.js} +10 -24
- package/dist/components.d.ts +7 -5
- package/dist/components.js +46 -257
- package/dist/{database.generated-CzIvgcPu.d.ts → database.generated-CcnC_DRc.d.ts} +4795 -3691
- package/dist/eslint-rules/index.cjs +35 -0
- package/{src/eslint-rules/pace-core-compliance.cjs → dist/eslint-rules/rules/01-pace-core-compliance.cjs} +234 -235
- package/dist/eslint-rules/rules/04-code-quality.cjs +290 -0
- package/dist/eslint-rules/rules/05-styling.cjs +61 -0
- package/dist/eslint-rules/rules/06-security-rbac.cjs +806 -0
- package/dist/eslint-rules/rules/07-api-tech-stack.cjs +263 -0
- package/dist/eslint-rules/rules/08-testing.cjs +94 -0
- package/dist/eslint-rules/utils/helpers.cjs +42 -0
- package/dist/eslint-rules/utils/manifest-loader.cjs +75 -0
- package/dist/hooks.d.ts +6 -6
- package/dist/hooks.js +62 -172
- package/dist/icons/index.d.ts +1 -0
- package/dist/icons/index.js +1 -0
- package/dist/index.d.ts +12 -11
- package/dist/index.js +67 -660
- package/dist/providers.d.ts +2 -2
- package/dist/providers.js +8 -35
- package/dist/rbac/eslint-rules.d.ts +46 -44
- package/dist/rbac/eslint-rules.js +7 -4
- package/dist/rbac/index.d.ts +109 -586
- package/dist/rbac/index.js +14 -207
- package/dist/styles/index.js +2 -12
- package/dist/theming/runtime.d.ts +14 -1
- package/dist/theming/runtime.js +3 -19
- package/dist/{timezone-CHhWg6b4.d.ts → timezone-BZe_eUxx.d.ts} +175 -1
- package/dist/{types-CkbwOr4Y.d.ts → types-DXstZpNI.d.ts} +4 -17
- package/dist/types-t9H8qKRw.d.ts +55 -0
- package/dist/types.d.ts +1 -1
- package/dist/types.js +7 -94
- package/dist/{usePublicRouteParams-ClnV4tnv.d.ts → usePublicRouteParams-MamNgwqe.d.ts} +20 -20
- package/dist/utils.d.ts +24 -117
- package/dist/utils.js +54 -392
- package/docs/README.md +17 -7
- package/docs/api/README.md +4 -402
- package/docs/api/modules.md +301 -871
- package/docs/api-reference/components.md +21 -21
- package/docs/api-reference/deprecated.md +31 -6
- package/docs/api-reference/hooks.md +80 -80
- package/docs/api-reference/rpc-functions.md +78 -3
- package/docs/api-reference/types.md +1 -1
- package/docs/api-reference/utilities.md +1 -1
- package/docs/architecture/README.md +1 -1
- package/docs/core-concepts/events.md +3 -3
- package/docs/core-concepts/organisations.md +6 -6
- package/docs/core-concepts/permissions.md +6 -6
- package/docs/documentation-index.md +12 -18
- package/docs/getting-started/cursor-rules.md +3 -23
- package/docs/getting-started/dependencies.md +650 -0
- package/docs/getting-started/documentation-index.md +1 -1
- package/docs/getting-started/examples/README.md +4 -4
- package/docs/getting-started/examples/full-featured-app.md +1 -1
- package/docs/getting-started/faq.md +2 -2
- package/docs/getting-started/installation-guide.md +20 -7
- package/docs/getting-started/quick-reference.md +4 -4
- package/docs/getting-started/quick-start.md +23 -12
- package/docs/implementation-guides/authentication.md +15 -15
- package/docs/implementation-guides/component-styling.md +1 -1
- package/docs/implementation-guides/data-tables.md +126 -33
- package/docs/implementation-guides/datatable-rbac-usage.md +1 -1
- package/docs/implementation-guides/dynamic-colors.md +3 -3
- package/docs/implementation-guides/file-upload-storage.md +2 -2
- package/docs/implementation-guides/hierarchical-datatable.md +40 -60
- package/docs/implementation-guides/inactivity-tracking.md +3 -3
- package/docs/implementation-guides/large-datasets.md +3 -2
- package/docs/implementation-guides/organisation-security.md +2 -2
- package/docs/implementation-guides/performance.md +2 -2
- package/docs/implementation-guides/permission-enforcement.md +5 -1
- package/docs/migration/V0.3.44_organisation-context-timing-fix.md +1 -1
- package/docs/migration/V0.4.0_rbac-migration.md +6 -6
- package/docs/rbac/MIGRATION_GUIDE.md +819 -0
- package/docs/rbac/RBAC_CONTRACT.md +724 -0
- package/docs/rbac/README.md +17 -8
- package/docs/rbac/advanced-patterns.md +6 -6
- package/docs/rbac/api-reference.md +20 -20
- package/docs/rbac/edge-functions-guide.md +376 -0
- package/docs/rbac/event-based-apps.md +3 -3
- package/docs/rbac/examples.md +41 -41
- package/docs/rbac/getting-started.md +37 -37
- package/docs/rbac/performance.md +1 -1
- package/docs/rbac/quick-start.md +52 -52
- package/docs/rbac/secure-client-protection.md +1 -35
- package/docs/rbac/troubleshooting.md +1 -1
- package/docs/security/README.md +5 -5
- package/docs/standards/0-standards-overview.md +220 -0
- package/docs/standards/1-pace-core-compliance-standards.md +986 -0
- package/docs/standards/2-project-structure-standards.md +949 -0
- package/docs/standards/3-architecture-standards.md +606 -0
- package/docs/standards/4-code-quality-standards.md +728 -0
- package/docs/standards/5-styling-standards.md +348 -0
- package/docs/standards/{07-rbac-and-rls-standard.md → 6-security-rbac-standards.md} +269 -66
- package/docs/standards/7-api-tech-stack-standards.md +662 -0
- package/docs/standards/8-testing-documentation-standards.md +401 -0
- package/docs/standards/9-operations-standards.md +1102 -0
- package/docs/standards/README.md +185 -57
- package/docs/troubleshooting/README.md +4 -4
- package/docs/troubleshooting/common-issues.md +2 -2
- package/docs/troubleshooting/debugging.md +9 -9
- package/docs/troubleshooting/migration.md +4 -4
- package/docs/troubleshooting/organisation-context-setup.md +42 -19
- package/eslint-config-pace-core.cjs +33 -6
- package/package.json +35 -23
- package/scripts/install-cursor-rules.cjs +25 -6
- package/scripts/install-eslint-config.cjs +284 -0
- package/src/__tests__/fixtures/supabase.ts +1 -1
- package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +3 -3
- package/src/__tests__/helpers/__tests__/optimized-test-setup.test.ts +1 -1
- package/src/__tests__/helpers/__tests__/supabaseMock.test.ts +1 -1
- package/src/__tests__/helpers/__tests__/test-providers.test.tsx +2 -2
- package/src/__tests__/helpers/__tests__/test-utils.test.tsx +13 -13
- package/src/__tests__/helpers/component-test-utils.tsx +1 -1
- package/src/__tests__/helpers/supabaseMock.ts +2 -2
- package/src/__tests__/integration/UserProfile.test.tsx +14 -14
- package/src/__tests__/public-recipe-view.test.ts +38 -9
- package/src/__tests__/rbac/PagePermissionGuard.test.tsx +6 -6
- package/src/__tests__/templates/accessibility.test.template.tsx +9 -9
- package/src/__tests__/templates/component.test.template.tsx +18 -15
- package/src/components/Button/Button.tsx +5 -1
- package/src/components/Calendar/Calendar.tsx +201 -47
- package/src/components/ContextSelector/ContextSelector.tsx +106 -119
- package/src/components/DataTable/AUDIT_REPORT.md +293 -0
- package/src/components/DataTable/__tests__/DataTableCore.test.tsx +10 -2
- package/src/components/DataTable/__tests__/a11y.basic.test.tsx +10 -4
- package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +9 -9
- package/src/components/DataTable/components/ColumnFilter.tsx +63 -74
- package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +43 -41
- package/src/components/DataTable/components/DataTableCore.tsx +186 -13
- package/src/components/DataTable/components/DataTableErrorBoundary.tsx +9 -11
- package/src/components/DataTable/components/DataTableLayout.tsx +35 -21
- package/src/components/DataTable/components/EditFields.tsx +23 -3
- package/src/components/DataTable/components/EditableRow.tsx +12 -9
- package/src/components/DataTable/components/EmptyState.tsx +10 -9
- package/src/components/DataTable/components/FilterRow.tsx +2 -4
- package/src/components/DataTable/components/ImportModal.tsx +124 -126
- package/src/components/DataTable/components/LoadingState.tsx +5 -6
- package/src/components/DataTable/components/RowComponent.tsx +12 -0
- package/src/components/DataTable/components/SortIndicator.tsx +50 -0
- package/src/components/DataTable/components/__tests__/COVERAGE_NOTE.md +4 -4
- package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +23 -82
- package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +37 -9
- package/src/components/DataTable/components/__tests__/EmptyState.test.tsx +7 -4
- package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +12 -4
- package/src/components/DataTable/components/__tests__/LoadingState.test.tsx +41 -27
- package/src/components/DataTable/components/hooks/usePermissionTracking.ts +0 -4
- package/src/components/DataTable/components/index.ts +2 -1
- package/src/components/DataTable/hooks/__tests__/useDataTableState.test.ts +51 -47
- package/src/components/DataTable/hooks/useDataTablePermissions.ts +24 -21
- package/src/components/DataTable/hooks/useDataTableState.ts +125 -9
- package/src/components/DataTable/hooks/useTableColumns.ts +40 -2
- package/src/components/DataTable/hooks/useTableHandlers.ts +11 -0
- package/src/components/DataTable/types.ts +5 -18
- package/src/components/DataTable/utils/a11yUtils.ts +17 -0
- package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +2 -1
- package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.tsx +11 -15
- package/src/components/DateTimeField/DateTimeField.tsx +10 -9
- package/src/components/Dialog/Dialog.test.tsx +128 -104
- package/src/components/Dialog/Dialog.tsx +742 -24
- package/src/components/ErrorBoundary/ErrorBoundary.tsx +77 -79
- package/src/components/FileDisplay/FileDisplay.test.tsx +4 -2
- package/src/components/FileDisplay/FileDisplay.tsx +23 -17
- package/src/components/FileUpload/FileUpload.test.tsx +52 -14
- package/src/components/FileUpload/FileUpload.tsx +112 -130
- package/src/components/Form/Form.test.tsx +6 -8
- package/src/components/Form/Form.tsx +365 -4
- package/src/components/NavigationMenu/NavigationMenu.test.tsx +14 -13
- package/src/components/NavigationMenu/useNavigationFiltering.ts +11 -21
- package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +6 -4
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +11 -15
- package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +108 -61
- package/src/components/PaceLoginPage/PaceLoginPage.tsx +27 -3
- package/src/components/Progress/Progress.tsx +2 -4
- package/src/components/ProtectedRoute/ProtectedRoute.tsx +8 -8
- package/src/components/Select/Select.tsx +109 -98
- package/src/components/Select/types.ts +4 -1
- package/src/components/UserMenu/UserMenu.tsx +9 -6
- package/src/hooks/__tests__/ServiceHooks.test.tsx +16 -16
- package/src/hooks/__tests__/hooks.integration.test.tsx +55 -57
- package/src/hooks/__tests__/useAppConfig.unit.test.ts +129 -67
- package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +97 -97
- package/src/hooks/__tests__/usePublicEvent.simple.test.ts +149 -67
- package/src/hooks/__tests__/usePublicEvent.test.ts +149 -79
- package/src/hooks/__tests__/usePublicEvent.unit.test.ts +158 -109
- package/src/hooks/__tests__/useSessionDraft.test.ts +163 -0
- package/src/hooks/__tests__/useSessionRestoration.unit.test.tsx +10 -5
- package/src/hooks/public/usePublicEvent.ts +67 -195
- package/src/hooks/public/usePublicEventLogo.test.ts +70 -17
- package/src/hooks/public/usePublicEventLogo.ts +24 -14
- package/src/hooks/public/usePublicFileDisplay.ts +2 -2
- package/src/hooks/public/usePublicRouteParams.ts +5 -5
- package/src/hooks/useAppConfig.ts +28 -26
- package/src/hooks/useEventTheme.test.ts +217 -239
- package/src/hooks/useEventTheme.ts +16 -28
- package/src/hooks/useFileDisplay.ts +2 -2
- package/src/hooks/useOrganisationPermissions.ts +5 -7
- package/src/hooks/useQueryCache.ts +0 -1
- package/src/hooks/useSessionDraft.ts +380 -0
- package/src/hooks/useSessionRestoration.ts +3 -1
- package/src/icons/index.ts +27 -0
- package/src/index.ts +5 -0
- package/src/providers/OrganisationProvider.tsx +23 -14
- package/src/providers/UnifiedAuthProvider.smoke.test.tsx +21 -21
- package/src/providers/__tests__/AuthProvider.test.tsx +21 -21
- package/src/providers/__tests__/EventProvider.test.tsx +61 -61
- package/src/providers/__tests__/InactivityProvider.test.tsx +56 -56
- package/src/providers/__tests__/OrganisationProvider.test.tsx +75 -75
- package/src/providers/__tests__/ProviderLifecycle.test.tsx +37 -37
- package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +103 -103
- package/src/providers/services/EventServiceProvider.tsx +1 -24
- package/src/providers/services/UnifiedAuthProvider.tsx +5 -48
- package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +7 -7
- package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +13 -10
- package/src/rbac/__tests__/adapters.comprehensive.test.tsx +7 -457
- package/src/rbac/__tests__/auth-rbac.e2e.test.tsx +33 -7
- package/src/rbac/adapters.tsx +7 -295
- package/src/rbac/api.test.ts +44 -56
- package/src/rbac/api.ts +10 -17
- package/src/rbac/cache-invalidation.ts +0 -1
- package/src/rbac/compliance/index.ts +10 -0
- package/src/rbac/compliance/pattern-detector.ts +553 -0
- package/src/rbac/compliance/runtime-compliance.ts +22 -0
- package/src/rbac/components/AccessDenied.tsx +150 -0
- package/src/rbac/components/NavigationGuard.tsx +12 -20
- package/src/rbac/components/PagePermissionGuard.tsx +4 -24
- package/src/rbac/components/__tests__/NavigationGuard.test.tsx +21 -8
- package/src/rbac/components/index.ts +3 -41
- package/src/rbac/eslint-rules.js +1 -1
- package/src/rbac/hooks/index.ts +0 -3
- package/src/rbac/hooks/permissions/index.ts +0 -3
- package/src/rbac/hooks/permissions/useAccessLevel.ts +4 -8
- package/src/rbac/hooks/usePermissions.ts +0 -3
- package/src/rbac/hooks/useResolvedScope.test.ts +57 -47
- package/src/rbac/hooks/useResolvedScope.ts +58 -140
- package/src/rbac/hooks/useResourcePermissions.test.ts +124 -38
- package/src/rbac/hooks/useResourcePermissions.ts +139 -48
- package/src/rbac/hooks/useRoleManagement.test.ts +65 -22
- package/src/rbac/hooks/useRoleManagement.ts +147 -19
- package/src/rbac/hooks/useSecureSupabase.ts +4 -8
- package/src/rbac/index.ts +7 -9
- package/src/rbac/utils/contextValidator.ts +9 -7
- package/src/services/AuthService.ts +130 -18
- package/src/services/EventService.ts +4 -97
- package/src/services/InactivityService.ts +16 -0
- package/src/services/OrganisationService.ts +7 -44
- package/src/services/__tests__/OrganisationService.test.ts +26 -8
- package/src/services/base/BaseService.ts +0 -3
- package/src/styles/core.css +7 -0
- package/src/theming/__tests__/parseEventColours.test.ts +9 -3
- package/src/theming/parseEventColours.ts +22 -10
- package/src/types/database.generated.ts +4733 -3809
- package/src/utils/__tests__/lazyLoad.unit.test.tsx +42 -39
- package/src/utils/__tests__/organisationContext.unit.test.ts +9 -10
- package/src/utils/context/organisationContext.test.ts +13 -28
- package/src/utils/context/organisationContext.ts +21 -52
- package/src/utils/dynamic/dynamicUtils.ts +1 -1
- package/src/utils/file-reference/index.ts +39 -15
- package/src/utils/formatting/formatDateTime.test.ts +3 -2
- package/src/utils/google-places/loadGoogleMapsScript.ts +29 -4
- package/src/utils/index.ts +4 -1
- package/src/utils/persistence/__tests__/keyDerivation.test.ts +135 -0
- package/src/utils/persistence/__tests__/sensitiveFieldDetection.test.ts +123 -0
- package/src/utils/persistence/keyDerivation.ts +304 -0
- package/src/utils/persistence/sensitiveFieldDetection.ts +212 -0
- package/src/utils/security/secureStorage.ts +5 -5
- package/src/utils/storage/README.md +1 -1
- package/src/utils/storage/helpers.ts +3 -3
- package/src/utils/supabase/createBaseClient.ts +147 -0
- package/src/utils/timezone/timezone.test.ts +1 -2
- package/src/utils/timezone/timezone.ts +1 -1
- package/src/utils/validation/csrf.ts +4 -4
- package/cursor-rules/00-pace-core-compliance.mdc +0 -331
- package/cursor-rules/01-standards-compliance.mdc +0 -244
- package/cursor-rules/04-testing-standards.mdc +0 -268
- package/cursor-rules/05-bug-reports-and-features.mdc +0 -246
- package/cursor-rules/06-code-quality.mdc +0 -309
- package/cursor-rules/07-tech-stack-compliance.mdc +0 -214
- package/cursor-rules/CHANGELOG.md +0 -119
- package/cursor-rules/README.md +0 -192
- package/dist/DataTable-AOVNCPTX.js +0 -175
- package/dist/DataTable-AOVNCPTX.js.map +0 -1
- package/dist/UnifiedAuthProvider-4SBX4LU5.js +0 -18
- package/dist/UnifiedAuthProvider-4SBX4LU5.js.map +0 -1
- package/dist/api-O6HTBX5Y.js +0 -52
- package/dist/api-O6HTBX5Y.js.map +0 -1
- package/dist/audit-V53FV5AG.js +0 -17
- package/dist/audit-V53FV5AG.js.map +0 -1
- package/dist/chunk-5DRSZLL2.js.map +0 -1
- package/dist/chunk-63FOKYGO.js.map +0 -1
- package/dist/chunk-6COVEUS7.js.map +0 -1
- package/dist/chunk-AFVQODI2.js +0 -263
- package/dist/chunk-AFVQODI2.js.map +0 -1
- package/dist/chunk-DGUM43GV.js.map +0 -1
- package/dist/chunk-E66EQZE6.js.map +0 -1
- package/dist/chunk-EFN2EIMK.js.map +0 -1
- package/dist/chunk-FFQEQTNW.js.map +0 -1
- package/dist/chunk-FMUCXFII.js.map +0 -1
- package/dist/chunk-G37KK66H.js.map +0 -1
- package/dist/chunk-G7QEZTYQ.js +0 -2053
- package/dist/chunk-G7QEZTYQ.js.map +0 -1
- package/dist/chunk-HU2C6SSC.js.map +0 -1
- package/dist/chunk-IHB5DR3H.js.map +0 -1
- package/dist/chunk-IVOFDYWT.js.map +0 -1
- package/dist/chunk-J36DSWQK.js.map +0 -1
- package/dist/chunk-JGRYX5UX.js.map +0 -1
- package/dist/chunk-KQCRWDSA.js +0 -1
- package/dist/chunk-KQCRWDSA.js.map +0 -1
- package/dist/chunk-L4OXEN46.js.map +0 -1
- package/dist/chunk-LMC26NLJ.js +0 -84
- package/dist/chunk-LMC26NLJ.js.map +0 -1
- package/dist/chunk-M43Y4SSO.js.map +0 -1
- package/dist/chunk-M7MPQISP.js.map +0 -1
- package/dist/chunk-NTM7ZSB6.js.map +0 -1
- package/dist/chunk-PWLANIRT.js.map +0 -1
- package/dist/chunk-QXHPKYJV.js.map +0 -1
- package/dist/chunk-RGAWHO7N.js.map +0 -1
- package/dist/chunk-UPPMRMYG.js.map +0 -1
- package/dist/chunk-VBXEHIUJ.js.map +0 -1
- package/dist/chunk-ZSAAAMVR.js.map +0 -1
- package/dist/components.js.map +0 -1
- package/dist/contextValidator-5OGXSPKS.js +0 -9
- package/dist/contextValidator-5OGXSPKS.js.map +0 -1
- package/dist/eslint-rules/pace-core-compliance.cjs +0 -510
- package/dist/hooks.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/providers.js.map +0 -1
- package/dist/rbac/eslint-rules.js.map +0 -1
- package/dist/rbac/index.js.map +0 -1
- package/dist/styles/index.js.map +0 -1
- package/dist/theming/runtime.js.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/utils.js.map +0 -1
- package/docs/best-practices/README.md +0 -472
- package/docs/best-practices/accessibility.md +0 -601
- package/docs/best-practices/common-patterns.md +0 -516
- package/docs/best-practices/deployment.md +0 -1103
- package/docs/best-practices/performance.md +0 -1328
- package/docs/best-practices/security.md +0 -940
- package/docs/best-practices/testing.md +0 -1034
- package/docs/rbac/compliance/compliance-guide.md +0 -544
- package/docs/standards/01-architecture-standard.md +0 -44
- package/docs/standards/02-api-and-rpc-standard.md +0 -39
- package/docs/standards/03-component-standard.md +0 -32
- package/docs/standards/04-code-style-standard.md +0 -32
- package/docs/standards/05-security-standard.md +0 -44
- package/docs/standards/06-testing-and-docs-standard.md +0 -29
- package/docs/standards/pace-core-compliance.md +0 -432
- package/scripts/audit/core/checks/accessibility.cjs +0 -197
- package/scripts/audit/core/checks/api-usage.cjs +0 -191
- package/scripts/audit/core/checks/bundle.cjs +0 -142
- package/scripts/audit/core/checks/compliance.cjs +0 -2706
- package/scripts/audit/core/checks/config.cjs +0 -54
- package/scripts/audit/core/checks/coverage.cjs +0 -84
- package/scripts/audit/core/checks/dependencies.cjs +0 -994
- package/scripts/audit/core/checks/documentation.cjs +0 -268
- package/scripts/audit/core/checks/environment.cjs +0 -116
- package/scripts/audit/core/checks/error-handling.cjs +0 -340
- package/scripts/audit/core/checks/forms.cjs +0 -172
- package/scripts/audit/core/checks/heuristics.cjs +0 -68
- package/scripts/audit/core/checks/hooks.cjs +0 -334
- package/scripts/audit/core/checks/imports.cjs +0 -244
- package/scripts/audit/core/checks/performance.cjs +0 -325
- package/scripts/audit/core/checks/routes.cjs +0 -117
- package/scripts/audit/core/checks/state.cjs +0 -130
- package/scripts/audit/core/checks/structure.cjs +0 -65
- package/scripts/audit/core/checks/style.cjs +0 -584
- package/scripts/audit/core/checks/testing.cjs +0 -122
- package/scripts/audit/core/checks/typescript.cjs +0 -61
- package/scripts/audit/core/scanner.cjs +0 -199
- package/scripts/audit/core/utils.cjs +0 -137
- package/scripts/audit/index.cjs +0 -223
- package/scripts/audit/reporters/console.cjs +0 -151
- package/scripts/audit/reporters/json.cjs +0 -54
- package/scripts/audit/reporters/markdown.cjs +0 -124
- package/scripts/audit-consuming-app.cjs +0 -86
- package/src/components/DataTable/components/DataTableBody.tsx +0 -454
- package/src/components/DataTable/components/DraggableColumnHeader.tsx +0 -156
- package/src/components/DataTable/components/ExpandButton.tsx +0 -113
- package/src/components/DataTable/components/GroupHeader.tsx +0 -54
- package/src/components/DataTable/components/ViewRowModal.tsx +0 -68
- package/src/components/DataTable/components/VirtualizedDataTable.tsx +0 -525
- package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +0 -462
- package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +0 -393
- package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +0 -476
- package/src/components/DataTable/components/__tests__/VirtualizedDataTable.test.tsx +0 -128
- package/src/components/DataTable/core/DataTableContext.tsx +0 -216
- package/src/components/DataTable/core/__tests__/DataTableContext.test.tsx +0 -136
- package/src/components/DataTable/hooks/__tests__/useColumnReordering.test.ts +0 -570
- package/src/components/DataTable/hooks/useColumnReordering.ts +0 -123
- package/src/components/DataTable/utils/debugTools.ts +0 -514
- package/src/eslint-rules/pace-core-compliance.js +0 -638
- package/src/rbac/components/EnhancedNavigationMenu.test.tsx +0 -555
- package/src/rbac/components/EnhancedNavigationMenu.tsx +0 -293
- package/src/rbac/components/NavigationProvider.test.tsx +0 -481
- package/src/rbac/components/NavigationProvider.tsx +0 -345
- package/src/rbac/components/PagePermissionProvider.test.tsx +0 -476
- package/src/rbac/components/PagePermissionProvider.tsx +0 -279
- package/src/rbac/components/PermissionEnforcer.tsx +0 -312
- package/src/rbac/components/RoleBasedRouter.tsx +0 -440
- package/src/rbac/components/SecureDataProvider.test.tsx +0 -543
- package/src/rbac/components/SecureDataProvider.tsx +0 -339
- package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +0 -620
- package/src/rbac/components/__tests__/NavigationProvider.test.tsx +0 -726
- package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +0 -661
- package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +0 -881
- package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +0 -783
- package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +0 -645
- package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +0 -659
- package/src/rbac/hooks/permissions/useCachedPermissions.ts +0 -79
- package/src/rbac/hooks/permissions/useHasAllPermissions.ts +0 -90
- package/src/rbac/hooks/permissions/useHasAnyPermission.ts +0 -90
|
@@ -1,472 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
lastUpdated: 2025-11-18T17:00:00+11:00
|
|
3
|
-
version: 0.5.181
|
|
4
|
-
reviewedBy: documentation-standards-audit
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# Best Practices
|
|
8
|
-
|
|
9
|
-
> **🎯 Build Better Apps** | [Security](#security) | [Performance](#performance) | [Testing](#testing) | [Deployment](#deployment)
|
|
10
|
-
|
|
11
|
-
[← Back to Documentation](../README.md) | [↑ Table of Contents](#table-of-contents)
|
|
12
|
-
|
|
13
|
-
Comprehensive best practices for building secure, performant, and maintainable applications with PACE Core.
|
|
14
|
-
|
|
15
|
-
## 📋 Table of Contents
|
|
16
|
-
|
|
17
|
-
- [Security Best Practices](#-security-best-practices)
|
|
18
|
-
- [Performance Optimization](#-performance-optimization)
|
|
19
|
-
- [Testing Strategies](#-testing-strategies)
|
|
20
|
-
- [Deployment Guidelines](#-deployment-guidelines)
|
|
21
|
-
- [Code Quality](#-code-quality)
|
|
22
|
-
- [Accessibility](#-accessibility)
|
|
23
|
-
- [Maintenance](#-maintenance)
|
|
24
|
-
|
|
25
|
-
## Core Topics
|
|
26
|
-
|
|
27
|
-
### Security
|
|
28
|
-
- [**Security Best Practices**](./security.md) - Security guidelines and secure coding patterns
|
|
29
|
-
|
|
30
|
-
### Accessibility
|
|
31
|
-
- [**Accessibility Guide**](./accessibility.md) - WCAG compliance and inclusive design
|
|
32
|
-
|
|
33
|
-
### Performance
|
|
34
|
-
- [**Performance Optimization**](./performance.md) - Comprehensive performance optimization strategies
|
|
35
|
-
|
|
36
|
-
### Testing
|
|
37
|
-
- [**Testing Best Practices**](./testing.md) - Testing strategies and patterns
|
|
38
|
-
|
|
39
|
-
### Deployment
|
|
40
|
-
- [**Deployment Guide**](./deployment.md) - Production deployment guidelines
|
|
41
|
-
|
|
42
|
-
---
|
|
43
|
-
|
|
44
|
-
## 🔒 Security Best Practices
|
|
45
|
-
|
|
46
|
-
### Authentication & Authorization
|
|
47
|
-
|
|
48
|
-
**✅ Do:**
|
|
49
|
-
- Always validate permissions server-side
|
|
50
|
-
- Use the built-in RBAC system for access control
|
|
51
|
-
- Implement proper session management
|
|
52
|
-
- Enable MFA where possible
|
|
53
|
-
|
|
54
|
-
```tsx
|
|
55
|
-
// ✅ Good - Server-side validation
|
|
56
|
-
const { data, error } = await supabase
|
|
57
|
-
.from('users')
|
|
58
|
-
.select('*')
|
|
59
|
-
.eq('organisation_id', user.organisation_id); // RLS handles security
|
|
60
|
-
|
|
61
|
-
// ❌ Bad - Client-side only validation
|
|
62
|
-
if (user.role === 'admin') {
|
|
63
|
-
// This can be bypassed!
|
|
64
|
-
}
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
**✅ Do:**
|
|
68
|
-
- Use permission guards for UI elements
|
|
69
|
-
- Implement proper error boundaries
|
|
70
|
-
- Sanitize all user inputs
|
|
71
|
-
|
|
72
|
-
```tsx
|
|
73
|
-
// ✅ Good - Permission-based rendering
|
|
74
|
-
<PermissionGuard
|
|
75
|
-
operation="read"
|
|
76
|
-
resource="sensitive_data"
|
|
77
|
-
fallback={<div>Access denied</div>}
|
|
78
|
-
>
|
|
79
|
-
<SensitiveDataComponent />
|
|
80
|
-
</PermissionGuard>
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
### Data Protection
|
|
84
|
-
|
|
85
|
-
**✅ Do:**
|
|
86
|
-
- Use Row Level Security (RLS) policies
|
|
87
|
-
- Encrypt sensitive data at rest
|
|
88
|
-
- Implement proper audit logging
|
|
89
|
-
- Validate all inputs with Zod schemas
|
|
90
|
-
|
|
91
|
-
```tsx
|
|
92
|
-
// ✅ Good - Input validation
|
|
93
|
-
const userSchema = z.object({
|
|
94
|
-
email: z.string().email(),
|
|
95
|
-
password: z.string().min(8).regex(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)/),
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
const result = userSchema.safeParse(formData);
|
|
99
|
-
if (!result.success) {
|
|
100
|
-
// Handle validation errors
|
|
101
|
-
}
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
For detailed security guidelines, see [Security Best Practices](./security.md).
|
|
105
|
-
|
|
106
|
-
## ⚡ Performance Optimization
|
|
107
|
-
|
|
108
|
-
### Bundle Optimization
|
|
109
|
-
|
|
110
|
-
**✅ Do:**
|
|
111
|
-
- Use tree shaking for smaller bundles
|
|
112
|
-
- Implement code splitting
|
|
113
|
-
- Lazy load heavy components
|
|
114
|
-
- Optimize images and assets
|
|
115
|
-
|
|
116
|
-
```tsx
|
|
117
|
-
// ✅ Good - Lazy loading
|
|
118
|
-
const HeavyComponent = React.lazy(() => import('./HeavyComponent'));
|
|
119
|
-
|
|
120
|
-
function App() {
|
|
121
|
-
return (
|
|
122
|
-
<Suspense fallback={<LoadingSpinner />}>
|
|
123
|
-
<HeavyComponent />
|
|
124
|
-
</Suspense>
|
|
125
|
-
);
|
|
126
|
-
}
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
### Runtime Performance
|
|
130
|
-
|
|
131
|
-
**✅ Do:**
|
|
132
|
-
- Use React.memo for expensive components
|
|
133
|
-
- Optimize callbacks with useCallback
|
|
134
|
-
- Implement proper memoization
|
|
135
|
-
- Use virtualization for large lists
|
|
136
|
-
|
|
137
|
-
```tsx
|
|
138
|
-
// ✅ Good - Memoized component
|
|
139
|
-
const ExpensiveTable = React.memo(({ data, columns }) => {
|
|
140
|
-
return <DataTable data={data} columns={columns} />;
|
|
141
|
-
});
|
|
142
|
-
|
|
143
|
-
// ✅ Good - Memoized callback
|
|
144
|
-
const handleDataChange = useCallback((newData) => {
|
|
145
|
-
setData(newData);
|
|
146
|
-
}, []);
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
### Data Management
|
|
150
|
-
|
|
151
|
-
**✅ Do:**
|
|
152
|
-
- Implement proper caching strategies
|
|
153
|
-
- Use pagination for large datasets
|
|
154
|
-
- Optimize database queries
|
|
155
|
-
- Implement proper loading states
|
|
156
|
-
|
|
157
|
-
```tsx
|
|
158
|
-
// ✅ Good - Paginated data
|
|
159
|
-
<DataTable
|
|
160
|
-
data={paginatedData}
|
|
161
|
-
columns={columns}
|
|
162
|
-
pagination={{
|
|
163
|
-
currentPage,
|
|
164
|
-
pageSize,
|
|
165
|
-
totalItems: data.length,
|
|
166
|
-
onPageChange: setCurrentPage,
|
|
167
|
-
}}
|
|
168
|
-
/>
|
|
169
|
-
```
|
|
170
|
-
|
|
171
|
-
For detailed performance guidelines, see [Performance Best Practices](./performance.md).
|
|
172
|
-
|
|
173
|
-
## 🧪 Testing Strategies
|
|
174
|
-
|
|
175
|
-
### Unit Testing
|
|
176
|
-
|
|
177
|
-
**✅ Do:**
|
|
178
|
-
- Test component behavior, not implementation
|
|
179
|
-
- Use proper mocking for external dependencies
|
|
180
|
-
- Test error states and edge cases
|
|
181
|
-
- Maintain good test coverage
|
|
182
|
-
|
|
183
|
-
```tsx
|
|
184
|
-
// ✅ Good - Component testing
|
|
185
|
-
test('renders user data correctly', () => {
|
|
186
|
-
const mockUser = { id: '1', name: 'John Doe', email: 'john@example.com' };
|
|
187
|
-
|
|
188
|
-
render(<UserProfile user={mockUser} />);
|
|
189
|
-
|
|
190
|
-
expect(screen.getByText('John Doe')).toBeInTheDocument();
|
|
191
|
-
expect(screen.getByText('john@example.com')).toBeInTheDocument();
|
|
192
|
-
});
|
|
193
|
-
```
|
|
194
|
-
|
|
195
|
-
### Integration Testing
|
|
196
|
-
|
|
197
|
-
**✅ Do:**
|
|
198
|
-
- Test component interactions
|
|
199
|
-
- Test authentication flows
|
|
200
|
-
- Test permission enforcement
|
|
201
|
-
- Test form submissions
|
|
202
|
-
|
|
203
|
-
```tsx
|
|
204
|
-
// ✅ Good - Integration testing
|
|
205
|
-
test('user can submit form with valid data', async () => {
|
|
206
|
-
const mockSubmit = jest.fn();
|
|
207
|
-
|
|
208
|
-
render(<UserForm onSubmit={mockSubmit} />);
|
|
209
|
-
|
|
210
|
-
await user.type(screen.getByLabelText('Name'), 'John Doe');
|
|
211
|
-
await user.type(screen.getByLabelText('Email'), 'john@example.com');
|
|
212
|
-
await user.click(screen.getByRole('button', { name: 'Submit' }));
|
|
213
|
-
|
|
214
|
-
expect(mockSubmit).toHaveBeenCalledWith({
|
|
215
|
-
name: 'John Doe',
|
|
216
|
-
email: 'john@example.com'
|
|
217
|
-
});
|
|
218
|
-
});
|
|
219
|
-
```
|
|
220
|
-
|
|
221
|
-
### E2E Testing
|
|
222
|
-
|
|
223
|
-
**✅ Do:**
|
|
224
|
-
- Test critical user journeys
|
|
225
|
-
- Test across different browsers
|
|
226
|
-
- Test responsive behavior
|
|
227
|
-
- Test accessibility features
|
|
228
|
-
|
|
229
|
-
For detailed testing guidelines, see [Testing Best Practices](./testing.md).
|
|
230
|
-
|
|
231
|
-
## 🚀 Deployment Guidelines
|
|
232
|
-
|
|
233
|
-
### Environment Configuration
|
|
234
|
-
|
|
235
|
-
**✅ Do:**
|
|
236
|
-
- Use environment variables for configuration
|
|
237
|
-
- Implement proper secrets management
|
|
238
|
-
- Use different configs for different environments
|
|
239
|
-
- Validate environment variables at startup
|
|
240
|
-
|
|
241
|
-
```tsx
|
|
242
|
-
// ✅ Good - Environment validation
|
|
243
|
-
const config = {
|
|
244
|
-
supabaseUrl: process.env.VITE_SUPABASE_URL,
|
|
245
|
-
supabaseKey: process.env.VITE_SUPABASE_PUBLISHABLE_KEY,
|
|
246
|
-
appName: process.env.VITE_APP_NAME,
|
|
247
|
-
};
|
|
248
|
-
|
|
249
|
-
if (!config.supabaseUrl || !config.supabaseKey) {
|
|
250
|
-
throw new Error('Missing required environment variables');
|
|
251
|
-
}
|
|
252
|
-
```
|
|
253
|
-
|
|
254
|
-
### Build Optimization
|
|
255
|
-
|
|
256
|
-
**✅ Do:**
|
|
257
|
-
- Optimize bundle size
|
|
258
|
-
- Enable compression
|
|
259
|
-
- Use CDN for static assets
|
|
260
|
-
- Implement proper caching headers
|
|
261
|
-
|
|
262
|
-
### Monitoring
|
|
263
|
-
|
|
264
|
-
**✅ Do:**
|
|
265
|
-
- Set up error tracking
|
|
266
|
-
- Monitor performance metrics
|
|
267
|
-
- Implement health checks
|
|
268
|
-
- Set up alerts for critical issues
|
|
269
|
-
|
|
270
|
-
For detailed deployment guidelines, see [Deployment Best Practices](./deployment.md).
|
|
271
|
-
|
|
272
|
-
## 📝 Code Quality
|
|
273
|
-
|
|
274
|
-
### TypeScript
|
|
275
|
-
|
|
276
|
-
**✅ Do:**
|
|
277
|
-
- Use strict TypeScript configuration
|
|
278
|
-
- Define proper interfaces and types
|
|
279
|
-
- Use type guards for runtime safety
|
|
280
|
-
- Avoid `any` types
|
|
281
|
-
|
|
282
|
-
```tsx
|
|
283
|
-
// ✅ Good - Proper typing
|
|
284
|
-
interface User {
|
|
285
|
-
id: string;
|
|
286
|
-
name: string;
|
|
287
|
-
email: string;
|
|
288
|
-
role: 'admin' | 'user' | 'guest';
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
const UserCard: React.FC<{ user: User }> = ({ user }) => {
|
|
292
|
-
return <div>{user.name}</div>;
|
|
293
|
-
};
|
|
294
|
-
```
|
|
295
|
-
|
|
296
|
-
### Code Organisation
|
|
297
|
-
|
|
298
|
-
**✅ Do:**
|
|
299
|
-
- Use consistent file naming
|
|
300
|
-
- Organize components logically
|
|
301
|
-
- Separate concerns properly
|
|
302
|
-
- Use proper imports and exports
|
|
303
|
-
|
|
304
|
-
```tsx
|
|
305
|
-
// ✅ Good - Clean imports
|
|
306
|
-
import { Button, Card, DataTable } from '@jmruthers/pace-core';
|
|
307
|
-
import { useUnifiedAuth, useCan } from '@jmruthers/pace-core';
|
|
308
|
-
import { z } from 'zod';
|
|
309
|
-
```
|
|
310
|
-
|
|
311
|
-
### Error Handling
|
|
312
|
-
|
|
313
|
-
**✅ Do:**
|
|
314
|
-
- Implement proper error boundaries
|
|
315
|
-
- Use consistent error handling patterns
|
|
316
|
-
- Provide meaningful error messages
|
|
317
|
-
- Log errors appropriately
|
|
318
|
-
|
|
319
|
-
```tsx
|
|
320
|
-
// ✅ Good - Error boundary
|
|
321
|
-
<ErrorBoundary
|
|
322
|
-
fallback={<ErrorFallback />}
|
|
323
|
-
onError={(error, errorInfo) => {
|
|
324
|
-
console.error('Error caught by boundary:', error, errorInfo);
|
|
325
|
-
}}
|
|
326
|
-
>
|
|
327
|
-
<MyComponent />
|
|
328
|
-
</ErrorBoundary>
|
|
329
|
-
```
|
|
330
|
-
|
|
331
|
-
## ♿ Accessibility
|
|
332
|
-
|
|
333
|
-
### WCAG Compliance
|
|
334
|
-
|
|
335
|
-
**✅ Do:**
|
|
336
|
-
- Use semantic HTML elements
|
|
337
|
-
- Provide proper ARIA labels
|
|
338
|
-
- Ensure keyboard navigation
|
|
339
|
-
- Maintain color contrast ratios
|
|
340
|
-
|
|
341
|
-
```tsx
|
|
342
|
-
// ✅ Good - Accessible component
|
|
343
|
-
<button
|
|
344
|
-
aria-label="Close dialog"
|
|
345
|
-
onClick={onClose}
|
|
346
|
-
className="p-2 rounded-md hover:bg-sec-100"
|
|
347
|
-
>
|
|
348
|
-
<XIcon className="h-4 w-4" />
|
|
349
|
-
</button>
|
|
350
|
-
```
|
|
351
|
-
|
|
352
|
-
### Screen Reader Support
|
|
353
|
-
|
|
354
|
-
**✅ Do:**
|
|
355
|
-
- Use proper heading hierarchy
|
|
356
|
-
- Provide alternative text for images
|
|
357
|
-
- Use live regions for dynamic content
|
|
358
|
-
- Test with screen readers
|
|
359
|
-
|
|
360
|
-
```tsx
|
|
361
|
-
// ✅ Good - Live region for updates
|
|
362
|
-
<div aria-live="polite" aria-atomic="true">
|
|
363
|
-
{isLoading && 'Loading...'}
|
|
364
|
-
{error && `Error: ${error.message}`}
|
|
365
|
-
{data && `Loaded ${data.length} items`}
|
|
366
|
-
</div>
|
|
367
|
-
```
|
|
368
|
-
|
|
369
|
-
## 🔧 Maintenance
|
|
370
|
-
|
|
371
|
-
### Documentation
|
|
372
|
-
|
|
373
|
-
**✅ Do:**
|
|
374
|
-
- Keep documentation up to date
|
|
375
|
-
- Document breaking changes
|
|
376
|
-
- Provide migration guides
|
|
377
|
-
- Include code examples
|
|
378
|
-
|
|
379
|
-
### Dependencies
|
|
380
|
-
|
|
381
|
-
**✅ Do:**
|
|
382
|
-
- Keep dependencies updated
|
|
383
|
-
- Use security scanning tools
|
|
384
|
-
- Test updates in development
|
|
385
|
-
- Pin critical dependency versions
|
|
386
|
-
|
|
387
|
-
### Monitoring
|
|
388
|
-
|
|
389
|
-
**✅ Do:**
|
|
390
|
-
- Monitor application performance
|
|
391
|
-
- Track user behavior
|
|
392
|
-
- Set up error alerts
|
|
393
|
-
- Regular security audits
|
|
394
|
-
|
|
395
|
-
## 🎯 Quick Checklist
|
|
396
|
-
|
|
397
|
-
### Before Going to Production
|
|
398
|
-
|
|
399
|
-
- [ ] Security audit completed
|
|
400
|
-
- [ ] Performance testing done
|
|
401
|
-
- [ ] Accessibility testing passed
|
|
402
|
-
- [ ] Error handling implemented
|
|
403
|
-
- [ ] Monitoring set up
|
|
404
|
-
- [ ] Documentation updated
|
|
405
|
-
- [ ] Dependencies updated
|
|
406
|
-
- [ ] Environment variables configured
|
|
407
|
-
- [ ] Backup strategy in place
|
|
408
|
-
- [ ] Rollback plan ready
|
|
409
|
-
|
|
410
|
-
### Regular Maintenance
|
|
411
|
-
|
|
412
|
-
- [ ] Weekly dependency updates
|
|
413
|
-
- [ ] Monthly security reviews
|
|
414
|
-
- [ ] Quarterly performance audits
|
|
415
|
-
- [ ] Annual architecture reviews
|
|
416
|
-
|
|
417
|
-
## 📚 Additional Resources
|
|
418
|
-
|
|
419
|
-
- [Security Best Practices](./security.md) - Detailed security guidelines
|
|
420
|
-
- [Performance Best Practices](./performance.md) - Performance optimization
|
|
421
|
-
- [Testing Best Practices](./testing.md) - Testing strategies
|
|
422
|
-
- [Deployment Best Practices](./deployment.md) - Deployment guidelines
|
|
423
|
-
- [Troubleshooting Guide](../troubleshooting/) - Common issues and solutions
|
|
424
|
-
|
|
425
|
-
Remember: **Best practices are guidelines, not rules. Adapt them to your specific needs and constraints.**
|
|
426
|
-
|
|
427
|
-
## ♿ Accessibility
|
|
428
|
-
|
|
429
|
-
All best practices should consider accessibility:
|
|
430
|
-
|
|
431
|
-
- **WCAG 2.1 AA compliance** - Ensure all practices maintain accessibility standards
|
|
432
|
-
- **Screen Reader Support** - Verify practices don't break screen reader functionality
|
|
433
|
-
- **Keyboard Navigation** - Ensure practices don't affect keyboard accessibility
|
|
434
|
-
- **Error Announcements** - Ensure error messages are accessible
|
|
435
|
-
- **Focus Management** - Verify focus handling remains correct
|
|
436
|
-
|
|
437
|
-
### Accessibility Best Practices
|
|
438
|
-
|
|
439
|
-
1. **Test with screen readers** - Verify practices work with assistive technologies
|
|
440
|
-
2. **Check error announcements** - Ensure error messages are properly announced
|
|
441
|
-
3. **Maintain keyboard access** - Verify all interactive elements remain keyboard accessible
|
|
442
|
-
4. **Preserve semantic structure** - Don't break semantic HTML with optimizations
|
|
443
|
-
5. **Test focus management** - Ensure focus handling remains correct
|
|
444
|
-
|
|
445
|
-
## ⚠️ Edge Cases
|
|
446
|
-
|
|
447
|
-
### Best Practices Conflicts
|
|
448
|
-
|
|
449
|
-
When best practices conflict:
|
|
450
|
-
- Prioritize security over performance when necessary
|
|
451
|
-
- Balance accessibility with design requirements
|
|
452
|
-
- Consider trade-offs between maintainability and optimization
|
|
453
|
-
- Document decisions when deviating from best practices
|
|
454
|
-
- Test thoroughly when combining multiple practices
|
|
455
|
-
|
|
456
|
-
### Performance vs Accessibility
|
|
457
|
-
|
|
458
|
-
When performance optimizations impact accessibility:
|
|
459
|
-
- Ensure lazy loading doesn't break screen reader navigation
|
|
460
|
-
- Verify code splitting maintains keyboard navigation
|
|
461
|
-
- Check that memoization doesn't affect focus management
|
|
462
|
-
- Test with assistive technologies after optimizations
|
|
463
|
-
- Balance performance gains with accessibility requirements
|
|
464
|
-
|
|
465
|
-
### Security vs Usability
|
|
466
|
-
|
|
467
|
-
When security practices impact usability:
|
|
468
|
-
- Find balance between security and user experience
|
|
469
|
-
- Provide clear error messages without exposing vulnerabilities
|
|
470
|
-
- Implement security measures transparently
|
|
471
|
-
- Test with real users to ensure usability
|
|
472
|
-
- Document security decisions for future reference
|