@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,544 +0,0 @@
|
|
|
1
|
-
# RBAC/Auth Compliance Guide
|
|
2
|
-
|
|
3
|
-
> **📚 RBAC Compliance** | [← Back to RBAC Documentation](../README.md) | [Troubleshooting](./troubleshooting-compliance.md) | [Migrating Custom Auth](./migrating-custom-auth.md)
|
|
4
|
-
|
|
5
|
-
This guide explains how to achieve RBAC/auth compliance in your pace app to ensure proper security and consistent usage of pace-core.
|
|
6
|
-
|
|
7
|
-
## Overview
|
|
8
|
-
|
|
9
|
-
The RBAC/auth compliance system ensures that:
|
|
10
|
-
- All auth/rbac/permission functionality uses pace-core exclusively
|
|
11
|
-
- RBAC system is properly initialized
|
|
12
|
-
- All pages are protected with PagePermissionGuard
|
|
13
|
-
- Supabase configuration is centralized
|
|
14
|
-
- No custom auth/rbac code exists
|
|
15
|
-
|
|
16
|
-
## Compliance Checks
|
|
17
|
-
|
|
18
|
-
The compliance system checks for:
|
|
19
|
-
|
|
20
|
-
### 1. Custom Auth/RBAC Code
|
|
21
|
-
|
|
22
|
-
**What it checks:**
|
|
23
|
-
- Custom auth hooks (useAuth, useLogin, useLogout, etc.)
|
|
24
|
-
- Custom RBAC components (PermissionGuard, AuthGuard, etc.)
|
|
25
|
-
- Custom permission utilities (checkPermission, hasAccess, etc.)
|
|
26
|
-
|
|
27
|
-
**How to fix:**
|
|
28
|
-
- Remove custom implementations
|
|
29
|
-
- Import equivalent from `@jmruthers/pace-core` or `@jmruthers/pace-core/rbac`
|
|
30
|
-
- Update all usages
|
|
31
|
-
|
|
32
|
-
See [Migrating Custom Auth](./migrating-custom-auth.md) for detailed migration steps.
|
|
33
|
-
|
|
34
|
-
### 2. Duplicate Supabase Configuration
|
|
35
|
-
|
|
36
|
-
**What it checks:**
|
|
37
|
-
- Multiple `createClient` calls
|
|
38
|
-
- Supabase environment variables in multiple files
|
|
39
|
-
|
|
40
|
-
**How to fix:**
|
|
41
|
-
- Create a single `supabase.ts` file
|
|
42
|
-
- Export the client instance
|
|
43
|
-
- Import from the shared location everywhere
|
|
44
|
-
|
|
45
|
-
### 3. Unprotected Pages
|
|
46
|
-
|
|
47
|
-
**What it checks:**
|
|
48
|
-
- Routes without PagePermissionGuard
|
|
49
|
-
- Pages without permission checks
|
|
50
|
-
|
|
51
|
-
**How to fix:**
|
|
52
|
-
- Wrap all routes with PagePermissionGuard
|
|
53
|
-
- Set `pageName` and `operation` props
|
|
54
|
-
- Ensure pages exist in `rbac_app_pages` table
|
|
55
|
-
|
|
56
|
-
### 4. Direct Supabase Auth Usage
|
|
57
|
-
|
|
58
|
-
**What it checks:**
|
|
59
|
-
- Direct calls to `supabase.auth.signIn`, `supabase.auth.signUp`, etc.
|
|
60
|
-
|
|
61
|
-
**How to fix:**
|
|
62
|
-
- Use `useUnifiedAuth` hook from pace-core
|
|
63
|
-
- Use `UnifiedAuthProvider` to wrap your app
|
|
64
|
-
- Replace all direct auth calls with pace-core methods
|
|
65
|
-
|
|
66
|
-
### 5. Provider Setup Issues
|
|
67
|
-
|
|
68
|
-
**What it checks:**
|
|
69
|
-
- Missing `UnifiedAuthProvider` or `OrganisationProvider`
|
|
70
|
-
- Incorrect provider nesting order
|
|
71
|
-
- Providers placed in wrong locations
|
|
72
|
-
|
|
73
|
-
**How to fix:**
|
|
74
|
-
- Ensure correct nesting: `QueryClientProvider` → `BrowserRouter` → `UnifiedAuthProvider` → `OrganisationProvider` → `App`
|
|
75
|
-
- Place providers in `main.tsx` or `App.tsx` entry file
|
|
76
|
-
- See [Provider Setup](#provider-setup) section below
|
|
77
|
-
|
|
78
|
-
### 6. Vite Configuration Issues
|
|
79
|
-
|
|
80
|
-
**What it checks:**
|
|
81
|
-
- `@jmruthers/pace-core` in `optimizeDeps.include` (should be excluded)
|
|
82
|
-
- Missing `@jmruthers/pace-core` in `optimizeDeps.exclude`
|
|
83
|
-
- Missing `react-router-dom` in `resolve.dedupe`
|
|
84
|
-
|
|
85
|
-
**How to fix:**
|
|
86
|
-
- Add `@jmruthers/pace-core` to `optimizeDeps.exclude`
|
|
87
|
-
- Remove `@jmruthers/pace-core` from `optimizeDeps.include`
|
|
88
|
-
- Add `react-router-dom` to `resolve.dedupe`
|
|
89
|
-
- See [Vite Configuration](#vite-configuration) section below
|
|
90
|
-
|
|
91
|
-
### 7. Router Setup Issues
|
|
92
|
-
|
|
93
|
-
**What it checks:**
|
|
94
|
-
- Missing `BrowserRouter`
|
|
95
|
-
- `BrowserRouter` placed incorrectly (inside `UnifiedAuthProvider` instead of wrapping it)
|
|
96
|
-
- `Routes` used without `BrowserRouter`
|
|
97
|
-
|
|
98
|
-
**How to fix:**
|
|
99
|
-
- Wrap app with `BrowserRouter` from `react-router-dom`
|
|
100
|
-
- Ensure `BrowserRouter` wraps `UnifiedAuthProvider` (not the other way around)
|
|
101
|
-
- See [Router Setup](#router-setup) section below
|
|
102
|
-
|
|
103
|
-
## Running Compliance Checks
|
|
104
|
-
|
|
105
|
-
### Static Analysis
|
|
106
|
-
|
|
107
|
-
Run the compliance check script:
|
|
108
|
-
|
|
109
|
-
```bash
|
|
110
|
-
npm run check:pace-core
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
This will scan your codebase and report:
|
|
114
|
-
- Custom auth/rbac code
|
|
115
|
-
- Duplicate configurations
|
|
116
|
-
- Unprotected pages
|
|
117
|
-
- Direct Supabase auth usage
|
|
118
|
-
- Provider setup issues
|
|
119
|
-
- Vite configuration problems
|
|
120
|
-
- Router setup issues
|
|
121
|
-
|
|
122
|
-
### ESLint Rules
|
|
123
|
-
|
|
124
|
-
The compliance system includes ESLint rules that run during development:
|
|
125
|
-
|
|
126
|
-
- `no-custom-auth-code` - Disallows custom auth/rbac implementations
|
|
127
|
-
- `no-duplicate-supabase-config` - Disallows multiple Supabase configurations
|
|
128
|
-
- `require-page-permission-guard` - Requires PagePermissionGuard on routes
|
|
129
|
-
- `no-direct-supabase-auth` - Disallows direct Supabase auth usage
|
|
130
|
-
|
|
131
|
-
### Runtime Validation
|
|
132
|
-
|
|
133
|
-
Check runtime compliance programmatically:
|
|
134
|
-
|
|
135
|
-
```typescript
|
|
136
|
-
import { checkRuntimeCompliance } from '@jmruthers/pace-core/rbac';
|
|
137
|
-
|
|
138
|
-
const result = checkRuntimeCompliance();
|
|
139
|
-
if (!result.setup.isCompliant) {
|
|
140
|
-
console.warn('RBAC setup issues:', result.setup.issues);
|
|
141
|
-
}
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
## Achieving Compliance
|
|
145
|
-
|
|
146
|
-
### Step 1: Initialize RBAC
|
|
147
|
-
|
|
148
|
-
```typescript
|
|
149
|
-
// main.tsx or App.tsx
|
|
150
|
-
import { setupRBAC } from '@jmruthers/pace-core/rbac';
|
|
151
|
-
import { createClient } from '@supabase/supabase-js';
|
|
152
|
-
|
|
153
|
-
const supabase = createClient(
|
|
154
|
-
import.meta.env.VITE_SUPABASE_URL,
|
|
155
|
-
import.meta.env.VITE_SUPABASE_PUBLISHABLE_KEY
|
|
156
|
-
);
|
|
157
|
-
|
|
158
|
-
// ⚠️ REQUIRED: Call setupRBAC before rendering
|
|
159
|
-
setupRBAC(supabase);
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
### Step 2: Set Up Providers
|
|
163
|
-
|
|
164
|
-
**⚠️ CRITICAL: Provider nesting order matters!**
|
|
165
|
-
|
|
166
|
-
The correct nesting order is:
|
|
167
|
-
1. `QueryClientProvider` (outermost)
|
|
168
|
-
2. `BrowserRouter`
|
|
169
|
-
3. `UnifiedAuthProvider`
|
|
170
|
-
4. `OrganisationProvider`
|
|
171
|
-
5. `App` (innermost)
|
|
172
|
-
|
|
173
|
-
```tsx
|
|
174
|
-
// main.tsx - Correct setup
|
|
175
|
-
import { BrowserRouter } from 'react-router-dom';
|
|
176
|
-
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
|
|
177
|
-
import { UnifiedAuthProvider, OrganisationProvider } from '@jmruthers/pace-core';
|
|
178
|
-
|
|
179
|
-
const queryClient = new QueryClient();
|
|
180
|
-
|
|
181
|
-
createRoot(document.getElementById("root")!).render(
|
|
182
|
-
<QueryClientProvider client={queryClient}>
|
|
183
|
-
<BrowserRouter>
|
|
184
|
-
<UnifiedAuthProvider supabaseClient={supabase} appName={APP_NAME}>
|
|
185
|
-
<OrganisationProvider>
|
|
186
|
-
<App />
|
|
187
|
-
</OrganisationProvider>
|
|
188
|
-
</UnifiedAuthProvider>
|
|
189
|
-
</BrowserRouter>
|
|
190
|
-
</QueryClientProvider>
|
|
191
|
-
);
|
|
192
|
-
```
|
|
193
|
-
|
|
194
|
-
**Common mistakes to avoid:**
|
|
195
|
-
- ❌ `BrowserRouter` inside `UnifiedAuthProvider` (causes Router context errors)
|
|
196
|
-
- ❌ `UnifiedAuthProvider` wrapping `BrowserRouter` (causes context errors)
|
|
197
|
-
- ❌ Missing `BrowserRouter` (causes `useNavigate` errors)
|
|
198
|
-
|
|
199
|
-
### Step 3: Protect All Pages
|
|
200
|
-
|
|
201
|
-
```tsx
|
|
202
|
-
// pages/Dashboard.tsx
|
|
203
|
-
import { PagePermissionGuard } from '@jmruthers/pace-core/rbac';
|
|
204
|
-
|
|
205
|
-
function Dashboard() {
|
|
206
|
-
return (
|
|
207
|
-
<PagePermissionGuard pageName="dashboard" operation="read">
|
|
208
|
-
<DashboardContent />
|
|
209
|
-
</PagePermissionGuard>
|
|
210
|
-
);
|
|
211
|
-
}
|
|
212
|
-
```
|
|
213
|
-
|
|
214
|
-
### Step 4: Use pace-core Auth
|
|
215
|
-
|
|
216
|
-
```tsx
|
|
217
|
-
// components/Login.tsx
|
|
218
|
-
import { useUnifiedAuth } from '@jmruthers/pace-core';
|
|
219
|
-
|
|
220
|
-
function Login() {
|
|
221
|
-
const { signIn } = useUnifiedAuth();
|
|
222
|
-
|
|
223
|
-
const handleLogin = async () => {
|
|
224
|
-
await signIn({ email, password });
|
|
225
|
-
};
|
|
226
|
-
|
|
227
|
-
return <button onClick={handleLogin}>Login</button>;
|
|
228
|
-
}
|
|
229
|
-
```
|
|
230
|
-
|
|
231
|
-
### Step 5: Configure Vite
|
|
232
|
-
|
|
233
|
-
**⚠️ CRITICAL: Vite configuration prevents React context mismatches!**
|
|
234
|
-
|
|
235
|
-
Add to your `vite.config.ts`:
|
|
236
|
-
|
|
237
|
-
```typescript
|
|
238
|
-
import { defineConfig } from 'vite';
|
|
239
|
-
|
|
240
|
-
export default defineConfig({
|
|
241
|
-
resolve: {
|
|
242
|
-
dedupe: ['react', 'react-dom', 'react-router-dom']
|
|
243
|
-
},
|
|
244
|
-
optimizeDeps: {
|
|
245
|
-
include: [
|
|
246
|
-
'react',
|
|
247
|
-
'react-dom',
|
|
248
|
-
'react/jsx-runtime'
|
|
249
|
-
],
|
|
250
|
-
// CRITICAL: Exclude pace-core to prevent React context mismatches
|
|
251
|
-
exclude: ['@jmruthers/pace-core', 'react-router-dom']
|
|
252
|
-
}
|
|
253
|
-
});
|
|
254
|
-
```
|
|
255
|
-
|
|
256
|
-
**Why this matters:**
|
|
257
|
-
- Pre-bundling `@jmruthers/pace-core` creates separate React instances
|
|
258
|
-
- This causes "useUnifiedAuth must be used within a UnifiedAuthProvider" errors
|
|
259
|
-
- Excluding it ensures pace-core uses the same React instance as your app
|
|
260
|
-
|
|
261
|
-
### Step 6: Centralize Supabase Config
|
|
262
|
-
|
|
263
|
-
```typescript
|
|
264
|
-
// src/lib/supabase.ts
|
|
265
|
-
import { createClient } from '@supabase/supabase-js';
|
|
266
|
-
|
|
267
|
-
export const supabase = createClient(
|
|
268
|
-
import.meta.env.VITE_SUPABASE_URL,
|
|
269
|
-
import.meta.env.VITE_SUPABASE_PUBLISHABLE_KEY
|
|
270
|
-
);
|
|
271
|
-
```
|
|
272
|
-
|
|
273
|
-
## Database Configuration
|
|
274
|
-
|
|
275
|
-
Ensure your database is properly configured:
|
|
276
|
-
|
|
277
|
-
1. **App Registration**: App must exist in `rbac_apps` table
|
|
278
|
-
2. **Pages**: All pages must be registered in `rbac_app_pages` table
|
|
279
|
-
3. **Permissions**: Permissions must be configured in `rbac_page_permissions` table
|
|
280
|
-
4. **User Roles**: Users must have roles in `rbac_organisation_roles` table
|
|
281
|
-
|
|
282
|
-
See [RBAC Quick Start](../quick-start.md) for database setup instructions.
|
|
283
|
-
|
|
284
|
-
## Quick Fixes
|
|
285
|
-
|
|
286
|
-
The compliance system provides quick fix suggestions:
|
|
287
|
-
|
|
288
|
-
```typescript
|
|
289
|
-
import { getQuickFixes } from '@jmruthers/pace-core/rbac';
|
|
290
|
-
|
|
291
|
-
const fixes = getQuickFixes('custom-auth-code', { name: 'useAuth', type: 'hook' });
|
|
292
|
-
fixes.forEach(fix => {
|
|
293
|
-
console.log(fix.suggestion);
|
|
294
|
-
console.log(fix.codeExample);
|
|
295
|
-
});
|
|
296
|
-
```
|
|
297
|
-
|
|
298
|
-
## CI/CD Integration
|
|
299
|
-
|
|
300
|
-
Add compliance checks to your CI/CD pipeline:
|
|
301
|
-
|
|
302
|
-
```yaml
|
|
303
|
-
# .github/workflows/compliance.yml
|
|
304
|
-
- name: Check pace-core compliance
|
|
305
|
-
run: npm run check:pace-core
|
|
306
|
-
```
|
|
307
|
-
|
|
308
|
-
The script exits with code 1 if compliance issues are found, causing the build to fail.
|
|
309
|
-
|
|
310
|
-
## Troubleshooting Common Issues
|
|
311
|
-
|
|
312
|
-
### Provider Setup Issues
|
|
313
|
-
|
|
314
|
-
**Issue:** "useUnifiedAuth must be used within a UnifiedAuthProvider" error
|
|
315
|
-
|
|
316
|
-
**Possible causes:**
|
|
317
|
-
1. `UnifiedAuthProvider` is missing or not wrapping your app
|
|
318
|
-
2. `BrowserRouter` is inside `UnifiedAuthProvider` (wrong nesting)
|
|
319
|
-
3. Vite is pre-bundling `@jmruthers/pace-core` (React context mismatch)
|
|
320
|
-
|
|
321
|
-
**Solution:**
|
|
322
|
-
1. **Check provider nesting** in `main.tsx`:
|
|
323
|
-
```tsx
|
|
324
|
-
// ✅ CORRECT
|
|
325
|
-
<QueryClientProvider>
|
|
326
|
-
<BrowserRouter>
|
|
327
|
-
<UnifiedAuthProvider>
|
|
328
|
-
<OrganisationProvider>
|
|
329
|
-
<App />
|
|
330
|
-
</OrganisationProvider>
|
|
331
|
-
</UnifiedAuthProvider>
|
|
332
|
-
</BrowserRouter>
|
|
333
|
-
</QueryClientProvider>
|
|
334
|
-
|
|
335
|
-
// ❌ WRONG - BrowserRouter inside UnifiedAuthProvider
|
|
336
|
-
<UnifiedAuthProvider>
|
|
337
|
-
<BrowserRouter>
|
|
338
|
-
<App />
|
|
339
|
-
</BrowserRouter>
|
|
340
|
-
</UnifiedAuthProvider>
|
|
341
|
-
```
|
|
342
|
-
|
|
343
|
-
2. **Check Vite config** - ensure `@jmruthers/pace-core` is in `optimizeDeps.exclude`:
|
|
344
|
-
```typescript
|
|
345
|
-
optimizeDeps: {
|
|
346
|
-
exclude: ['@jmruthers/pace-core', 'react-router-dom']
|
|
347
|
-
}
|
|
348
|
-
```
|
|
349
|
-
|
|
350
|
-
3. **Clear Vite cache** and restart dev server:
|
|
351
|
-
```bash
|
|
352
|
-
rm -rf node_modules/.vite
|
|
353
|
-
npm run dev
|
|
354
|
-
```
|
|
355
|
-
|
|
356
|
-
### Router Context Issues
|
|
357
|
-
|
|
358
|
-
**Issue:** "useNavigate() may be used only in the context of a <Router> component" error
|
|
359
|
-
|
|
360
|
-
**Possible causes:**
|
|
361
|
-
1. Missing `BrowserRouter`
|
|
362
|
-
2. `BrowserRouter` placed incorrectly
|
|
363
|
-
3. `react-router-dom` being pre-bundled by Vite
|
|
364
|
-
|
|
365
|
-
**Solution:**
|
|
366
|
-
1. **Add BrowserRouter** wrapping your app:
|
|
367
|
-
```tsx
|
|
368
|
-
import { BrowserRouter } from 'react-router-dom';
|
|
369
|
-
|
|
370
|
-
<BrowserRouter>
|
|
371
|
-
<UnifiedAuthProvider>
|
|
372
|
-
<App />
|
|
373
|
-
</UnifiedAuthProvider>
|
|
374
|
-
</BrowserRouter>
|
|
375
|
-
```
|
|
376
|
-
|
|
377
|
-
2. **Update Vite config**:
|
|
378
|
-
```typescript
|
|
379
|
-
resolve: {
|
|
380
|
-
dedupe: ['react', 'react-dom', 'react-router-dom']
|
|
381
|
-
},
|
|
382
|
-
optimizeDeps: {
|
|
383
|
-
exclude: ['react-router-dom']
|
|
384
|
-
}
|
|
385
|
-
```
|
|
386
|
-
|
|
387
|
-
3. **Clear Vite cache** and restart
|
|
388
|
-
|
|
389
|
-
### Vite Configuration Issues
|
|
390
|
-
|
|
391
|
-
**Issue:** React context mismatch errors, components can't find providers
|
|
392
|
-
|
|
393
|
-
**Possible causes:**
|
|
394
|
-
1. `@jmruthers/pace-core` is being pre-bundled by Vite
|
|
395
|
-
2. Multiple React instances in the bundle
|
|
396
|
-
|
|
397
|
-
**Solution:**
|
|
398
|
-
1. **Exclude pace-core from pre-bundling**:
|
|
399
|
-
```typescript
|
|
400
|
-
optimizeDeps: {
|
|
401
|
-
exclude: ['@jmruthers/pace-core']
|
|
402
|
-
}
|
|
403
|
-
```
|
|
404
|
-
|
|
405
|
-
2. **Dedupe React dependencies**:
|
|
406
|
-
```typescript
|
|
407
|
-
resolve: {
|
|
408
|
-
dedupe: ['react', 'react-dom', 'react-router-dom']
|
|
409
|
-
}
|
|
410
|
-
```
|
|
411
|
-
|
|
412
|
-
3. **Clear Vite cache**:
|
|
413
|
-
```bash
|
|
414
|
-
rm -rf node_modules/.vite
|
|
415
|
-
```
|
|
416
|
-
|
|
417
|
-
### Custom Auth/RBAC Code Detected
|
|
418
|
-
|
|
419
|
-
**Issue:** Custom `useAuth` hook or `PermissionGuard` component found
|
|
420
|
-
|
|
421
|
-
**Solution:**
|
|
422
|
-
1. Remove your custom implementation
|
|
423
|
-
2. Import from pace-core:
|
|
424
|
-
```typescript
|
|
425
|
-
import { useUnifiedAuth } from '@jmruthers/pace-core';
|
|
426
|
-
import { PagePermissionGuard } from '@jmruthers/pace-core/rbac';
|
|
427
|
-
```
|
|
428
|
-
3. Update all usages - see [Migration Examples](#migrating-from-custom-code) below
|
|
429
|
-
|
|
430
|
-
### Duplicate Supabase Configuration
|
|
431
|
-
|
|
432
|
-
**Issue:** Multiple `createClient` calls found
|
|
433
|
-
|
|
434
|
-
**Solution:**
|
|
435
|
-
1. Create a single `supabase.ts` file:
|
|
436
|
-
```typescript
|
|
437
|
-
// src/lib/supabase.ts
|
|
438
|
-
export const supabase = createClient(url, key);
|
|
439
|
-
```
|
|
440
|
-
2. Remove all other `createClient` calls
|
|
441
|
-
3. Import from the shared location everywhere
|
|
442
|
-
|
|
443
|
-
### Unprotected Pages
|
|
444
|
-
|
|
445
|
-
**Issue:** Route without PagePermissionGuard
|
|
446
|
-
|
|
447
|
-
**Solution:**
|
|
448
|
-
1. Wrap all routes with PagePermissionGuard:
|
|
449
|
-
```tsx
|
|
450
|
-
<PagePermissionGuard pageName="dashboard" operation="read">
|
|
451
|
-
<Dashboard />
|
|
452
|
-
</PagePermissionGuard>
|
|
453
|
-
```
|
|
454
|
-
2. Ensure pages exist in `rbac_app_pages` table
|
|
455
|
-
|
|
456
|
-
### Direct Supabase Auth Usage
|
|
457
|
-
|
|
458
|
-
**Issue:** Direct `supabase.auth` calls detected
|
|
459
|
-
|
|
460
|
-
**Solution:**
|
|
461
|
-
1. Use `useUnifiedAuth` hook instead:
|
|
462
|
-
```typescript
|
|
463
|
-
const { signIn } = useUnifiedAuth();
|
|
464
|
-
await signIn({ email, password });
|
|
465
|
-
```
|
|
466
|
-
2. Ensure `UnifiedAuthProvider` wraps your app
|
|
467
|
-
|
|
468
|
-
### RBAC Not Initialized
|
|
469
|
-
|
|
470
|
-
**Issue:** `setupRBAC()` not called
|
|
471
|
-
|
|
472
|
-
**Solution:**
|
|
473
|
-
```typescript
|
|
474
|
-
// main.tsx - Must be called before rendering
|
|
475
|
-
import { setupRBAC } from '@jmruthers/pace-core/rbac';
|
|
476
|
-
setupRBAC(supabase);
|
|
477
|
-
```
|
|
478
|
-
|
|
479
|
-
## Migrating from Custom Code
|
|
480
|
-
|
|
481
|
-
### Migrating `useAuth` Hook
|
|
482
|
-
|
|
483
|
-
**Before:**
|
|
484
|
-
```typescript
|
|
485
|
-
// src/hooks/useAuth.ts
|
|
486
|
-
export function useAuth() {
|
|
487
|
-
const [user, setUser] = useState(null);
|
|
488
|
-
// ... custom logic
|
|
489
|
-
}
|
|
490
|
-
```
|
|
491
|
-
|
|
492
|
-
**After:**
|
|
493
|
-
```typescript
|
|
494
|
-
import { useUnifiedAuth } from '@jmruthers/pace-core';
|
|
495
|
-
const { user } = useUnifiedAuth();
|
|
496
|
-
```
|
|
497
|
-
|
|
498
|
-
### Migrating `PermissionGuard` Component
|
|
499
|
-
|
|
500
|
-
**Before:**
|
|
501
|
-
```tsx
|
|
502
|
-
<PermissionGuard permission="read:users">
|
|
503
|
-
<UsersPage />
|
|
504
|
-
</PermissionGuard>
|
|
505
|
-
```
|
|
506
|
-
|
|
507
|
-
**After:**
|
|
508
|
-
```tsx
|
|
509
|
-
<PagePermissionGuard pageName="users" operation="read">
|
|
510
|
-
<UsersPage />
|
|
511
|
-
</PagePermissionGuard>
|
|
512
|
-
```
|
|
513
|
-
|
|
514
|
-
### Migrating `checkPermission` Utility
|
|
515
|
-
|
|
516
|
-
**Before:**
|
|
517
|
-
```typescript
|
|
518
|
-
const hasAccess = checkPermission(user, 'read:users');
|
|
519
|
-
```
|
|
520
|
-
|
|
521
|
-
**After:**
|
|
522
|
-
```typescript
|
|
523
|
-
import { isPermitted } from '@jmruthers/pace-core/rbac';
|
|
524
|
-
const hasAccess = await isPermitted({
|
|
525
|
-
userId: user.id,
|
|
526
|
-
scope: { organisationId: org.id },
|
|
527
|
-
permission: 'read:page.users'
|
|
528
|
-
});
|
|
529
|
-
```
|
|
530
|
-
|
|
531
|
-
### Step-by-Step Migration Process
|
|
532
|
-
|
|
533
|
-
1. **Audit:** Run `npm run check:pace-core` to find all custom code
|
|
534
|
-
2. **Setup:** Ensure `setupRBAC()` is called and providers are configured
|
|
535
|
-
3. **Migrate:** Replace custom code with pace-core equivalents one component at a time
|
|
536
|
-
4. **Test:** Verify all auth flows and permission checks work
|
|
537
|
-
5. **Clean:** Remove custom files and update all imports
|
|
538
|
-
|
|
539
|
-
## Next Steps
|
|
540
|
-
|
|
541
|
-
- [RBAC Troubleshooting](../troubleshooting.md) - General RBAC issues
|
|
542
|
-
- [RBAC Quick Start](../quick-start.md) - Getting started with RBAC
|
|
543
|
-
- [RBAC API Reference](../api-reference.md) - Complete API documentation
|
|
544
|
-
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
# Architecture Standard
|
|
2
|
-
|
|
3
|
-
## Purpose
|
|
4
|
-
Define the core architectural principles for pace-core so that components, APIs, RPCs, utilities, and documentation evolve consistently and sustainably.
|
|
5
|
-
|
|
6
|
-
## Principles
|
|
7
|
-
- Composition over complexity
|
|
8
|
-
- Separation of concerns
|
|
9
|
-
- Domain-agnostic
|
|
10
|
-
- Extensible, stable APIs
|
|
11
|
-
- Secure by default
|
|
12
|
-
- Performance-conscious
|
|
13
|
-
|
|
14
|
-
## Performance Requirements
|
|
15
|
-
- **RLS policies must use helper functions** - Never use subqueries in RLS policies as they cause N+1 query patterns
|
|
16
|
-
- **Database migrations must be tested** - Verify migrations don't cause query timeouts or performance degradation
|
|
17
|
-
- **Monitor query performance** - Use EXPLAIN ANALYZE to verify RLS policies don't create expensive execution plans
|
|
18
|
-
|
|
19
|
-
## Boundaries
|
|
20
|
-
### In scope
|
|
21
|
-
- UI primitives
|
|
22
|
-
- Generic hooks
|
|
23
|
-
- Shared API patterns
|
|
24
|
-
- Error-handling conventions
|
|
25
|
-
- RPC shape conventions
|
|
26
|
-
|
|
27
|
-
### Out of scope
|
|
28
|
-
- App-specific domain logic
|
|
29
|
-
- App-specific styling
|
|
30
|
-
- Business workflows
|
|
31
|
-
|
|
32
|
-
## Precedence
|
|
33
|
-
1. Security Standard
|
|
34
|
-
2. API & RPC Standard
|
|
35
|
-
3. Component Standard
|
|
36
|
-
4. Code Style Standard
|
|
37
|
-
5. Testing Standard
|
|
38
|
-
6. Documentation Standard
|
|
39
|
-
|
|
40
|
-
## Cursor Checklist
|
|
41
|
-
- Ensure changes fit boundaries
|
|
42
|
-
- Do not introduce domain logic
|
|
43
|
-
- Follow precedence ordering
|
|
44
|
-
- Prefer additive changes
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
# API & RPC Standard
|
|
2
|
-
|
|
3
|
-
## Naming
|
|
4
|
-
- `<family>_<domain>_<verb>` pattern (e.g., `data_cake_dishes_list`, `app_cake_dish_create`)
|
|
5
|
-
- `data_*` prefix for read operations (e.g., `data_file_reference_list`)
|
|
6
|
-
- `app_*` prefix for write operations (e.g., `app_cake_dish_create`)
|
|
7
|
-
- CRUD verbs only: create, read, update, delete, list, get
|
|
8
|
-
- Bulk operations use `_bulk` suffix (e.g., `app_cake_dish_create_bulk`)
|
|
9
|
-
|
|
10
|
-
## Result Shape
|
|
11
|
-
```ts
|
|
12
|
-
type ApiResult<T> =
|
|
13
|
-
| { ok: true; data: T }
|
|
14
|
-
| { ok: false; error: ApiError };
|
|
15
|
-
|
|
16
|
-
type ApiError = {
|
|
17
|
-
code: string;
|
|
18
|
-
message: string;
|
|
19
|
-
details?: object;
|
|
20
|
-
};
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
## RPC Rules
|
|
24
|
-
- Read RPCs never mutate
|
|
25
|
-
- Write RPCs should be idempotent when possible
|
|
26
|
-
- Never accept dynamic SQL
|
|
27
|
-
- Must enforce RLS + tenant boundaries
|
|
28
|
-
- Errors must be user-safe
|
|
29
|
-
|
|
30
|
-
## Deprecation Rules
|
|
31
|
-
- Mark outdated RPCs with @deprecated
|
|
32
|
-
- Retirement window: 2 stable releases
|
|
33
|
-
|
|
34
|
-
## Cursor Checklist
|
|
35
|
-
- Enforce ApiResult shape
|
|
36
|
-
- Follow naming rules
|
|
37
|
-
- Do not bypass RLS
|
|
38
|
-
- Avoid overlapping or redundant RPCs
|
|
39
|
-
- Ensure idempotency for writes
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
# Component Development Standard
|
|
2
|
-
|
|
3
|
-
## Principles
|
|
4
|
-
- Stateless when possible
|
|
5
|
-
- Composable structure
|
|
6
|
-
- Accessible by default
|
|
7
|
-
- Fully typed
|
|
8
|
-
- Small surface area
|
|
9
|
-
|
|
10
|
-
## Architecture
|
|
11
|
-
- UI primitives only
|
|
12
|
-
- Never add domain logic
|
|
13
|
-
- No data fetching inside components
|
|
14
|
-
- Support controlled + uncontrolled usage
|
|
15
|
-
|
|
16
|
-
## Accessibility Checklist
|
|
17
|
-
- Keyboard operable
|
|
18
|
-
- Correct ARIA roles
|
|
19
|
-
- Visible focus states
|
|
20
|
-
- No inaccessible interactions
|
|
21
|
-
|
|
22
|
-
## Testing Requirements
|
|
23
|
-
- Use React Testing Library
|
|
24
|
-
- Test key interactions
|
|
25
|
-
- Snapshot tests only for simple components
|
|
26
|
-
|
|
27
|
-
## Cursor Checklist
|
|
28
|
-
- Do not add domain logic
|
|
29
|
-
- Validate accessibility rules
|
|
30
|
-
- Keep components small
|
|
31
|
-
- Move non-UI logic to hooks
|
|
32
|
-
- Enforce strict typings
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
# TypeScript & Code Style Standard
|
|
2
|
-
|
|
3
|
-
## TypeScript Rules
|
|
4
|
-
- No any
|
|
5
|
-
- Prefer discriminated unions
|
|
6
|
-
- Avoid assertions unless in escape hatches
|
|
7
|
-
- Use ReadonlyArray where possible
|
|
8
|
-
- Avoid boolean mode flags
|
|
9
|
-
|
|
10
|
-
## Naming Conventions
|
|
11
|
-
- Hooks: useSomething
|
|
12
|
-
- Providers: SomethingProvider
|
|
13
|
-
- Utilities: camelCase
|
|
14
|
-
- Components: PascalCase
|
|
15
|
-
|
|
16
|
-
## Preferred Patterns
|
|
17
|
-
- Pure functions
|
|
18
|
-
- Composition over inheritance
|
|
19
|
-
- Early returns
|
|
20
|
-
- Small private helpers
|
|
21
|
-
|
|
22
|
-
## Forbidden
|
|
23
|
-
- Implicit any
|
|
24
|
-
- Bloated components
|
|
25
|
-
- Domain-specific types in pace-core
|
|
26
|
-
|
|
27
|
-
## Cursor Checklist
|
|
28
|
-
- No any / unknown / unnecessary assertions
|
|
29
|
-
- Convert flags into unions
|
|
30
|
-
- Enforce naming rules
|
|
31
|
-
- Extract large functions into helpers
|
|
32
|
-
- Prevent domain types from leaking in
|