@jmruthers/pace-core 0.6.4 → 0.6.6
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/core-usage-manifest.json +93 -0
- package/cursor-rules/00-pace-core-compliance.mdc +128 -26
- package/cursor-rules/01-standards-compliance.mdc +49 -8
- package/cursor-rules/02-project-structure.mdc +6 -0
- package/cursor-rules/03-solid-principles.mdc +2 -0
- package/cursor-rules/04-testing-standards.mdc +2 -0
- package/cursor-rules/05-bug-reports-and-features.mdc +2 -0
- package/cursor-rules/06-code-quality.mdc +2 -0
- package/cursor-rules/07-tech-stack-compliance.mdc +2 -0
- package/cursor-rules/08-markup-quality.mdc +52 -27
- package/cursor-rules/09-rbac-compliance.mdc +462 -0
- package/cursor-rules/10-error-handling-patterns.mdc +179 -0
- package/cursor-rules/11-performance-optimization.mdc +169 -0
- package/cursor-rules/12-ci-cd-integration.mdc +150 -0
- package/dist/{AuthService-Cb34EQs3.d.ts → AuthService-DmfO5rGS.d.ts} +10 -0
- package/dist/{DataTable-BMRU8a1j.d.ts → DataTable-2N_tqbfq.d.ts} +1 -1
- package/dist/DataTable-LRJL4IRV.js +15 -0
- package/dist/{PublicPageProvider-DEMpysFR.d.ts → PublicPageProvider-BBH6Vqg7.d.ts} +72 -139
- package/dist/UnifiedAuthProvider-ZT6TIGM7.js +7 -0
- package/dist/api-Y4MQWOFW.js +4 -0
- package/dist/audit-MYQXYZFU.js +3 -0
- package/dist/{chunk-J36DSWQK.js → chunk-2HGJFNAH.js} +8 -28
- package/dist/{chunk-OEWDTMG7.js → chunk-3O3WHILE.js} +38 -121
- package/dist/{chunk-M43Y4SSO.js → chunk-3QC3KRHK.js} +1 -14
- package/dist/{chunk-DGUM43GV.js → chunk-3RG5ZIWI.js} +1 -4
- package/dist/{chunk-QXHPKYJV.js → chunk-4SXLQIZO.js} +1 -26
- package/dist/chunk-4T7OBVTU.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-NN6WWZ5U.js → chunk-7TYHROIV.js} +579 -563
- package/dist/{chunk-M7MPQISP.js → chunk-A55DK444.js} +9 -16
- package/dist/{chunk-63FOKYGO.js → chunk-AHU7G2R5.js} +2 -11
- package/dist/{chunk-L4OXEN46.js → chunk-BVP2BCJF.js} +2 -16
- package/dist/chunk-C7NSAPTL.js +1 -0
- package/dist/{chunk-YKRAFF5K.js → chunk-FENMYN2U.js} +73 -149
- package/dist/{chunk-AVMLPIM7.js → chunk-FTCRZOG2.js} +284 -432
- package/dist/{chunk-G37KK66H.js → chunk-FYHN4DD5.js} +60 -19
- package/dist/{chunk-VBXEHIUJ.js → chunk-HF6O3O37.js} +6 -88
- package/dist/{chunk-I6DAQMWX.js → chunk-LAZMKTTF.js} +930 -891
- package/dist/{chunk-5EC5MEWX.js → chunk-MAGBIDNS.js} +77 -222
- package/dist/chunk-MBADTM7L.js +64 -0
- package/dist/chunk-OHIK3MIO.js +994 -0
- package/dist/{chunk-6SOIHG6Z.js → chunk-S7DKJPLT.js} +115 -44
- package/dist/{chunk-FMUCXFII.js → chunk-SD6WQY43.js} +1 -5
- package/dist/{chunk-PWLANIRT.js → chunk-TTRFSOKR.js} +1 -7
- package/dist/{chunk-5DRSZLL2.js → chunk-UH3NTO3F.js} +1 -6
- package/dist/{chunk-FFQEQTNW.js → chunk-UIYSCEV7.js} +134 -45
- package/dist/{chunk-3LPHPB62.js → chunk-ZFYPMX46.js} +271 -87
- package/dist/{chunk-7JPAB3T5.js → chunk-ZS5VO5JB.js} +1989 -1283
- package/dist/components.d.ts +6 -6
- package/dist/components.js +57 -267
- package/dist/{database.generated-CzIvgcPu.d.ts → database.generated-CcnC_DRc.d.ts} +4795 -3691
- package/dist/eslint-rules/index.cjs +22 -0
- package/dist/eslint-rules/rules/compliance.cjs +348 -0
- package/dist/eslint-rules/rules/components.cjs +113 -0
- package/dist/eslint-rules/rules/imports.cjs +102 -0
- package/dist/eslint-rules/rules/rbac.cjs +790 -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 +5 -5
- package/dist/hooks.js +62 -270
- package/dist/icons/index.d.ts +1 -0
- package/dist/icons/index.js +1 -0
- package/dist/index.d.ts +36 -26
- package/dist/index.js +87 -690
- 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 +124 -594
- package/dist/rbac/index.js +14 -207
- package/dist/styles/index.js +2 -12
- 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-B-K_5VnO.d.ts} +4 -0
- package/dist/types-t9H8qKRw.d.ts +55 -0
- package/dist/types.d.ts +1 -1
- package/dist/types.js +7 -94
- package/dist/{usePublicRouteParams-i3qtoBgg.d.ts → usePublicRouteParams-COZ28Mvq.d.ts} +9 -9
- package/dist/utils.d.ts +24 -117
- package/dist/utils.js +54 -392
- package/docs/README.md +16 -6
- package/docs/api/README.md +4 -402
- package/docs/api/modules.md +454 -930
- package/docs/api-reference/components.md +3 -1
- package/docs/api-reference/deprecated.md +31 -6
- package/docs/api-reference/rpc-functions.md +78 -3
- package/docs/best-practices/accessibility.md +6 -3
- package/docs/getting-started/cursor-rules.md +3 -23
- package/docs/getting-started/dependencies.md +650 -0
- package/docs/getting-started/installation-guide.md +20 -7
- package/docs/getting-started/quick-start.md +23 -12
- package/docs/implementation-guides/permission-enforcement.md +4 -0
- package/docs/rbac/MIGRATION_GUIDE.md +819 -0
- package/docs/rbac/RBAC_CONTRACT.md +724 -0
- package/docs/rbac/README.md +12 -3
- package/docs/rbac/edge-functions-guide.md +376 -0
- package/docs/rbac/secure-client-protection.md +0 -34
- package/docs/standards/00-pace-core-compliance.md +967 -0
- package/docs/standards/01-standards-compliance.md +188 -0
- package/docs/standards/02-project-structure.md +985 -0
- package/docs/standards/03-solid-principles.md +39 -0
- package/docs/standards/04-testing-standards.md +36 -0
- package/docs/standards/05-bug-reports-and-features.md +27 -0
- package/docs/standards/{04-code-style-standard.md → 06-code-quality.md} +2 -0
- package/docs/standards/07-tech-stack-compliance.md +30 -0
- package/docs/standards/08-markup-quality.md +345 -0
- package/docs/standards/{07-rbac-and-rls-standard.md → 09-rbac-compliance.md} +149 -54
- package/docs/standards/10-error-handling-patterns.md +401 -0
- package/docs/standards/11-performance-optimization.md +348 -0
- package/docs/standards/12-ci-cd-integration.md +370 -0
- package/docs/standards/ALIGNMENT_REVIEW_SUMMARY.md +192 -0
- package/docs/standards/README.md +62 -33
- package/docs/troubleshooting/organisation-context-setup.md +42 -19
- package/eslint-config-pace-core.cjs +20 -4
- package/package.json +31 -21
- package/scripts/audit/audit-compliance.cjs +1295 -0
- package/scripts/audit/audit-components.cjs +260 -0
- package/scripts/audit/audit-dependencies.cjs +395 -0
- package/scripts/audit/audit-rbac.cjs +954 -0
- package/scripts/audit/audit-standards.cjs +1268 -0
- package/scripts/audit/index.cjs +1898 -194
- package/scripts/install-cursor-rules.cjs +259 -8
- package/scripts/validate-master.js +1 -1
- package/src/__tests__/fixtures/supabase.ts +1 -1
- package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +1 -1
- 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-utils.test.tsx +3 -3
- package/src/__tests__/helpers/component-test-utils.tsx +1 -1
- package/src/__tests__/helpers/supabaseMock.ts +2 -2
- package/src/__tests__/public-recipe-view.test.ts +38 -9
- package/src/components/Button/Button.tsx +5 -1
- package/src/components/ContextSelector/ContextSelector.tsx +42 -39
- package/src/components/DataTable/__tests__/keyboard.test.tsx +15 -2
- package/src/components/DataTable/components/DataTableBody.tsx +55 -31
- package/src/components/DataTable/components/DataTableCore.tsx +186 -13
- package/src/components/DataTable/components/DataTableLayout.tsx +30 -5
- package/src/components/DataTable/components/EditFields.tsx +23 -3
- package/src/components/DataTable/components/EditableRow.tsx +7 -2
- package/src/components/DataTable/components/ImportModal.tsx +4 -6
- package/src/components/DataTable/components/RowComponent.tsx +12 -0
- package/src/components/DataTable/components/ViewRowModal.tsx +4 -4
- package/src/components/DataTable/components/__tests__/ImportModal.test.tsx +455 -96
- package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +122 -58
- package/src/components/DataTable/components/hooks/usePermissionTracking.ts +0 -4
- package/src/components/DataTable/core/DataTableContext.tsx +1 -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 -0
- package/src/components/DateTimeField/DateTimeField.tsx +20 -20
- package/src/components/DateTimeField/README.md +5 -2
- package/src/components/Dialog/Dialog.test.tsx +361 -318
- package/src/components/Dialog/Dialog.tsx +1154 -323
- package/src/components/Dialog/index.ts +3 -3
- package/src/components/FileDisplay/FileDisplay.test.tsx +45 -2
- package/src/components/FileDisplay/FileDisplay.tsx +28 -22
- package/src/components/Form/Form.test.tsx +9 -10
- package/src/components/Form/Form.tsx +369 -9
- package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +28 -28
- package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +40 -54
- package/src/components/LoginForm/LoginForm.tsx +2 -2
- package/src/components/NavigationMenu/NavigationMenu.test.tsx +14 -13
- package/src/components/NavigationMenu/NavigationMenu.tsx +2 -2
- package/src/components/NavigationMenu/useNavigationFiltering.ts +11 -21
- package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +6 -4
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +30 -41
- package/src/components/PaceAppLayout/README.md +10 -9
- package/src/components/PaceAppLayout/test-setup.tsx +40 -31
- package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +108 -61
- package/src/components/PaceLoginPage/PaceLoginPage.tsx +27 -3
- package/src/components/PasswordChange/PasswordChangeForm.test.tsx +61 -0
- package/src/components/PasswordChange/PasswordChangeForm.tsx +20 -13
- package/src/components/PublicLayout/PublicLayout.test.tsx +7 -3
- package/src/components/PublicLayout/PublicPageLayout.tsx +5 -8
- package/src/components/Select/Select.tsx +23 -21
- package/src/components/Select/types.ts +1 -1
- package/src/components/UserMenu/UserMenu.test.tsx +38 -6
- package/src/components/UserMenu/UserMenu.tsx +39 -34
- package/src/components/index.ts +3 -4
- package/src/eslint-rules/index.cjs +22 -0
- package/src/eslint-rules/rules/compliance.cjs +348 -0
- package/src/eslint-rules/rules/components.cjs +113 -0
- package/src/eslint-rules/rules/imports.cjs +102 -0
- package/src/eslint-rules/rules/rbac.cjs +790 -0
- package/src/eslint-rules/utils/helpers.cjs +42 -0
- package/src/eslint-rules/utils/manifest-loader.cjs +75 -0
- package/src/hooks/__tests__/hooks.integration.test.tsx +6 -8
- package/src/hooks/__tests__/useAppConfig.unit.test.ts +129 -67
- 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 +62 -190
- package/src/hooks/public/usePublicEventLogo.test.ts +70 -17
- package/src/hooks/public/usePublicEventLogo.ts +19 -9
- package/src/hooks/useAppConfig.ts +26 -24
- package/src/hooks/useEventTheme.test.ts +211 -233
- package/src/hooks/useEventTheme.ts +19 -28
- package/src/hooks/useEvents.ts +11 -7
- package/src/hooks/useKeyboardShortcuts.ts +1 -1
- package/src/hooks/useOrganisationPermissions.ts +9 -11
- package/src/hooks/useOrganisations.ts +13 -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 +16 -1
- package/src/providers/OrganisationProvider.tsx +23 -14
- package/src/providers/services/EventServiceProvider.tsx +1 -24
- package/src/providers/services/UnifiedAuthProvider.tsx +5 -48
- package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +3 -0
- package/src/rbac/README.md +20 -20
- 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/useRBAC.test.ts +21 -3
- package/src/rbac/hooks/useRBAC.ts +4 -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 +241 -60
- package/src/rbac/hooks/useResourcePermissions.ts +182 -63
- 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/permissions.ts +17 -17
- package/src/rbac/utils/contextValidator.ts +45 -7
- package/src/services/AuthService.ts +132 -23
- package/src/services/EventService.ts +4 -97
- package/src/services/InactivityService.ts +155 -58
- 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 +4 -0
- package/src/types/database.generated.ts +4733 -3809
- 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/formatting/formatTime.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/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/CHANGELOG.md +0 -119
- package/cursor-rules/README.md +0 -192
- package/dist/DataTable-E7YQZD7D.js +0 -175
- package/dist/DataTable-E7YQZD7D.js.map +0 -1
- package/dist/UnifiedAuthProvider-QPXO24B4.js +0 -18
- package/dist/UnifiedAuthProvider-QPXO24B4.js.map +0 -1
- package/dist/api-6LVZTHDS.js +0 -52
- package/dist/api-6LVZTHDS.js.map +0 -1
- package/dist/audit-V53FV5AG.js +0 -17
- package/dist/audit-V53FV5AG.js.map +0 -1
- package/dist/chunk-36LVWXB2.js +0 -227
- package/dist/chunk-36LVWXB2.js.map +0 -1
- package/dist/chunk-3LPHPB62.js.map +0 -1
- package/dist/chunk-5DRSZLL2.js.map +0 -1
- package/dist/chunk-5EC5MEWX.js.map +0 -1
- package/dist/chunk-63FOKYGO.js.map +0 -1
- package/dist/chunk-6SOIHG6Z.js.map +0 -1
- package/dist/chunk-7JPAB3T5.js.map +0 -1
- package/dist/chunk-ATKZM7RX.js +0 -2053
- package/dist/chunk-ATKZM7RX.js.map +0 -1
- package/dist/chunk-AVMLPIM7.js.map +0 -1
- package/dist/chunk-DGUM43GV.js.map +0 -1
- package/dist/chunk-E66EQZE6.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-I6DAQMWX.js.map +0 -1
- package/dist/chunk-J36DSWQK.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-NN6WWZ5U.js.map +0 -1
- package/dist/chunk-OEWDTMG7.js.map +0 -1
- package/dist/chunk-PWLANIRT.js.map +0 -1
- package/dist/chunk-QXHPKYJV.js.map +0 -1
- package/dist/chunk-VBXEHIUJ.js.map +0 -1
- package/dist/chunk-YKRAFF5K.js.map +0 -1
- package/dist/chunk-ZSAAAMVR.js.map +0 -1
- package/dist/components.js.map +0 -1
- package/dist/contextValidator-OOPCLPZW.js +0 -9
- package/dist/contextValidator-OOPCLPZW.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/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/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/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/eslint-rules/pace-core-compliance.cjs +0 -510
- 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
package/CHANGELOG.md
CHANGED
|
@@ -7,7 +7,111 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
### Breaking Changes
|
|
11
|
+
- **@supabase/supabase-js is now an included dependency (security enforcement)**: Moved from peer dependency to included dependency to enforce security rules. Consuming apps can no longer import `createClient` directly.
|
|
12
|
+
- **Action Required**:
|
|
13
|
+
- Remove `@supabase/supabase-js` from your `package.json` if installed
|
|
14
|
+
- Replace `createClient` imports with `createBaseClient()` from `@jmruthers/pace-core`
|
|
15
|
+
- **Migration**:
|
|
16
|
+
```tsx
|
|
17
|
+
// ❌ OLD: Direct import
|
|
18
|
+
import { createClient } from '@supabase/supabase-js';
|
|
19
|
+
const supabase = createClient(url, key);
|
|
20
|
+
|
|
21
|
+
// ✅ NEW: Use pace-core wrapper
|
|
22
|
+
import { createBaseClient } from '@jmruthers/pace-core';
|
|
23
|
+
const supabase = createBaseClient(url, key);
|
|
24
|
+
```
|
|
25
|
+
- **Why**: Enforces security rules - prevents insecure client usage
|
|
26
|
+
- See [Dependencies Guide](./docs/getting-started/dependencies.md) for details
|
|
27
|
+
|
|
28
|
+
- **@radix-ui/* packages are now included dependencies (consistency enforcement)**: Moved from peer dependencies to included dependencies to enforce consistency. Consuming apps can no longer import Radix UI primitives directly.
|
|
29
|
+
- **Action Required**:
|
|
30
|
+
- Remove all `@radix-ui/*` packages from your `package.json` if installed
|
|
31
|
+
- Replace Radix UI imports with pace-core components
|
|
32
|
+
- **Migration**:
|
|
33
|
+
```tsx
|
|
34
|
+
// ❌ OLD: Direct Radix UI import
|
|
35
|
+
import { Checkbox } from '@radix-ui/react-checkbox';
|
|
36
|
+
|
|
37
|
+
// ✅ NEW: Use pace-core component
|
|
38
|
+
import { Checkbox } from '@jmruthers/pace-core';
|
|
39
|
+
```
|
|
40
|
+
- **Why**: Enforces consistency - prevents bypassing pace-core components
|
|
41
|
+
- See [Dependencies Guide](./docs/getting-started/dependencies.md) for details
|
|
42
|
+
|
|
43
|
+
- **lucide-react is now an included dependency (consistency enforcement)**: Moved from peer dependency to included dependency to enforce consistency. Consuming apps can no longer import icons directly from `lucide-react`.
|
|
44
|
+
- **Action Required**:
|
|
45
|
+
- Remove `lucide-react` from your `package.json` if installed
|
|
46
|
+
- Replace `lucide-react` imports with `@jmruthers/pace-core/icons`
|
|
47
|
+
- **Migration**:
|
|
48
|
+
```tsx
|
|
49
|
+
// ❌ OLD: Direct lucide-react import
|
|
50
|
+
import { ChevronDown, Edit } from 'lucide-react';
|
|
51
|
+
|
|
52
|
+
// ✅ NEW: Use pace-core icon exports
|
|
53
|
+
import { ChevronDown, Edit } from '@jmruthers/pace-core/icons';
|
|
54
|
+
```
|
|
55
|
+
- **Why**: Enforces consistency - all icons available through pace-core
|
|
56
|
+
- **Note**: All lucide-react icons are now exported from `@jmruthers/pace-core/icons`
|
|
57
|
+
- See [Dependencies Guide](./docs/getting-started/dependencies.md) for details
|
|
58
|
+
|
|
59
|
+
- **@tanstack/react-query is a peer dependency**: Consuming apps need direct access to `QueryClient`, `QueryClientProvider`, and React Query hooks for configuration.
|
|
60
|
+
- **Action Required**: Install `@tanstack/react-query@^5.90.0` in your consuming app
|
|
61
|
+
- See [Dependencies Guide](./docs/getting-started/dependencies.md) for details
|
|
62
|
+
|
|
63
|
+
- **date-fns and date-fns-tz are peer dependencies**: Consuming apps may need direct access to date-fns functions that pace-core doesn't export.
|
|
64
|
+
- **Action Required**: Install `date-fns@^3.0.0` and `date-fns-tz@^3.0.0` in your consuming app
|
|
65
|
+
- See [Dependencies Guide](./docs/getting-started/dependencies.md) for details
|
|
66
|
+
|
|
67
|
+
### Breaking Changes
|
|
68
|
+
- **RBAC Package Surface Area Reduction**: Removed redundant and overlapping RBAC exports to enforce a single correct pattern
|
|
69
|
+
- **Components Removed**:
|
|
70
|
+
- `PermissionEnforcer` → Use `PagePermissionGuard` instead
|
|
71
|
+
- `PermissionGuard` (from adapters) → Use `PagePermissionGuard` instead
|
|
72
|
+
- `AccessLevelGuard` → Use `useAccessLevel` hook + conditional rendering instead
|
|
73
|
+
- `RoleBasedRouter` → Use `PagePermissionGuard` + React Router instead
|
|
74
|
+
- `EnhancedNavigationMenu` → Use `NavigationMenu` + `NavigationGuard` instead
|
|
75
|
+
- `PagePermissionProvider` → Use `PagePermissionGuard` directly instead
|
|
76
|
+
- `SecureDataProvider` → Use `useSecureSupabase` hook directly instead
|
|
77
|
+
- `NavigationProvider` → Use `NavigationGuard` directly instead
|
|
78
|
+
- **Hooks Removed**:
|
|
79
|
+
- `useHasAnyPermission` → Use `useMultiplePermissions` with appropriate logic instead
|
|
80
|
+
- `useHasAllPermissions` → Use `useMultiplePermissions` with appropriate logic instead
|
|
81
|
+
- `useCachedPermissions` → Caching is automatic in all hooks
|
|
82
|
+
- **API Functions Removed**:
|
|
83
|
+
- `hasPermission` → Use `isPermitted` instead
|
|
84
|
+
- `hasPermissionCached` (from adapters) → Use `isPermittedCached` or hooks (automatic caching) instead
|
|
85
|
+
- `hasAnyPermissionCached` (from adapters) → Use `hasAnyPermission` or hooks (automatic caching) instead
|
|
86
|
+
- **Internal Exports Marked**: The following exports are now marked as `@internal` and should not be used by consuming apps:
|
|
87
|
+
- `RBACEngine`, `createRBACEngine` → Use `isPermitted` API instead
|
|
88
|
+
- `RBACCache`, `rbacCache`, `CACHE_PATTERNS` → Caching is automatic
|
|
89
|
+
- `SecureSupabaseClient`, `createSecureClient`, `fromSupabaseClient` → Use `useSecureSupabase` hook instead
|
|
90
|
+
- **Server Adapters**: Server-side adapters (`withPermissionGuard`, `withAccessLevelGuard`, `withRoleGuard`, `createRBACMiddleware`, `createRBACExpressMiddleware`) remain available for server-side route protection but are optional utilities.
|
|
91
|
+
|
|
92
|
+
**Migration Required**: See [RBAC Migration Guide](./docs/rbac/MIGRATION_GUIDE.md) for detailed migration instructions.
|
|
93
|
+
|
|
94
|
+
- **RBAC Contract v2.0.0**: Enforced RBAC contract with strict compliance rules
|
|
95
|
+
- **ESLint Rules**: All RBAC compliance rules are now **ERROR** severity (not warnings)
|
|
96
|
+
- **EventPageGuard Removed**: Wrapper components around `PagePermissionGuard` are forbidden. Use `PagePermissionGuard` directly and handle event context validation in page components.
|
|
97
|
+
- **Custom AccessDenied Forbidden**: Custom access denied components are forbidden. Use `AccessDenied` from `@jmruthers/pace-core/rbac` instead.
|
|
98
|
+
- **Direct RBAC Queries Forbidden**: Direct queries to RBAC tables are forbidden. Use `useSecureSupabase` hook instead.
|
|
99
|
+
- **Direct RPC Calls Forbidden**: Direct calls to `rbac_check_permission_simplified` are forbidden. Use `isPermitted` from pace-core instead.
|
|
100
|
+
- **enforcePermissions Clarified**: For event-based apps, `enforcePermissions` must be `false`. For organisation-based apps, it must be `true`.
|
|
101
|
+
|
|
102
|
+
**Migration Required**: See [RBAC Migration Guide](./docs/rbac/MIGRATION_GUIDE.md) for detailed migration instructions.
|
|
103
|
+
|
|
10
104
|
### Added
|
|
105
|
+
- **Standard AccessDenied Component**: New `AccessDenied` component exported from `@jmruthers/pace-core/rbac` for consistent access denied UX across all apps
|
|
106
|
+
- **RBAC Contract Documentation**: New `RBAC_CONTRACT.md` defining the mandatory contract between pace-core and consuming apps
|
|
107
|
+
- **RBAC Migration Guide**: New `MIGRATION_GUIDE.md` with step-by-step migration instructions
|
|
108
|
+
- **Enhanced ESLint Rules**: New rules for RBAC compliance:
|
|
109
|
+
- `no-direct-rbac-rpc`: Detects direct RPC calls to `rbac_check_permission_simplified`
|
|
110
|
+
- `no-direct-rbac-tables`: Detects direct queries to RBAC tables
|
|
111
|
+
- `no-bypass-page-guard`: Detects routes without `PagePermissionGuard`
|
|
112
|
+
- `no-custom-access-denied`: Detects custom access denied components
|
|
113
|
+
- **Pattern Detection**: New `pattern-detector.ts` for static and runtime RBAC violation detection
|
|
114
|
+
- **Enhanced Compliance Tools**: Updated `runtime-compliance.ts` with pattern detection capabilities
|
|
11
115
|
- **Unified Context Selector**: New `ContextSelector` component that intelligently shows all accessible organisations and events in a single dropdown. Replaces the need for separate `OrganisationSelector`, `EventSelector`, and `HybridContextSelector` components.
|
|
12
116
|
- Automatically determines what to show based on user's roles and permissions
|
|
13
117
|
- Shows superset of all accessible orgs and events
|
package/README.md
CHANGED
|
@@ -1,415 +1,17 @@
|
|
|
1
1
|
# @jmruthers/pace-core
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
React component library with Tailwind v4.
|
|
4
4
|
|
|
5
|
-
##
|
|
6
|
-
|
|
7
|
-
### Version 0.5.65+ - Mandatory Inactivity Timeouts
|
|
8
|
-
|
|
9
|
-
The `UnifiedAuthProvider` now requires mandatory inactivity timeout configuration for security:
|
|
10
|
-
|
|
11
|
-
```tsx
|
|
12
|
-
// ❌ Before (will cause TypeScript errors)
|
|
13
|
-
<UnifiedAuthProvider supabaseClient={supabase} appName="my-app">
|
|
14
|
-
<AppContent />
|
|
15
|
-
</UnifiedAuthProvider>
|
|
16
|
-
|
|
17
|
-
// ✅ After (required configuration)
|
|
18
|
-
<UnifiedAuthProvider
|
|
19
|
-
supabaseClient={supabase}
|
|
20
|
-
appName="my-app"
|
|
21
|
-
idleTimeoutMs={30 * 60 * 1000} // Required
|
|
22
|
-
warnBeforeMs={5 * 60 * 1000} // Required
|
|
23
|
-
onIdleLogout={() => navigate('/login')} // Required
|
|
24
|
-
>
|
|
25
|
-
<AppContent />
|
|
26
|
-
</UnifiedAuthProvider>
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
[📖 Migration Guide](./docs/migration-guides/unified-auth-provider-mandatory-timeouts.md)
|
|
30
|
-
|
|
31
|
-
## 🚀 PaceAppLayout Usage
|
|
32
|
-
|
|
33
|
-
**PaceAppLayout uses React Router's nested routing pattern for optimal performance and scalability.**
|
|
34
|
-
|
|
35
|
-
```tsx
|
|
36
|
-
// ✅ Correct usage with React Router
|
|
37
|
-
<Router>
|
|
38
|
-
<Routes>
|
|
39
|
-
<Route path="/" element={<PaceAppLayout appName="My App" />}>
|
|
40
|
-
<Route path="dashboard" element={<Dashboard />} />
|
|
41
|
-
<Route path="settings" element={<Settings />} />
|
|
42
|
-
</Route>
|
|
43
|
-
</Routes>
|
|
44
|
-
</Router>
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
## 📦 Type System
|
|
48
|
-
|
|
49
|
-
PACE Core uses a domain-driven type organization for better maintainability and discoverability:
|
|
50
|
-
|
|
51
|
-
```typescript
|
|
52
|
-
// Import from domain-specific modules
|
|
53
|
-
import type { Event } from '@jmruthers/pace-core/types/event';
|
|
54
|
-
import type { Organisation } from '@jmruthers/pace-core/types/organisation';
|
|
55
|
-
import type { User, Session } from '@jmruthers/pace-core/types/auth';
|
|
56
|
-
import type { UserId, AppId, PageId } from '@jmruthers/pace-core/types/core';
|
|
57
|
-
import type { RBACPermissionCheckParams } from '@jmruthers/pace-core/rbac/types/functions';
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
See the [Types API Reference](./docs/api-reference/types.md) for complete type documentation.
|
|
61
|
-
|
|
62
|
-
## 🚀 Complete Installation Guide
|
|
63
|
-
|
|
64
|
-
### 1. Install Dependencies
|
|
5
|
+
## Installation
|
|
65
6
|
|
|
66
7
|
```bash
|
|
67
|
-
|
|
68
|
-
npm install @jmruthers/pace-core @tanstack/react-table @radix-ui/react-checkbox @radix-ui/react-dialog @radix-ui/react-dropdown-menu @radix-ui/react-label @radix-ui/react-slot lucide-react class-variance-authority clsx tailwind-merge
|
|
69
|
-
|
|
70
|
-
# Install Tailwind CSS v4 and Vite plugin
|
|
71
|
-
npm install -D @tailwindcss/vite tailwindcss@^4.0.0
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
### 2. Import Core Styles
|
|
75
|
-
|
|
76
|
-
```tsx
|
|
77
|
-
// src/main.tsx (or your app's entry point)
|
|
78
|
-
import '@jmruthers/pace-core/src/styles/core.css';
|
|
79
|
-
import React from 'react';
|
|
80
|
-
import ReactDOM from 'react-dom/client';
|
|
81
|
-
import App from './App';
|
|
82
|
-
|
|
83
|
-
// React 19+ with createRoot
|
|
84
|
-
const root = ReactDOM.createRoot(document.getElementById('root') as HTMLElement);
|
|
85
|
-
root.render(
|
|
86
|
-
<React.StrictMode>
|
|
87
|
-
<App />
|
|
88
|
-
</React.StrictMode>
|
|
89
|
-
);
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
### 3. Configure Vite with Tailwind v4
|
|
93
|
-
|
|
94
|
-
**⚠️ CRITICAL**: This configuration is required for:
|
|
95
|
-
1. **Tailwind CSS scanning** - Ensures components are styled
|
|
96
|
-
2. **React context consistency** - Prevents "useUnifiedAuth must be used within a UnifiedAuthProvider" errors
|
|
97
|
-
3. **Router context availability** - Prevents "useNavigate() may be used only in the context of a <Router>" errors
|
|
98
|
-
|
|
99
|
-
```typescript
|
|
100
|
-
// vite.config.ts
|
|
101
|
-
import { defineConfig } from 'vite'
|
|
102
|
-
import react from '@vitejs/plugin-react'
|
|
103
|
-
import tailwindcss from '@tailwindcss/vite'
|
|
104
|
-
import path from 'path'
|
|
105
|
-
|
|
106
|
-
export default defineConfig({
|
|
107
|
-
plugins: [
|
|
108
|
-
react({
|
|
109
|
-
// React Compiler for automatic optimizations (React 19+)
|
|
110
|
-
babel: {
|
|
111
|
-
plugins: ['babel-plugin-react-compiler'],
|
|
112
|
-
},
|
|
113
|
-
}),
|
|
114
|
-
tailwindcss({
|
|
115
|
-
// Only need to scan your app's source files
|
|
116
|
-
// pace-core source files are automatically scanned via @source directives
|
|
117
|
-
content: [
|
|
118
|
-
'./src/**/*.{js,ts,jsx,tsx}'
|
|
119
|
-
]
|
|
120
|
-
})
|
|
121
|
-
],
|
|
122
|
-
resolve: {
|
|
123
|
-
alias: {
|
|
124
|
-
"@": path.resolve(__dirname, "./src"),
|
|
125
|
-
},
|
|
126
|
-
// CRITICAL: Dedupe React and React Router to ensure single instances
|
|
127
|
-
// This prevents Router context issues when pace-core uses react-router-dom
|
|
128
|
-
dedupe: ['react', 'react-dom', 'react-router-dom']
|
|
129
|
-
},
|
|
130
|
-
// CRITICAL: Exclude pace-core from pre-bundling to prevent React context mismatches
|
|
131
|
-
// Pre-bundling creates separate React instances, causing context errors
|
|
132
|
-
optimizeDeps: {
|
|
133
|
-
include: [
|
|
134
|
-
'react',
|
|
135
|
-
'react-dom',
|
|
136
|
-
'react/jsx-runtime',
|
|
137
|
-
'@radix-ui/react-slot'
|
|
138
|
-
],
|
|
139
|
-
// CRITICAL: Exclude pace-core from pre-bundling
|
|
140
|
-
// This ensures pace-core uses the same React instance as your app
|
|
141
|
-
// NOTE: react-router-dom should be INCLUDED, not excluded (excluding causes "module is not defined" errors)
|
|
142
|
-
exclude: ['@jmruthers/pace-core']
|
|
143
|
-
},
|
|
144
|
-
server: {
|
|
145
|
-
port: 3000,
|
|
146
|
-
open: true,
|
|
147
|
-
},
|
|
148
|
-
build: {
|
|
149
|
-
outDir: 'dist',
|
|
150
|
-
sourcemap: true,
|
|
151
|
-
},
|
|
152
|
-
})
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
**Fallback Configuration:** If the CSS-first approach doesn't work, you can explicitly include pace-core source files:
|
|
156
|
-
|
|
157
|
-
```typescript
|
|
158
|
-
// vite.config.ts - Fallback configuration
|
|
159
|
-
export default defineConfig({
|
|
160
|
-
plugins: [
|
|
161
|
-
react(),
|
|
162
|
-
tailwindcss({
|
|
163
|
-
content: [
|
|
164
|
-
'./src/**/*.{js,ts,jsx,tsx}',
|
|
165
|
-
'./node_modules/@jmruthers/pace-core/src/**/*.{js,ts,jsx,tsx}'
|
|
166
|
-
]
|
|
167
|
-
})
|
|
168
|
-
],
|
|
169
|
-
// ... rest of config
|
|
170
|
-
})
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
### 4. Verify Installation
|
|
174
|
-
|
|
175
|
-
Create a test component to ensure everything works:
|
|
176
|
-
|
|
177
|
-
```tsx
|
|
178
|
-
// src/App.tsx
|
|
179
|
-
import { Button, Card, Input } from '@jmruthers/pace-core';
|
|
180
|
-
|
|
181
|
-
function App() {
|
|
182
|
-
return (
|
|
183
|
-
<div className="p-8 space-y-4">
|
|
184
|
-
<h1 className="text-2xl font-bold text-main-900">PACE Core Test</h1>
|
|
185
|
-
|
|
186
|
-
<Card className="p-4">
|
|
187
|
-
<h2 className="text-lg font-semibold text-sec-800 mb-2">Components Test</h2>
|
|
188
|
-
<div className="space-y-2">
|
|
189
|
-
<Button variant="primary" className="bg-main-600 text-main-50">
|
|
190
|
-
Primary Button
|
|
191
|
-
</Button>
|
|
192
|
-
<Button variant="secondary" className="bg-sec-500 text-main-50">
|
|
193
|
-
Secondary Button
|
|
194
|
-
</Button>
|
|
195
|
-
<Input placeholder="Test input field" className="border-main-300" />
|
|
196
|
-
</div>
|
|
197
|
-
</Card>
|
|
198
|
-
</div>
|
|
199
|
-
);
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
export default App;
|
|
203
|
-
```
|
|
204
|
-
|
|
205
|
-
**Expected Result:** You should see properly styled components with PACE Core's design system colors and typography.
|
|
206
|
-
|
|
207
|
-
## ⚠️ Critical Configuration Notes
|
|
208
|
-
|
|
209
|
-
### Why Source File Scanning is Required
|
|
210
|
-
|
|
211
|
-
Pace-core v0.4.15+ includes source files in the published package because:
|
|
212
|
-
|
|
213
|
-
- Tailwind v4 needs to scan original TypeScript/JSX files to detect utility classes
|
|
214
|
-
- Compiled JavaScript files don't contain the class names Tailwind needs
|
|
215
|
-
- Without proper scanning, only ~292 CSS rules are generated instead of 800+ needed
|
|
216
|
-
|
|
217
|
-
### Alternative Configuration (if source files don't work)
|
|
218
|
-
|
|
219
|
-
If you're still having issues with component scanning:
|
|
220
|
-
|
|
221
|
-
```typescript
|
|
222
|
-
// vite.config.ts
|
|
223
|
-
import { defineConfig } from 'vite'
|
|
224
|
-
import react from '@vitejs/plugin-react'
|
|
225
|
-
import tailwindcss from '@tailwindcss/vite'
|
|
226
|
-
|
|
227
|
-
export default defineConfig({
|
|
228
|
-
plugins: [
|
|
229
|
-
react(),
|
|
230
|
-
tailwindcss({
|
|
231
|
-
content: [
|
|
232
|
-
'./src/**/*.{js,ts,jsx,tsx}',
|
|
233
|
-
// Try source files first
|
|
234
|
-
'./node_modules/@jmruthers/pace-core/src/**/*.{js,ts,jsx,tsx}',
|
|
235
|
-
// Fallback: also scan dist files
|
|
236
|
-
'./node_modules/@jmruthers/pace-core/dist/**/*.{js,ts,jsx,tsx}'
|
|
237
|
-
]
|
|
238
|
-
})
|
|
239
|
-
],
|
|
240
|
-
})
|
|
241
|
-
```
|
|
242
|
-
|
|
243
|
-
### Legacy Configuration (v0.4.14 and below)
|
|
244
|
-
|
|
245
|
-
For older versions, use this configuration:
|
|
246
|
-
|
|
247
|
-
```typescript
|
|
248
|
-
// vite.config.ts
|
|
249
|
-
export default defineConfig({
|
|
250
|
-
plugins: [
|
|
251
|
-
react(),
|
|
252
|
-
tailwindcss({
|
|
253
|
-
content: [
|
|
254
|
-
'./src/**/*.{js,ts,jsx,tsx}',
|
|
255
|
-
'./node_modules/@jmruthers/pace-core/**/*.{js,ts,jsx,tsx}'
|
|
256
|
-
]
|
|
257
|
-
})
|
|
258
|
-
],
|
|
259
|
-
})
|
|
260
|
-
```
|
|
261
|
-
|
|
262
|
-
## 🔍 Troubleshooting
|
|
263
|
-
|
|
264
|
-
### Issue: "useUnifiedAuth must be used within a UnifiedAuthProvider"
|
|
265
|
-
|
|
266
|
-
**Cause**: Vite is pre-bundling `@jmruthers/pace-core`, creating separate React instances
|
|
267
|
-
|
|
268
|
-
**Solution**:
|
|
269
|
-
1. Add to `vite.config.ts`:
|
|
270
|
-
```typescript
|
|
271
|
-
optimizeDeps: {
|
|
272
|
-
exclude: ['@jmruthers/pace-core', 'react-router-dom']
|
|
273
|
-
}
|
|
274
|
-
```
|
|
275
|
-
2. Clear Vite cache: `rm -rf node_modules/.vite`
|
|
276
|
-
3. Restart dev server
|
|
277
|
-
|
|
278
|
-
### Issue: "useNavigate() may be used only in the context of a <Router> component"
|
|
279
|
-
|
|
280
|
-
**Cause**: Incorrect provider nesting - BrowserRouter should wrap UnifiedAuthProvider
|
|
281
|
-
|
|
282
|
-
**Solution**:
|
|
283
|
-
1. Ensure correct nesting order in `main.tsx`:
|
|
284
|
-
```tsx
|
|
285
|
-
<QueryClientProvider>
|
|
286
|
-
<BrowserRouter>
|
|
287
|
-
<UnifiedAuthProvider>
|
|
288
|
-
<OrganisationProvider>
|
|
289
|
-
<App />
|
|
290
|
-
</OrganisationProvider>
|
|
291
|
-
</UnifiedAuthProvider>
|
|
292
|
-
</BrowserRouter>
|
|
293
|
-
</QueryClientProvider>
|
|
294
|
-
```
|
|
295
|
-
2. Do NOT put BrowserRouter inside UnifiedAuthProvider
|
|
296
|
-
3. Add to `vite.config.ts`:
|
|
297
|
-
```typescript
|
|
298
|
-
resolve: {
|
|
299
|
-
dedupe: ['react', 'react-dom', 'react-router-dom']
|
|
300
|
-
}
|
|
301
|
-
```
|
|
302
|
-
|
|
303
|
-
### Issue: Only 292 CSS rules instead of 800+
|
|
304
|
-
|
|
305
|
-
**Solution**:
|
|
306
|
-
1. Update to pace-core v0.4.15+
|
|
307
|
-
2. Use source file paths: `./node_modules/@jmruthers/pace-core/src/**/*.{js,ts,jsx,tsx}`
|
|
308
|
-
3. Clear build cache: `rm -rf dist .vite node_modules && npm install`
|
|
309
|
-
|
|
310
|
-
### Issue: Components appear unstyled
|
|
311
|
-
|
|
312
|
-
**Solution**:
|
|
313
|
-
1. Check your Vite configuration includes pace-core source files
|
|
314
|
-
2. Ensure CSS file is imported: `import '@jmruthers/pace-core/src/styles/core.css'`
|
|
315
|
-
3. Restart dev server after configuration changes
|
|
316
|
-
|
|
317
|
-
### Issue: Build errors with source files
|
|
318
|
-
|
|
319
|
-
**Solution**: Add TypeScript configuration for node_modules:
|
|
320
|
-
|
|
321
|
-
```json
|
|
322
|
-
// tsconfig.json
|
|
323
|
-
{
|
|
324
|
-
"compilerOptions": {
|
|
325
|
-
"skipLibCheck": true
|
|
326
|
-
}
|
|
327
|
-
}
|
|
8
|
+
npm install @jmruthers/pace-core
|
|
328
9
|
```
|
|
329
10
|
|
|
330
|
-
### Issue: "Access Denied" errors with valid permissions
|
|
331
|
-
|
|
332
|
-
**Problem**: Users with valid permissions see "Access Denied" when loading pages with DataTable components.
|
|
333
|
-
|
|
334
|
-
**Root Cause**: Race condition in permission checking - `useCan` hook was being called with invalid scopes before scope resolution completed.
|
|
335
|
-
|
|
336
|
-
**Solution**: Fixed in v0.5.7+ - the `useCan` hook now properly handles invalid scopes and shows loading state until valid scope is available.
|
|
337
|
-
|
|
338
|
-
**What was fixed**:
|
|
339
|
-
- `useCan` hook skips API calls when `organisationId` is empty
|
|
340
|
-
- `PagePermissionGuard` shows loading state during scope resolution
|
|
341
|
-
- Eliminates race condition between scope resolution and permission checking
|
|
342
|
-
|
|
343
|
-
**No action needed** - this is automatically fixed in v0.5.7+
|
|
344
|
-
|
|
345
|
-
## Features
|
|
346
|
-
|
|
347
|
-
- 🎨 **Complete Design System** - Colors, typography, spacing, shadows
|
|
348
|
-
- 🧩 **React Components** - Buttons, inputs, cards, data tables, and more
|
|
349
|
-
- 🔐 **RBAC System** - Role-based access control with Supabase
|
|
350
|
-
- 🎨 **Tailwind v4** - CSS-first approach with design tokens
|
|
351
|
-
- 📱 **Responsive** - Mobile-first design patterns
|
|
352
|
-
- ♿ **Accessible** - WCAG compliant components
|
|
353
|
-
- 🚀 **Performance** - Tree-shakeable, optimized bundle
|
|
354
|
-
|
|
355
11
|
## Documentation
|
|
356
12
|
|
|
357
|
-
|
|
358
|
-
- [Installation Guide](./docs/getting-started/installation.md) - Detailed setup instructions
|
|
359
|
-
- [Vite Configuration](./docs/consuming-app-vite-config.md) - **CRITICAL** Tailwind scanning setup
|
|
360
|
-
- [Component API](./docs/api/README.md) - All available components and hooks
|
|
361
|
-
- [Styling Guide](./docs/styles/README.md) - Understanding the design system
|
|
362
|
-
- [Troubleshooting](./docs/troubleshooting/styling-issues.md) - Fix common styling problems
|
|
363
|
-
- [Tailwind Content Scanning](./docs/troubleshooting/tailwind-content-scanning.md) - **NEW** Comprehensive scanning solutions
|
|
364
|
-
|
|
365
|
-
## Import Strategy
|
|
366
|
-
|
|
367
|
-
PACE Core provides two import paths to optimize for different use cases:
|
|
368
|
-
|
|
369
|
-
### Main Export (Recommended for Common Components)
|
|
370
|
-
|
|
371
|
-
Use the main export for frequently used components and utilities:
|
|
372
|
-
|
|
373
|
-
```typescript
|
|
374
|
-
import {
|
|
375
|
-
Button,
|
|
376
|
-
Card,
|
|
377
|
-
Input,
|
|
378
|
-
DropdownMenu,
|
|
379
|
-
Select,
|
|
380
|
-
Dialog,
|
|
381
|
-
useUnifiedAuth
|
|
382
|
-
} from '@jmruthers/pace-core';
|
|
383
|
-
```
|
|
384
|
-
|
|
385
|
-
**Available from main export:**
|
|
386
|
-
- **Basic UI**: Button, Card, Input, Textarea, Label, Alert, Avatar, Checkbox, Progress
|
|
387
|
-
- **Advanced UI**: Dialog (with HTML content), DropdownMenu, Select, Toast, Tooltip, Tabs, Calendar
|
|
388
|
-
- **Data Display**: DataTable (with hierarchical actions & expand/collapse all), Table
|
|
389
|
-
- **Forms**: Form, LoginForm
|
|
390
|
-
- **Layout**: PaceAppLayout, Header, Footer, NavigationMenu
|
|
391
|
-
- **Providers**: UnifiedAuthProvider, OrganisationProvider, EventProvider
|
|
392
|
-
- **Hooks**: useUnifiedAuth, useOrganisations, useEvents
|
|
393
|
-
|
|
394
|
-
### Component Documentation
|
|
395
|
-
|
|
396
|
-
- **[DataTable Component](docs/implementation-guides/data-tables.md)** - Enterprise-grade data table with hierarchical rows, expand/collapse all, actions, sorting, filtering, and performance optimization
|
|
397
|
-
- **[Hierarchical DataTable Guide](docs/implementation-guides/hierarchical-datatable.md)** - Complete guide for implementing parent/child rows with expand/collapse all and smart sorting
|
|
398
|
-
- **[Dialog Component](src/components/Dialog/README.md)** - Comprehensive dialog system with smart height management, scrolling, HTML content rendering, and accessibility features
|
|
399
|
-
- **[Storage System](src/utils/storage/README.md)** - File storage utilities with organization-scoped access control
|
|
400
|
-
|
|
401
|
-
### Complete Components Export (For Specialized Components)
|
|
402
|
-
|
|
403
|
-
Use the complete export for specialized or advanced components:
|
|
404
|
-
|
|
405
|
-
```typescript
|
|
406
|
-
import {
|
|
407
|
-
DataTable,
|
|
408
|
-
NavigationMenu,
|
|
409
|
-
FormField
|
|
410
|
-
} from '@jmruthers/pace-core/components';
|
|
411
|
-
```
|
|
13
|
+
See [Documentation](./docs/README.md) for complete setup and usage guides.
|
|
412
14
|
|
|
413
15
|
## License
|
|
414
16
|
|
|
415
|
-
MIT License - see [LICENSE](./LICENSE) for details.
|
|
17
|
+
MIT License - see [LICENSE](./LICENSE) for details.
|
package/core-usage-manifest.json
CHANGED
|
@@ -163,6 +163,7 @@
|
|
|
163
163
|
"securityMonitor",
|
|
164
164
|
"sanitizeUserInput",
|
|
165
165
|
"sanitizeFormData",
|
|
166
|
+
"sanitizeHtml",
|
|
166
167
|
"validateUserInput",
|
|
167
168
|
"usernameSchema",
|
|
168
169
|
"emailSchema",
|
|
@@ -194,6 +195,86 @@
|
|
|
194
195
|
"formatDateTimeForTable",
|
|
195
196
|
"formatDateTimeForMap"
|
|
196
197
|
],
|
|
198
|
+
"icons": [
|
|
199
|
+
"ChevronDown",
|
|
200
|
+
"ChevronUp",
|
|
201
|
+
"ChevronLeft",
|
|
202
|
+
"ChevronRight",
|
|
203
|
+
"ChevronsUp",
|
|
204
|
+
"ChevronsDown",
|
|
205
|
+
"ChevronsLeft",
|
|
206
|
+
"ChevronsRight",
|
|
207
|
+
"ChevronsUpDown",
|
|
208
|
+
"ArrowUp",
|
|
209
|
+
"ArrowDown",
|
|
210
|
+
"ArrowLeft",
|
|
211
|
+
"ArrowRight",
|
|
212
|
+
"ArrowUpDown",
|
|
213
|
+
"Edit",
|
|
214
|
+
"Trash",
|
|
215
|
+
"Trash2",
|
|
216
|
+
"Plus",
|
|
217
|
+
"Minus",
|
|
218
|
+
"X",
|
|
219
|
+
"Check",
|
|
220
|
+
"Copy",
|
|
221
|
+
"Save",
|
|
222
|
+
"Upload",
|
|
223
|
+
"Download",
|
|
224
|
+
"Search",
|
|
225
|
+
"Filter",
|
|
226
|
+
"Settings",
|
|
227
|
+
"Settings2",
|
|
228
|
+
"MoreHorizontal",
|
|
229
|
+
"MoreVertical",
|
|
230
|
+
"AlertCircle",
|
|
231
|
+
"AlertTriangle",
|
|
232
|
+
"CheckCircle",
|
|
233
|
+
"Info",
|
|
234
|
+
"ShieldX",
|
|
235
|
+
"Eye",
|
|
236
|
+
"EyeOff",
|
|
237
|
+
"Lock",
|
|
238
|
+
"Unlock",
|
|
239
|
+
"Clock",
|
|
240
|
+
"Calendar",
|
|
241
|
+
"Database",
|
|
242
|
+
"File",
|
|
243
|
+
"FileText",
|
|
244
|
+
"ExternalLink",
|
|
245
|
+
"User",
|
|
246
|
+
"Users",
|
|
247
|
+
"Group",
|
|
248
|
+
"Building2",
|
|
249
|
+
"RefreshCw",
|
|
250
|
+
"RotateCcw",
|
|
251
|
+
"RotateCw",
|
|
252
|
+
"LogOut",
|
|
253
|
+
"KeyRound",
|
|
254
|
+
"Menu",
|
|
255
|
+
"Home",
|
|
256
|
+
"Server",
|
|
257
|
+
"Zap",
|
|
258
|
+
"Globe",
|
|
259
|
+
"HardDrive",
|
|
260
|
+
"Image",
|
|
261
|
+
"Link",
|
|
262
|
+
"Mail",
|
|
263
|
+
"MapPin",
|
|
264
|
+
"Phone",
|
|
265
|
+
"PieChart",
|
|
266
|
+
"Play",
|
|
267
|
+
"Share",
|
|
268
|
+
"Star",
|
|
269
|
+
"Tag",
|
|
270
|
+
"Target",
|
|
271
|
+
"TrendingUp",
|
|
272
|
+
"Volume2",
|
|
273
|
+
"Wifi",
|
|
274
|
+
"Circle",
|
|
275
|
+
"ChevronRightIcon",
|
|
276
|
+
"ChevronDownIcon"
|
|
277
|
+
],
|
|
197
278
|
"restrictedImports": [
|
|
198
279
|
{
|
|
199
280
|
"module": "@radix-ui/react-avatar",
|
|
@@ -297,6 +378,18 @@
|
|
|
297
378
|
},
|
|
298
379
|
"importExample": "import { formatInTimeZone, toZonedTime, fromZonedTime, getUserTimeZone } from '@jmruthers/pace-core/utils/timezone';",
|
|
299
380
|
"usageExample": "const formatted = formatInTimeZone(date, 'America/New_York', 'MMM dd, yyyy HH:mm');"
|
|
381
|
+
},
|
|
382
|
+
{
|
|
383
|
+
"module": "lucide-react",
|
|
384
|
+
"reason": "Import icons from '@jmruthers/pace-core/icons' instead of 'lucide-react' directly. pace-core provides a curated set of icons that are version-controlled and consistent across the PACE suite.",
|
|
385
|
+
"replacements": {
|
|
386
|
+
"ChevronDown": "ChevronDown (from '@jmruthers/pace-core/icons')",
|
|
387
|
+
"Edit": "Edit (from '@jmruthers/pace-core/icons')",
|
|
388
|
+
"Trash": "Trash (from '@jmruthers/pace-core/icons')",
|
|
389
|
+
"*": "All icons should be imported from '@jmruthers/pace-core/icons'"
|
|
390
|
+
},
|
|
391
|
+
"importExample": "import { ChevronDown, Edit, Trash, Plus, Search } from '@jmruthers/pace-core/icons';",
|
|
392
|
+
"usageExample": "<Button><ChevronDown className=\"w-4 h-4\" /> Click me</Button>"
|
|
300
393
|
}
|
|
301
394
|
],
|
|
302
395
|
"notes": [
|