@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
|
@@ -13,9 +13,9 @@
|
|
|
13
13
|
* for backward compatibility or standalone usage.
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
|
-
import React from 'react';
|
|
17
|
-
import {
|
|
18
|
-
import { OrganisationServiceProvider } from './services/OrganisationServiceProvider';
|
|
16
|
+
import React, { useContext } from 'react';
|
|
17
|
+
import { UnifiedAuthContext } from '../providers/services/UnifiedAuthProvider';
|
|
18
|
+
import { OrganisationServiceProvider, OrganisationServiceContext } from './services/OrganisationServiceProvider';
|
|
19
19
|
import type { OrganisationProviderProps as BaseOrganisationProviderProps } from '../types/organisation';
|
|
20
20
|
|
|
21
21
|
export interface OrganisationProviderProps extends BaseOrganisationProviderProps {
|
|
@@ -45,19 +45,29 @@ export function OrganisationProvider({
|
|
|
45
45
|
autoSelectPrimaryOrganisation,
|
|
46
46
|
onOrganisationChange
|
|
47
47
|
}: OrganisationProviderProps) {
|
|
48
|
+
// Call all hooks unconditionally at the top level
|
|
49
|
+
// Hooks must be called in the same order on every render
|
|
50
|
+
// Check if we're already inside OrganisationServiceProvider (e.g., from UnifiedAuthProvider)
|
|
51
|
+
// If so, just pass through children to avoid double-wrapping
|
|
52
|
+
const existingOrganisationService = useContext(OrganisationServiceContext);
|
|
53
|
+
|
|
48
54
|
// Get auth context from UnifiedAuthProvider
|
|
49
|
-
|
|
55
|
+
// Use useContext directly instead of useUnifiedAuth() to avoid throwing
|
|
56
|
+
// if context isn't available yet (e.g., during initial render)
|
|
57
|
+
const authContext = useContext(UnifiedAuthContext);
|
|
50
58
|
|
|
51
|
-
//
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
// If no auth context, we can't provide organisation service
|
|
56
|
-
// This might happen if used outside UnifiedAuthProvider
|
|
57
|
-
// In that case, we should probably throw an error or show a message
|
|
58
|
-
console.warn('OrganisationProvider: No auth context available. Make sure OrganisationProvider is used inside UnifiedAuthProvider.');
|
|
59
|
+
// Early return after all hooks have been called
|
|
60
|
+
if (existingOrganisationService) {
|
|
61
|
+
// We're already inside UnifiedAuthProvider which includes OrganisationServiceProvider
|
|
62
|
+
// Just pass through children - no need to wrap again
|
|
59
63
|
return <>{children}</>;
|
|
60
64
|
}
|
|
65
|
+
|
|
66
|
+
// If no auth context, we can't provide organisation service
|
|
67
|
+
// This might happen if used outside UnifiedAuthProvider
|
|
68
|
+
if (!authContext) {
|
|
69
|
+
throw new Error('OrganisationProvider must be used inside UnifiedAuthProvider, or OrganisationServiceProvider must be provided separately');
|
|
70
|
+
}
|
|
61
71
|
|
|
62
72
|
const { supabase, user, session } = authContext;
|
|
63
73
|
|
|
@@ -66,8 +76,7 @@ export function OrganisationProvider({
|
|
|
66
76
|
// are handled by the OrganisationService internally, not by the provider
|
|
67
77
|
// Note: supabase is mapped to supabaseClient for OrganisationServiceProvider
|
|
68
78
|
if (!supabase) {
|
|
69
|
-
|
|
70
|
-
return <>{children}</>;
|
|
79
|
+
throw new Error('OrganisationProvider: No supabase client available from UnifiedAuthProvider');
|
|
71
80
|
}
|
|
72
81
|
|
|
73
82
|
return (
|
|
@@ -73,16 +73,7 @@ export function EventServiceProvider({
|
|
|
73
73
|
useEffect(() => {
|
|
74
74
|
let isMounted = true;
|
|
75
75
|
|
|
76
|
-
logger.debug('EventServiceProvider', 'useEffect triggered', {
|
|
77
|
-
hasUser: !!user,
|
|
78
|
-
userId: user?.id,
|
|
79
|
-
hasSession: !!session,
|
|
80
|
-
appName,
|
|
81
|
-
isInitializing: initializingRef.current
|
|
82
|
-
});
|
|
83
|
-
|
|
84
76
|
if (initializingRef.current) {
|
|
85
|
-
logger.debug('EventServiceProvider', 'Skipping - already initializing');
|
|
86
77
|
return;
|
|
87
78
|
}
|
|
88
79
|
|
|
@@ -90,14 +81,6 @@ export function EventServiceProvider({
|
|
|
90
81
|
initializingRef.current = true;
|
|
91
82
|
|
|
92
83
|
try {
|
|
93
|
-
logger.debug('EventServiceProvider', 'Updating dependencies and initializing', {
|
|
94
|
-
hasUser: !!user,
|
|
95
|
-
userId: user?.id,
|
|
96
|
-
hasSession: !!session,
|
|
97
|
-
appName,
|
|
98
|
-
hasSelectedOrganisation: !!selectedOrganisation
|
|
99
|
-
});
|
|
100
|
-
|
|
101
84
|
// Update dependencies (now async to handle user change cleanup)
|
|
102
85
|
await eventService.updateDependencies(supabaseClient, user, session, appName, selectedOrganisation, setSelectedEventId);
|
|
103
86
|
|
|
@@ -106,19 +89,13 @@ export function EventServiceProvider({
|
|
|
106
89
|
// Re-initialize service when dependencies change
|
|
107
90
|
// Only initialize if we have a user (required for fetching events)
|
|
108
91
|
if (user && session && supabaseClient && appName) {
|
|
109
|
-
logger.debug('EventServiceProvider', 'Initializing event service');
|
|
110
92
|
await eventService.initialize().catch(error => {
|
|
111
93
|
if (isMounted) {
|
|
112
94
|
logger.error('EventServiceProvider', 'Failed to initialize event service:', error);
|
|
113
95
|
}
|
|
114
96
|
});
|
|
115
97
|
} else {
|
|
116
|
-
|
|
117
|
-
hasUser: !!user,
|
|
118
|
-
hasSession: !!session,
|
|
119
|
-
hasSupabaseClient: !!supabaseClient,
|
|
120
|
-
appName
|
|
121
|
-
});
|
|
98
|
+
// Skipping initialization - missing required dependencies
|
|
122
99
|
}
|
|
123
100
|
} finally {
|
|
124
101
|
initializingRef.current = false;
|
|
@@ -198,23 +198,10 @@ function UnifiedAuthContextProvider({
|
|
|
198
198
|
|
|
199
199
|
// App config removed - scope is now page-level only (rbac_app_pages.scope_type)
|
|
200
200
|
|
|
201
|
-
//
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
} catch (error) {
|
|
206
|
-
// EventService not available - provide fallback implementation
|
|
207
|
-
// Include subscribe method to match BaseService interface
|
|
208
|
-
eventService = {
|
|
209
|
-
getEvents: () => [],
|
|
210
|
-
getSelectedEvent: () => null,
|
|
211
|
-
isLoading: () => false,
|
|
212
|
-
getError: () => null,
|
|
213
|
-
setSelectedEvent: () => {},
|
|
214
|
-
refreshEvents: async () => {},
|
|
215
|
-
subscribe: () => () => {} // No-op subscribe/unsubscribe for fallback
|
|
216
|
-
};
|
|
217
|
-
}
|
|
201
|
+
// Call hook unconditionally - if provider is missing, it will throw
|
|
202
|
+
// Errors should be handled by error boundaries at a higher level
|
|
203
|
+
// We cannot conditionally call hooks
|
|
204
|
+
const eventService = useEventService();
|
|
218
205
|
|
|
219
206
|
// Get current auth state - these will trigger re-renders when services change
|
|
220
207
|
const currentUser = authService.getUser();
|
|
@@ -232,14 +219,6 @@ function UnifiedAuthContextProvider({
|
|
|
232
219
|
// This makes appId available early for navigation menu filtering
|
|
233
220
|
const [appId, setAppId] = useState<string | undefined>(undefined);
|
|
234
221
|
|
|
235
|
-
useEffect(() => {
|
|
236
|
-
logger.debug('UnifiedAuthContextProvider', `Rendering [AuthService ID:${authService.getInstanceId?.() || 'unknown'}]`, {
|
|
237
|
-
hasUser: !!currentUser,
|
|
238
|
-
userId: currentUser?.id,
|
|
239
|
-
hasSession: !!currentSession,
|
|
240
|
-
isAuth
|
|
241
|
-
});
|
|
242
|
-
}, [currentUser?.id, currentSession?.access_token, isAuth, authService]);
|
|
243
222
|
|
|
244
223
|
const isResolvingAppIdRef = useRef(false);
|
|
245
224
|
const resolvedAppIdRef = useRef<string | undefined>(undefined);
|
|
@@ -668,12 +647,7 @@ function EventServiceProviderWrapper({
|
|
|
668
647
|
}, []);
|
|
669
648
|
|
|
670
649
|
useEffect(() => {
|
|
671
|
-
|
|
672
|
-
hasUser: !!user,
|
|
673
|
-
userId: user?.id,
|
|
674
|
-
hasSession: !!session,
|
|
675
|
-
selectedOrganisationId: selectedOrganisation?.id
|
|
676
|
-
});
|
|
650
|
+
// Render tracking removed for performance
|
|
677
651
|
}, [user?.id, session?.access_token, selectedOrganisation?.id]);
|
|
678
652
|
|
|
679
653
|
return (
|
|
@@ -720,12 +694,6 @@ function ServiceAwareProviders({
|
|
|
720
694
|
const newUser = authService.getUser();
|
|
721
695
|
const newSession = authService.getSession();
|
|
722
696
|
|
|
723
|
-
logger.debug('ServiceAwareProviders', 'Auth service notified, updating state', {
|
|
724
|
-
hasUser: !!newUser,
|
|
725
|
-
userId: newUser?.id,
|
|
726
|
-
hasSession: !!newSession
|
|
727
|
-
});
|
|
728
|
-
|
|
729
697
|
setUserState(newUser);
|
|
730
698
|
setSessionState(newSession);
|
|
731
699
|
});
|
|
@@ -737,15 +705,6 @@ function ServiceAwareProviders({
|
|
|
737
705
|
const user = userState;
|
|
738
706
|
const session = sessionState;
|
|
739
707
|
|
|
740
|
-
// Log when user/session changes for debugging
|
|
741
|
-
useEffect(() => {
|
|
742
|
-
logger.debug('ServiceAwareProviders', `User/session state [AuthService ID:${authService.getInstanceId?.() || 'unknown'}]`, {
|
|
743
|
-
hasUser: !!user,
|
|
744
|
-
userId: user?.id,
|
|
745
|
-
hasSession: !!session,
|
|
746
|
-
sessionToken: session?.access_token ? 'present' : 'missing'
|
|
747
|
-
});
|
|
748
|
-
}, [user?.id, session?.access_token, authService]);
|
|
749
708
|
|
|
750
709
|
return (
|
|
751
710
|
<OrganisationServiceProvider
|
|
@@ -824,8 +783,6 @@ export function UnifiedAuthProvider({
|
|
|
824
783
|
note: 'Ensure you create the Supabase client once and reuse it. Creating multiple clients can cause performance issues and the "Multiple GoTrueClient instances" warning.'
|
|
825
784
|
});
|
|
826
785
|
clientRef.current = supabaseClient;
|
|
827
|
-
} else {
|
|
828
|
-
logger.debug('UnifiedAuthProvider', 'Supabase client reference is stable');
|
|
829
786
|
}
|
|
830
787
|
}, [supabaseClient]);
|
|
831
788
|
|
|
@@ -14,6 +14,9 @@ import { UnifiedAuthProvider, useUnifiedAuth } from '../UnifiedAuthProvider';
|
|
|
14
14
|
import { type SupabaseClient, type User, type Session } from '@supabase/supabase-js';
|
|
15
15
|
import { Logger, LogLevel } from '../../../utils/core/logger';
|
|
16
16
|
|
|
17
|
+
// Unmock UnifiedAuthProvider to test the real implementation
|
|
18
|
+
vi.unmock('../../../providers/services/UnifiedAuthProvider');
|
|
19
|
+
|
|
17
20
|
// Mock Supabase client
|
|
18
21
|
const createMockSupabaseClient = (): SupabaseClient => ({
|
|
19
22
|
auth: {
|
package/src/rbac/README.md
CHANGED
|
@@ -229,18 +229,18 @@ import { PermissionEnforcer } from '@jmruthers/pace-core/rbac';
|
|
|
229
229
|
|
|
230
230
|
function Dashboard() {
|
|
231
231
|
return (
|
|
232
|
-
<
|
|
232
|
+
<main>
|
|
233
233
|
<h1>Dashboard</h1>
|
|
234
234
|
|
|
235
235
|
{/* Automatic scope resolution - no manual context needed */}
|
|
236
236
|
<PermissionEnforcer
|
|
237
237
|
permissions={['read:admin']}
|
|
238
238
|
operation="admin-panel"
|
|
239
|
-
fallback={<
|
|
239
|
+
fallback={<main>Access Denied</main>}
|
|
240
240
|
>
|
|
241
241
|
<AdminPanel />
|
|
242
242
|
</PermissionEnforcer>
|
|
243
|
-
</
|
|
243
|
+
</main>
|
|
244
244
|
);
|
|
245
245
|
}
|
|
246
246
|
```
|
|
@@ -266,14 +266,14 @@ function UserActions() {
|
|
|
266
266
|
}
|
|
267
267
|
);
|
|
268
268
|
|
|
269
|
-
if (isLoading) return <
|
|
270
|
-
if (error) return <
|
|
269
|
+
if (isLoading) return <main>Loading permissions...</main>;
|
|
270
|
+
if (error) return <main>Error: {error.message}</main>;
|
|
271
271
|
|
|
272
272
|
return (
|
|
273
|
-
<
|
|
273
|
+
<section>
|
|
274
274
|
{permissions['page-1']?.includes('read') && <ReadButton />}
|
|
275
275
|
{permissions['page-1']?.includes('update') && <UpdateButton />}
|
|
276
|
-
</
|
|
276
|
+
</section>
|
|
277
277
|
);
|
|
278
278
|
}
|
|
279
279
|
```
|
|
@@ -301,13 +301,13 @@ function UserActions() {
|
|
|
301
301
|
'page-123' // optional pageId
|
|
302
302
|
);
|
|
303
303
|
|
|
304
|
-
if (isLoading) return <
|
|
305
|
-
if (error) return <
|
|
304
|
+
if (isLoading) return <main>Checking permission...</main>;
|
|
305
|
+
if (error) return <main>Error: {error.message}</main>;
|
|
306
306
|
|
|
307
307
|
return (
|
|
308
|
-
<
|
|
308
|
+
<section>
|
|
309
309
|
{can ? <AdminPanel /> : <AccessDenied />}
|
|
310
|
-
</
|
|
310
|
+
</section>
|
|
311
311
|
);
|
|
312
312
|
}
|
|
313
313
|
```
|
|
@@ -321,7 +321,7 @@ import { PermissionEnforcer, PagePermissionGuard } from '@jmruthers/pace-core/rb
|
|
|
321
321
|
|
|
322
322
|
function EventDashboard() {
|
|
323
323
|
return (
|
|
324
|
-
<
|
|
324
|
+
<main>
|
|
325
325
|
<h1>Event Dashboard</h1>
|
|
326
326
|
|
|
327
327
|
{/* Organization is automatically resolved from event context */}
|
|
@@ -338,7 +338,7 @@ function EventDashboard() {
|
|
|
338
338
|
>
|
|
339
339
|
<EventSettings />
|
|
340
340
|
</PagePermissionGuard>
|
|
341
|
-
</
|
|
341
|
+
</main>
|
|
342
342
|
);
|
|
343
343
|
}
|
|
344
344
|
```
|
|
@@ -374,7 +374,7 @@ function EventDashboard() {
|
|
|
374
374
|
```tsx
|
|
375
375
|
const { selectedOrganisationId } = useUnifiedAuth();
|
|
376
376
|
if (!selectedOrganisationId) {
|
|
377
|
-
return <
|
|
377
|
+
return <main>Please select an organisation first</main>;
|
|
378
378
|
}
|
|
379
379
|
```
|
|
380
380
|
|
|
@@ -479,14 +479,14 @@ function MyComponent() {
|
|
|
479
479
|
{ organisationId: 'org-456' }
|
|
480
480
|
);
|
|
481
481
|
|
|
482
|
-
if (isLoading) return <
|
|
483
|
-
if (error) return <
|
|
482
|
+
if (isLoading) return <main>Loading...</main>;
|
|
483
|
+
if (error) return <main>Error: {error.message}</main>;
|
|
484
484
|
|
|
485
485
|
return (
|
|
486
|
-
<
|
|
486
|
+
<section>
|
|
487
487
|
{can && <AdminPanel />}
|
|
488
488
|
{accessLevel === 'admin' && <AdminControls />}
|
|
489
|
-
</
|
|
489
|
+
</section>
|
|
490
490
|
);
|
|
491
491
|
}
|
|
492
492
|
```
|
|
@@ -498,7 +498,7 @@ import { PermissionEnforcer, PagePermissionGuard } from '@jmruthers/pace-core/rb
|
|
|
498
498
|
|
|
499
499
|
function App() {
|
|
500
500
|
return (
|
|
501
|
-
<
|
|
501
|
+
<main>
|
|
502
502
|
<PermissionEnforcer
|
|
503
503
|
permissions={['update:events']}
|
|
504
504
|
operation="event-management"
|
|
@@ -514,7 +514,7 @@ function App() {
|
|
|
514
514
|
>
|
|
515
515
|
<AdminPanel />
|
|
516
516
|
</PagePermissionGuard>
|
|
517
|
-
</
|
|
517
|
+
</main>
|
|
518
518
|
);
|
|
519
519
|
}
|
|
520
520
|
```
|