@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
|
@@ -1,60 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
} from
|
|
6
|
-
import {
|
|
7
|
-
performanceBudgetMonitor
|
|
8
|
-
} from "./chunk-FMUCXFII.js";
|
|
9
|
-
import {
|
|
10
|
-
logger
|
|
11
|
-
} from "./chunk-PWLANIRT.js";
|
|
1
|
+
import { UnifiedAuthContext, useUnifiedAuth, useOrganisations } from './chunk-FTCRZOG2.js';
|
|
2
|
+
import { performanceBudgetMonitor } from './chunk-SD6WQY43.js';
|
|
3
|
+
import { logger } from './chunk-TTRFSOKR.js';
|
|
4
|
+
import React3, { createContext, useContext, Component, useMemo, useState, useEffect, useCallback } from 'react';
|
|
5
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
6
|
+
import { createClient } from '@supabase/supabase-js';
|
|
12
7
|
|
|
13
|
-
// src/hooks/useEvents.ts
|
|
14
|
-
import { useMemo, useRef } from "react";
|
|
15
|
-
function useEvents() {
|
|
16
|
-
const eventService = useEventService();
|
|
17
|
-
const rawEvents = eventService.getEvents();
|
|
18
|
-
const selectedEvent = eventService.getSelectedEvent();
|
|
19
|
-
const isLoading = eventService.isLoading();
|
|
20
|
-
const error = eventService.getError();
|
|
21
|
-
const prevEventsRef = useRef([]);
|
|
22
|
-
const prevEventsIdsRef = useRef("");
|
|
23
|
-
const currentEventsIds = rawEvents.map((e) => e.event_id || e.id).join(",");
|
|
24
|
-
const eventsChanged = currentEventsIds !== prevEventsIdsRef.current;
|
|
25
|
-
if (eventsChanged) {
|
|
26
|
-
prevEventsRef.current = rawEvents;
|
|
27
|
-
prevEventsIdsRef.current = currentEventsIds;
|
|
28
|
-
}
|
|
29
|
-
const events = useMemo(() => {
|
|
30
|
-
return prevEventsRef.current;
|
|
31
|
-
}, [currentEventsIds]);
|
|
32
|
-
const setSelectedEventCallback = useMemo(
|
|
33
|
-
() => (event) => eventService.setSelectedEvent(event),
|
|
34
|
-
[eventService]
|
|
35
|
-
);
|
|
36
|
-
const refreshEventsCallback = useMemo(
|
|
37
|
-
() => () => eventService.refreshEvents(),
|
|
38
|
-
[eventService]
|
|
39
|
-
);
|
|
40
|
-
const clearEventSelectionCallback = useMemo(
|
|
41
|
-
() => () => eventService.clearEventSelection(),
|
|
42
|
-
[eventService]
|
|
43
|
-
);
|
|
44
|
-
return useMemo(() => ({
|
|
45
|
-
events,
|
|
46
|
-
selectedEvent,
|
|
47
|
-
isLoading,
|
|
48
|
-
error,
|
|
49
|
-
setSelectedEvent: setSelectedEventCallback,
|
|
50
|
-
refreshEvents: refreshEventsCallback,
|
|
51
|
-
clearEventSelection: clearEventSelectionCallback
|
|
52
|
-
}), [events, selectedEvent?.event_id, isLoading, error?.message, setSelectedEventCallback, refreshEventsCallback, clearEventSelectionCallback]);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
// src/components/ErrorBoundary/ErrorBoundaryContext.tsx
|
|
56
|
-
import { createContext, useContext } from "react";
|
|
57
|
-
import { jsx } from "react/jsx-runtime";
|
|
58
8
|
var ErrorBoundaryContext = createContext(void 0);
|
|
59
9
|
function ErrorBoundaryProvider({
|
|
60
10
|
children,
|
|
@@ -68,10 +18,6 @@ function ErrorBoundaryProvider({
|
|
|
68
18
|
function useErrorBoundaryContext() {
|
|
69
19
|
return useContext(ErrorBoundaryContext);
|
|
70
20
|
}
|
|
71
|
-
|
|
72
|
-
// src/components/ErrorBoundary/ErrorBoundary.tsx
|
|
73
|
-
import { Component } from "react";
|
|
74
|
-
import { jsx as jsx2, jsxs } from "react/jsx-runtime";
|
|
75
21
|
var ErrorBoundary = class extends Component {
|
|
76
22
|
constructor(props) {
|
|
77
23
|
super(props);
|
|
@@ -147,20 +93,20 @@ var ErrorBoundary = class extends Component {
|
|
|
147
93
|
if (fallback) {
|
|
148
94
|
return fallback;
|
|
149
95
|
}
|
|
150
|
-
return /* @__PURE__ */
|
|
96
|
+
return /* @__PURE__ */ jsx(
|
|
151
97
|
"div",
|
|
152
98
|
{
|
|
153
99
|
role: "alert",
|
|
154
100
|
className: "p-6 bg-destructive/10 border border-destructive/20 rounded-lg",
|
|
155
101
|
"data-error-boundary": errorId,
|
|
156
102
|
children: /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-3", children: [
|
|
157
|
-
/* @__PURE__ */
|
|
103
|
+
/* @__PURE__ */ jsx("div", { className: "flex-shrink-0", children: /* @__PURE__ */ jsx("svg", { className: "w-5 h-5 text-destructive", viewBox: "0 0 20 20", fill: "currentColor", children: /* @__PURE__ */ jsx("path", { fillRule: "evenodd", d: "M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7 4a1 1 0 11-2 0 1 1 0 012 0zm-1-9a1 1 0 00-1 1v4a1 1 0 102 0V6a1 1 0 00-1-1z", clipRule: "evenodd" }) }) }),
|
|
158
104
|
/* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-0", children: [
|
|
159
105
|
/* @__PURE__ */ jsxs("h3", { className: "text-destructive", children: [
|
|
160
106
|
"Error in ",
|
|
161
107
|
componentName
|
|
162
108
|
] }),
|
|
163
|
-
/* @__PURE__ */
|
|
109
|
+
/* @__PURE__ */ jsx("p", { className: "text-destructive/80", children: this.state.error?.message || "An unexpected error occurred." }),
|
|
164
110
|
enableRetry && retryCount < maxRetries && /* @__PURE__ */ jsxs("div", { className: "flex gap-3 mb-4", children: [
|
|
165
111
|
/* @__PURE__ */ jsxs(
|
|
166
112
|
"button",
|
|
@@ -176,7 +122,7 @@ var ErrorBoundary = class extends Component {
|
|
|
176
122
|
]
|
|
177
123
|
}
|
|
178
124
|
),
|
|
179
|
-
/* @__PURE__ */
|
|
125
|
+
/* @__PURE__ */ jsx(
|
|
180
126
|
"button",
|
|
181
127
|
{
|
|
182
128
|
onClick: () => window.location.reload(),
|
|
@@ -186,8 +132,8 @@ var ErrorBoundary = class extends Component {
|
|
|
186
132
|
)
|
|
187
133
|
] }),
|
|
188
134
|
retryCount >= maxRetries && /* @__PURE__ */ jsxs("div", { className: "mb-4 p-3 bg-acc-50 border border-acc-200 rounded-md", children: [
|
|
189
|
-
/* @__PURE__ */
|
|
190
|
-
/* @__PURE__ */
|
|
135
|
+
/* @__PURE__ */ jsx("p", { className: "text-acc-800", children: "Maximum retry attempts reached. Please reload the page or contact support." }),
|
|
136
|
+
/* @__PURE__ */ jsx(
|
|
191
137
|
"button",
|
|
192
138
|
{
|
|
193
139
|
onClick: () => window.location.reload(),
|
|
@@ -197,7 +143,7 @@ var ErrorBoundary = class extends Component {
|
|
|
197
143
|
)
|
|
198
144
|
] }),
|
|
199
145
|
import.meta.env.MODE === "development" && this.state.error && /* @__PURE__ */ jsxs("details", { className: "text-sm text-destructive/70", children: [
|
|
200
|
-
/* @__PURE__ */
|
|
146
|
+
/* @__PURE__ */ jsx("summary", { className: "cursor-pointer font-medium mb-2", children: "Error Details (Development)" }),
|
|
201
147
|
/* @__PURE__ */ jsxs("div", { className: "bg-destructive/5 p-3 rounded border", children: [
|
|
202
148
|
/* @__PURE__ */ jsxs("p", { className: "font-mono", children: [
|
|
203
149
|
"Error ID: ",
|
|
@@ -217,21 +163,13 @@ var ErrorBoundary = class extends Component {
|
|
|
217
163
|
return this.props.children;
|
|
218
164
|
}
|
|
219
165
|
};
|
|
220
|
-
|
|
221
|
-
// src/components/ErrorBoundary/index.ts
|
|
222
|
-
import React3 from "react";
|
|
223
166
|
var ErrorBoundary2 = React3.forwardRef((props, ref) => {
|
|
224
167
|
const context = useErrorBoundaryContext();
|
|
225
168
|
const globalErrorHandler = context?.defaultErrorHandler;
|
|
226
169
|
return React3.createElement(ErrorBoundary, { ...props, ref, _globalErrorHandler: globalErrorHandler });
|
|
227
170
|
});
|
|
228
171
|
ErrorBoundary2.displayName = "ErrorBoundary";
|
|
229
|
-
|
|
230
|
-
// src/components/PublicLayout/PublicPageProvider.tsx
|
|
231
|
-
import { createContext as createContext2, useContext as useContext2, useMemo as useMemo2 } from "react";
|
|
232
|
-
import { createClient } from "@supabase/supabase-js";
|
|
233
|
-
import { jsx as jsx3 } from "react/jsx-runtime";
|
|
234
|
-
var PublicPageContext = createContext2(void 0);
|
|
172
|
+
var PublicPageContext = createContext(void 0);
|
|
235
173
|
function PublicPageProvider({ children, appName }) {
|
|
236
174
|
const getEnvVar = (key) => {
|
|
237
175
|
if (typeof import.meta !== "undefined" && import.meta.env) {
|
|
@@ -245,7 +183,7 @@ function PublicPageProvider({ children, appName }) {
|
|
|
245
183
|
};
|
|
246
184
|
const supabaseUrl = getEnvVar("VITE_SUPABASE_URL") || getEnvVar("NEXT_PUBLIC_SUPABASE_URL") || null;
|
|
247
185
|
const supabaseKey = getEnvVar("VITE_SUPABASE_PUBLISHABLE_KEY") || getEnvVar("NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY") || getEnvVar("VITE_SUPABASE_ANON_KEY") || getEnvVar("NEXT_PUBLIC_SUPABASE_ANON_KEY") || null;
|
|
248
|
-
const supabase =
|
|
186
|
+
const supabase = useMemo(() => {
|
|
249
187
|
if (!supabaseUrl || !supabaseKey) {
|
|
250
188
|
logger.warn("PublicPageProvider", "Missing Supabase environment variables. Please ensure VITE_SUPABASE_URL and VITE_SUPABASE_PUBLISHABLE_KEY are set in your environment.");
|
|
251
189
|
return null;
|
|
@@ -262,29 +200,29 @@ function PublicPageProvider({ children, appName }) {
|
|
|
262
200
|
supabaseKey
|
|
263
201
|
}
|
|
264
202
|
};
|
|
265
|
-
return /* @__PURE__ */
|
|
203
|
+
return /* @__PURE__ */ jsx(PublicPageContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx(ErrorBoundary2, { componentName: "PublicPageProvider", children }) });
|
|
266
204
|
}
|
|
267
205
|
function usePublicPageContext() {
|
|
268
|
-
const context =
|
|
206
|
+
const context = useContext(PublicPageContext);
|
|
269
207
|
if (!context) {
|
|
270
208
|
throw new Error("usePublicPageContext must be used within a PublicPageProvider");
|
|
271
209
|
}
|
|
272
210
|
return context;
|
|
273
211
|
}
|
|
274
212
|
function useIsPublicPage() {
|
|
275
|
-
const context =
|
|
213
|
+
const context = useContext(PublicPageContext);
|
|
276
214
|
return context !== void 0;
|
|
277
215
|
}
|
|
278
|
-
|
|
279
|
-
// src/hooks/useAppConfig.ts
|
|
280
|
-
import { useMemo as useMemo3, useContext as useContext3 } from "react";
|
|
281
216
|
function useAppConfig() {
|
|
282
217
|
const isPublicPage = useIsPublicPage();
|
|
283
|
-
const publicPageContext =
|
|
218
|
+
const publicPageContext = useContext(PublicPageContext);
|
|
284
219
|
const hasPublicContext = publicPageContext !== void 0;
|
|
285
220
|
const contextAppName = publicPageContext?.appName || null;
|
|
221
|
+
const authContext = useContext(UnifiedAuthContext);
|
|
222
|
+
const authAppName = authContext?.appName;
|
|
286
223
|
const getNodeEnvVar = (key) => typeof process !== "undefined" && process.env ? process.env[key] : void 0;
|
|
287
|
-
|
|
224
|
+
const publicAppName = useMemo(() => {
|
|
225
|
+
if (!isPublicPage) return null;
|
|
288
226
|
const getAppName = () => {
|
|
289
227
|
if (!hasPublicContext) {
|
|
290
228
|
return "PACE";
|
|
@@ -305,27 +243,17 @@ function useAppConfig() {
|
|
|
305
243
|
}
|
|
306
244
|
return "PACE";
|
|
307
245
|
};
|
|
308
|
-
return
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
}), [appName]);
|
|
319
|
-
} catch (error) {
|
|
320
|
-
return useMemo3(() => ({
|
|
321
|
-
appName: contextAppName || getNodeEnvVar("VITE_APP_NAME") || getNodeEnvVar("NEXT_PUBLIC_APP_NAME") || "PACE",
|
|
322
|
-
isLoading: false
|
|
323
|
-
}), [contextAppName]);
|
|
324
|
-
}
|
|
246
|
+
return getAppName();
|
|
247
|
+
}, [isPublicPage, contextAppName, hasPublicContext]);
|
|
248
|
+
const authenticatedAppName = useMemo(() => {
|
|
249
|
+
if (isPublicPage) return null;
|
|
250
|
+
return authAppName || "PACE";
|
|
251
|
+
}, [isPublicPage, authAppName]);
|
|
252
|
+
return useMemo(() => ({
|
|
253
|
+
appName: publicAppName || authenticatedAppName || "PACE",
|
|
254
|
+
isLoading: false
|
|
255
|
+
}), [publicAppName, authenticatedAppName]);
|
|
325
256
|
}
|
|
326
|
-
|
|
327
|
-
// src/hooks/useOrganisationSecurity.ts
|
|
328
|
-
import { useCallback, useMemo as useMemo4, useEffect, useState } from "react";
|
|
329
257
|
var useOrganisationSecurity = () => {
|
|
330
258
|
const { user, session, supabase } = useUnifiedAuth();
|
|
331
259
|
const { selectedOrganisation, getUserRole, validateOrganisationAccess: validateAccess } = useOrganisations();
|
|
@@ -351,7 +279,7 @@ var useOrganisationSecurity = () => {
|
|
|
351
279
|
};
|
|
352
280
|
checkSuperAdmin();
|
|
353
281
|
}, [user, session, supabase]);
|
|
354
|
-
const superAdminContext =
|
|
282
|
+
const superAdminContext = useMemo(() => {
|
|
355
283
|
return {
|
|
356
284
|
isSuperAdmin,
|
|
357
285
|
hasGlobalAccess: isSuperAdmin,
|
|
@@ -403,7 +331,7 @@ var useOrganisationSecurity = () => {
|
|
|
403
331
|
const targetOrgId = orgId || selectedOrganisation?.id;
|
|
404
332
|
if (!targetOrgId || !user) return false;
|
|
405
333
|
try {
|
|
406
|
-
const { isPermittedCached } = await import(
|
|
334
|
+
const { isPermittedCached } = await import('./api-Y4MQWOFW.js');
|
|
407
335
|
const scope = {
|
|
408
336
|
organisationId: targetOrgId,
|
|
409
337
|
eventId: user.user_metadata?.eventId || user.app_metadata?.eventId,
|
|
@@ -426,7 +354,7 @@ var useOrganisationSecurity = () => {
|
|
|
426
354
|
const targetOrgId = orgId || selectedOrganisation?.id;
|
|
427
355
|
if (!targetOrgId || !user) return [];
|
|
428
356
|
try {
|
|
429
|
-
const { getPermissionMap } = await import(
|
|
357
|
+
const { getPermissionMap } = await import('./api-Y4MQWOFW.js');
|
|
430
358
|
const scope = {
|
|
431
359
|
organisationId: targetOrgId,
|
|
432
360
|
eventId: user.user_metadata?.eventId || user.app_metadata?.eventId,
|
|
@@ -447,7 +375,7 @@ var useOrganisationSecurity = () => {
|
|
|
447
375
|
if (!user || !selectedOrganisation) return;
|
|
448
376
|
try {
|
|
449
377
|
if (selectedOrganisation.id) {
|
|
450
|
-
const { emitAuditEvent } = await import(
|
|
378
|
+
const { emitAuditEvent } = await import('./audit-MYQXYZFU.js');
|
|
451
379
|
await emitAuditEvent({
|
|
452
380
|
type: "permission_check",
|
|
453
381
|
userId: user.id,
|
|
@@ -504,15 +432,4 @@ var useOrganisationSecurity = () => {
|
|
|
504
432
|
};
|
|
505
433
|
};
|
|
506
434
|
|
|
507
|
-
export {
|
|
508
|
-
useEvents,
|
|
509
|
-
ErrorBoundaryProvider,
|
|
510
|
-
ErrorBoundary2 as ErrorBoundary,
|
|
511
|
-
PublicPageContext,
|
|
512
|
-
PublicPageProvider,
|
|
513
|
-
usePublicPageContext,
|
|
514
|
-
useIsPublicPage,
|
|
515
|
-
useAppConfig,
|
|
516
|
-
useOrganisationSecurity
|
|
517
|
-
};
|
|
518
|
-
//# sourceMappingURL=chunk-OEWDTMG7.js.map
|
|
435
|
+
export { ErrorBoundary2 as ErrorBoundary, ErrorBoundaryProvider, PublicPageContext, PublicPageProvider, useAppConfig, useIsPublicPage, useOrganisationSecurity, usePublicPageContext };
|
|
@@ -1,10 +1,3 @@
|
|
|
1
|
-
// src/utils/core/cn.ts
|
|
2
|
-
import { clsx } from "clsx";
|
|
3
|
-
import { twMerge } from "tailwind-merge";
|
|
4
|
-
function cn(...inputs) {
|
|
5
|
-
return twMerge(clsx(inputs));
|
|
6
|
-
}
|
|
7
|
-
|
|
8
1
|
// src/utils/validation/htmlSanitization.ts
|
|
9
2
|
function sanitizeHtml(html) {
|
|
10
3
|
if (!html || typeof html !== "string") {
|
|
@@ -59,10 +52,4 @@ function renderSafeHtml(html, options = {}) {
|
|
|
59
52
|
};
|
|
60
53
|
}
|
|
61
54
|
|
|
62
|
-
export {
|
|
63
|
-
cn,
|
|
64
|
-
sanitizeHtml,
|
|
65
|
-
validateHtml,
|
|
66
|
-
renderSafeHtml
|
|
67
|
-
};
|
|
68
|
-
//# sourceMappingURL=chunk-M43Y4SSO.js.map
|
|
55
|
+
export { renderSafeHtml, sanitizeHtml, validateHtml };
|
|
@@ -85,29 +85,4 @@ var PermissionErrorCode = /* @__PURE__ */ ((PermissionErrorCode2) => {
|
|
|
85
85
|
return PermissionErrorCode2;
|
|
86
86
|
})(PermissionErrorCode || {});
|
|
87
87
|
|
|
88
|
-
export {
|
|
89
|
-
createUserId,
|
|
90
|
-
createSessionToken,
|
|
91
|
-
createPermissionString,
|
|
92
|
-
createRequestId,
|
|
93
|
-
createOrganisationId,
|
|
94
|
-
createEventId,
|
|
95
|
-
createAppId,
|
|
96
|
-
createPageId,
|
|
97
|
-
isUserId,
|
|
98
|
-
isSessionToken,
|
|
99
|
-
isPermissionString,
|
|
100
|
-
isRequestId,
|
|
101
|
-
isOrganisationId,
|
|
102
|
-
isEventId,
|
|
103
|
-
isAppId,
|
|
104
|
-
isPageId,
|
|
105
|
-
assertUserId,
|
|
106
|
-
assertOrganisationId,
|
|
107
|
-
assertEventId,
|
|
108
|
-
assertAppId,
|
|
109
|
-
assertPageId,
|
|
110
|
-
AuthErrorCode,
|
|
111
|
-
PermissionErrorCode
|
|
112
|
-
};
|
|
113
|
-
//# sourceMappingURL=chunk-QXHPKYJV.js.map
|
|
88
|
+
export { AuthErrorCode, PermissionErrorCode, assertAppId, assertEventId, assertOrganisationId, assertPageId, assertUserId, createAppId, createEventId, createOrganisationId, createPageId, createPermissionString, createRequestId, createSessionToken, createUserId, isAppId, isEventId, isOrganisationId, isPageId, isPermissionString, isRequestId, isSessionToken, isUserId };
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { Button } from './chunk-7TYHROIV.js';
|
|
2
|
+
import { ShieldX } from 'lucide-react';
|
|
3
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
4
|
+
|
|
5
|
+
function AccessDenied({
|
|
6
|
+
message,
|
|
7
|
+
resource,
|
|
8
|
+
operation,
|
|
9
|
+
onGoBack,
|
|
10
|
+
onSignOut,
|
|
11
|
+
className = "",
|
|
12
|
+
showSignOut = false
|
|
13
|
+
}) {
|
|
14
|
+
const defaultMessage = message || (resource && operation ? `You don't have permission to ${operation} ${resource}.` : "You don't have permission to access this page.");
|
|
15
|
+
const handleGoBack = () => {
|
|
16
|
+
if (onGoBack) {
|
|
17
|
+
onGoBack();
|
|
18
|
+
} else {
|
|
19
|
+
window.history.back();
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
const handleSignOut = () => {
|
|
23
|
+
if (onSignOut) {
|
|
24
|
+
onSignOut();
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
return /* @__PURE__ */ jsx(
|
|
28
|
+
"main",
|
|
29
|
+
{
|
|
30
|
+
className: `flex flex-col items-center justify-center min-h-[400px] p-8 text-center ${className}`,
|
|
31
|
+
role: "alert",
|
|
32
|
+
"aria-live": "polite",
|
|
33
|
+
children: /* @__PURE__ */ jsxs("section", { className: "max-w-md", children: [
|
|
34
|
+
/* @__PURE__ */ jsx("div", { className: "mb-6 flex justify-center", children: /* @__PURE__ */ jsx(ShieldX, { className: "size-16 text-acc-500", "aria-hidden": "true" }) }),
|
|
35
|
+
/* @__PURE__ */ jsx("h2", { className: "text-2xl font-semibold text-sec-900 mb-3", children: "Access Denied" }),
|
|
36
|
+
/* @__PURE__ */ jsx("p", { className: "text-sec-600 mb-6", children: defaultMessage }),
|
|
37
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col sm:flex-row gap-3 justify-center", children: [
|
|
38
|
+
/* @__PURE__ */ jsx(
|
|
39
|
+
Button,
|
|
40
|
+
{
|
|
41
|
+
onClick: handleGoBack,
|
|
42
|
+
variant: "default",
|
|
43
|
+
"aria-label": "Go back to previous page",
|
|
44
|
+
children: "Go Back"
|
|
45
|
+
}
|
|
46
|
+
),
|
|
47
|
+
showSignOut && onSignOut && /* @__PURE__ */ jsx(
|
|
48
|
+
Button,
|
|
49
|
+
{
|
|
50
|
+
onClick: handleSignOut,
|
|
51
|
+
variant: "outline",
|
|
52
|
+
"aria-label": "Sign out of your account",
|
|
53
|
+
children: "Sign Out"
|
|
54
|
+
}
|
|
55
|
+
)
|
|
56
|
+
] })
|
|
57
|
+
] })
|
|
58
|
+
}
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export { AccessDenied };
|
|
@@ -1,9 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
} from "./chunk-PWLANIRT.js";
|
|
1
|
+
import { createLogger } from './chunk-TTRFSOKR.js';
|
|
2
|
+
import { useRef, useEffect } from 'react';
|
|
4
3
|
|
|
5
|
-
// src/hooks/useComponentPerformance.ts
|
|
6
|
-
import { useEffect, useRef } from "react";
|
|
7
4
|
var log = createLogger("useComponentPerformance");
|
|
8
5
|
function useComponentPerformance({
|
|
9
6
|
componentName,
|
|
@@ -31,7 +28,4 @@ function useComponentPerformance({
|
|
|
31
28
|
};
|
|
32
29
|
}
|
|
33
30
|
|
|
34
|
-
export {
|
|
35
|
-
useComponentPerformance
|
|
36
|
-
};
|
|
37
|
-
//# sourceMappingURL=chunk-E66EQZE6.js.map
|
|
31
|
+
export { useComponentPerformance };
|