@jmruthers/pace-core 0.6.5 → 0.6.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +104 -0
- package/README.md +5 -403
- package/audit-tool/00-dependencies.cjs +394 -0
- package/audit-tool/audits/01-pace-core-compliance.cjs +556 -0
- package/audit-tool/audits/02-project-structure.cjs +255 -0
- package/audit-tool/audits/03-architecture.cjs +196 -0
- package/audit-tool/audits/04-code-quality.cjs +149 -0
- package/audit-tool/audits/05-styling.cjs +224 -0
- package/audit-tool/audits/06-security-rbac.cjs +544 -0
- package/audit-tool/audits/07-api-tech-stack.cjs +301 -0
- package/audit-tool/audits/08-testing-documentation.cjs +202 -0
- package/audit-tool/audits/09-operations.cjs +208 -0
- package/audit-tool/index.cjs +291 -0
- package/audit-tool/utils/code-utils.cjs +218 -0
- package/audit-tool/utils/file-utils.cjs +230 -0
- package/audit-tool/utils/report-utils.cjs +241 -0
- package/core-usage-manifest.json +93 -0
- package/cursor-rules/00-standards-overview.mdc +156 -0
- package/cursor-rules/01-pace-core-compliance.mdc +586 -0
- package/cursor-rules/02-project-structure.mdc +42 -4
- package/cursor-rules/{03-solid-principles.mdc → 03-architecture.mdc} +126 -10
- package/cursor-rules/04-code-quality.mdc +419 -0
- package/cursor-rules/{08-markup-quality.mdc → 05-styling.mdc} +104 -34
- package/cursor-rules/06-security-rbac.mdc +518 -0
- package/cursor-rules/07-api-tech-stack.mdc +377 -0
- package/cursor-rules/08-testing-documentation.mdc +324 -0
- package/cursor-rules/09-operations.mdc +365 -0
- package/dist/{AuthService-Cb34EQs3.d.ts → AuthService-DmfO5rGS.d.ts} +10 -0
- package/dist/DataTable-7PMH7XN7.js +15 -0
- package/dist/{DataTable-BMRU8a1j.d.ts → DataTable-DRUIgtUH.d.ts} +1 -1
- package/dist/{PublicPageProvider-QTFVrL-Z.d.ts → PublicPageProvider-DlsCaR5v.d.ts} +33 -72
- package/dist/UnifiedAuthProvider-ZT6TIGM7.js +7 -0
- package/dist/api-Y4MQWOFW.js +4 -0
- package/dist/audit-MYQXYZFU.js +3 -0
- package/dist/{chunk-DGUM43GV.js → chunk-3RG5ZIWI.js} +1 -4
- package/dist/{chunk-QXHPKYJV.js → chunk-4SXLQIZO.js} +1 -26
- package/dist/{chunk-UPPMRMYG.js → chunk-5X4QLXRG.js} +73 -151
- package/dist/chunk-6F3IILHI.js +62 -0
- package/dist/{chunk-E66EQZE6.js → chunk-6GLLNA6U.js} +3 -9
- package/dist/{chunk-ZSAAAMVR.js → chunk-6QYDGKQY.js} +1 -4
- package/dist/{chunk-FMUCXFII.js → chunk-7ILTDCL2.js} +9 -5
- package/dist/{chunk-M43Y4SSO.js → chunk-A3W6LW53.js} +15 -13
- package/dist/{chunk-63FOKYGO.js → chunk-AHU7G2R5.js} +2 -11
- package/dist/{chunk-HU2C6SSC.js → chunk-BM4CQ5P3.js} +606 -559
- package/dist/chunk-C7NSAPTL.js +1 -0
- package/dist/{chunk-J36DSWQK.js → chunk-FEJLJNWA.js} +7 -41
- package/dist/{chunk-IHB5DR3H.js → chunk-FTCRZOG2.js} +188 -387
- package/dist/{chunk-G37KK66H.js → chunk-FYHN4DD5.js} +60 -19
- package/dist/chunk-GHYHJTYV.js +994 -0
- package/dist/{chunk-VBXEHIUJ.js → chunk-HF6O3O37.js} +6 -88
- package/dist/{chunk-FFQEQTNW.js → chunk-IUBRCBSY.js} +134 -45
- package/dist/{chunk-6COVEUS7.js → chunk-JGWDVX64.js} +983 -1034
- package/dist/{chunk-RGAWHO7N.js → chunk-L4XMVJKY.js} +77 -222
- package/dist/chunk-MBADTM7L.js +64 -0
- package/dist/{chunk-M7MPQISP.js → chunk-OJ4SKRSV.js} +3 -16
- package/dist/{chunk-IVOFDYWT.js → chunk-Q7Q7V5NV.js} +2109 -1604
- package/dist/{chunk-JGRYX5UX.js → chunk-S7DKJPLT.js} +29 -58
- package/dist/{chunk-PWLANIRT.js → chunk-TTRFSOKR.js} +1 -7
- package/dist/{chunk-5DRSZLL2.js → chunk-UH3NTO3F.js} +1 -6
- package/dist/{chunk-NTM7ZSB6.js → chunk-VBCS3DUA.js} +261 -168
- package/dist/{chunk-EFN2EIMK.js → chunk-ZFYPMX46.js} +271 -87
- package/dist/{chunk-L4OXEN46.js → chunk-ZKAWKYT4.js} +10 -24
- package/dist/components.d.ts +7 -5
- package/dist/components.js +46 -257
- package/dist/{database.generated-CzIvgcPu.d.ts → database.generated-CcnC_DRc.d.ts} +4795 -3691
- package/dist/eslint-rules/index.cjs +35 -0
- package/{src/eslint-rules/pace-core-compliance.cjs → dist/eslint-rules/rules/01-pace-core-compliance.cjs} +234 -235
- package/dist/eslint-rules/rules/04-code-quality.cjs +290 -0
- package/dist/eslint-rules/rules/05-styling.cjs +61 -0
- package/dist/eslint-rules/rules/06-security-rbac.cjs +806 -0
- package/dist/eslint-rules/rules/07-api-tech-stack.cjs +263 -0
- package/dist/eslint-rules/rules/08-testing.cjs +94 -0
- package/dist/eslint-rules/utils/helpers.cjs +42 -0
- package/dist/eslint-rules/utils/manifest-loader.cjs +75 -0
- package/dist/hooks.d.ts +6 -6
- package/dist/hooks.js +62 -172
- package/dist/icons/index.d.ts +1 -0
- package/dist/icons/index.js +1 -0
- package/dist/index.d.ts +12 -11
- package/dist/index.js +67 -660
- package/dist/providers.d.ts +2 -2
- package/dist/providers.js +8 -35
- package/dist/rbac/eslint-rules.d.ts +46 -44
- package/dist/rbac/eslint-rules.js +7 -4
- package/dist/rbac/index.d.ts +109 -586
- package/dist/rbac/index.js +14 -207
- package/dist/styles/index.js +2 -12
- package/dist/theming/runtime.d.ts +14 -1
- package/dist/theming/runtime.js +3 -19
- package/dist/{timezone-CHhWg6b4.d.ts → timezone-BZe_eUxx.d.ts} +175 -1
- package/dist/{types-CkbwOr4Y.d.ts → types-DXstZpNI.d.ts} +4 -17
- package/dist/types-t9H8qKRw.d.ts +55 -0
- package/dist/types.d.ts +1 -1
- package/dist/types.js +7 -94
- package/dist/{usePublicRouteParams-ClnV4tnv.d.ts → usePublicRouteParams-MamNgwqe.d.ts} +20 -20
- package/dist/utils.d.ts +24 -117
- package/dist/utils.js +54 -392
- package/docs/README.md +17 -7
- package/docs/api/README.md +4 -402
- package/docs/api/modules.md +301 -871
- package/docs/api-reference/components.md +21 -21
- package/docs/api-reference/deprecated.md +31 -6
- package/docs/api-reference/hooks.md +80 -80
- package/docs/api-reference/rpc-functions.md +78 -3
- package/docs/api-reference/types.md +1 -1
- package/docs/api-reference/utilities.md +1 -1
- package/docs/architecture/README.md +1 -1
- package/docs/core-concepts/events.md +3 -3
- package/docs/core-concepts/organisations.md +6 -6
- package/docs/core-concepts/permissions.md +6 -6
- package/docs/documentation-index.md +12 -18
- package/docs/getting-started/cursor-rules.md +3 -23
- package/docs/getting-started/dependencies.md +650 -0
- package/docs/getting-started/documentation-index.md +1 -1
- package/docs/getting-started/examples/README.md +4 -4
- package/docs/getting-started/examples/full-featured-app.md +1 -1
- package/docs/getting-started/faq.md +2 -2
- package/docs/getting-started/installation-guide.md +20 -7
- package/docs/getting-started/quick-reference.md +4 -4
- package/docs/getting-started/quick-start.md +23 -12
- package/docs/implementation-guides/authentication.md +15 -15
- package/docs/implementation-guides/component-styling.md +1 -1
- package/docs/implementation-guides/data-tables.md +126 -33
- package/docs/implementation-guides/datatable-rbac-usage.md +1 -1
- package/docs/implementation-guides/dynamic-colors.md +3 -3
- package/docs/implementation-guides/file-upload-storage.md +2 -2
- package/docs/implementation-guides/hierarchical-datatable.md +40 -60
- package/docs/implementation-guides/inactivity-tracking.md +3 -3
- package/docs/implementation-guides/large-datasets.md +3 -2
- package/docs/implementation-guides/organisation-security.md +2 -2
- package/docs/implementation-guides/performance.md +2 -2
- package/docs/implementation-guides/permission-enforcement.md +5 -1
- package/docs/migration/V0.3.44_organisation-context-timing-fix.md +1 -1
- package/docs/migration/V0.4.0_rbac-migration.md +6 -6
- package/docs/rbac/MIGRATION_GUIDE.md +819 -0
- package/docs/rbac/RBAC_CONTRACT.md +724 -0
- package/docs/rbac/README.md +17 -8
- package/docs/rbac/advanced-patterns.md +6 -6
- package/docs/rbac/api-reference.md +20 -20
- package/docs/rbac/edge-functions-guide.md +376 -0
- package/docs/rbac/event-based-apps.md +3 -3
- package/docs/rbac/examples.md +41 -41
- package/docs/rbac/getting-started.md +37 -37
- package/docs/rbac/performance.md +1 -1
- package/docs/rbac/quick-start.md +52 -52
- package/docs/rbac/secure-client-protection.md +1 -35
- package/docs/rbac/troubleshooting.md +1 -1
- package/docs/security/README.md +5 -5
- package/docs/standards/0-standards-overview.md +220 -0
- package/docs/standards/1-pace-core-compliance-standards.md +986 -0
- package/docs/standards/2-project-structure-standards.md +949 -0
- package/docs/standards/3-architecture-standards.md +606 -0
- package/docs/standards/4-code-quality-standards.md +728 -0
- package/docs/standards/5-styling-standards.md +348 -0
- package/docs/standards/{07-rbac-and-rls-standard.md → 6-security-rbac-standards.md} +269 -66
- package/docs/standards/7-api-tech-stack-standards.md +662 -0
- package/docs/standards/8-testing-documentation-standards.md +401 -0
- package/docs/standards/9-operations-standards.md +1102 -0
- package/docs/standards/README.md +185 -57
- package/docs/troubleshooting/README.md +4 -4
- package/docs/troubleshooting/common-issues.md +2 -2
- package/docs/troubleshooting/debugging.md +9 -9
- package/docs/troubleshooting/migration.md +4 -4
- package/docs/troubleshooting/organisation-context-setup.md +42 -19
- package/eslint-config-pace-core.cjs +33 -6
- package/package.json +35 -23
- package/scripts/install-cursor-rules.cjs +25 -6
- package/scripts/install-eslint-config.cjs +284 -0
- package/src/__tests__/fixtures/supabase.ts +1 -1
- package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +3 -3
- package/src/__tests__/helpers/__tests__/optimized-test-setup.test.ts +1 -1
- package/src/__tests__/helpers/__tests__/supabaseMock.test.ts +1 -1
- package/src/__tests__/helpers/__tests__/test-providers.test.tsx +2 -2
- package/src/__tests__/helpers/__tests__/test-utils.test.tsx +13 -13
- package/src/__tests__/helpers/component-test-utils.tsx +1 -1
- package/src/__tests__/helpers/supabaseMock.ts +2 -2
- package/src/__tests__/integration/UserProfile.test.tsx +14 -14
- package/src/__tests__/public-recipe-view.test.ts +38 -9
- package/src/__tests__/rbac/PagePermissionGuard.test.tsx +6 -6
- package/src/__tests__/templates/accessibility.test.template.tsx +9 -9
- package/src/__tests__/templates/component.test.template.tsx +18 -15
- package/src/components/Button/Button.tsx +5 -1
- package/src/components/Calendar/Calendar.tsx +201 -47
- package/src/components/ContextSelector/ContextSelector.tsx +106 -119
- package/src/components/DataTable/AUDIT_REPORT.md +293 -0
- package/src/components/DataTable/__tests__/DataTableCore.test.tsx +10 -2
- package/src/components/DataTable/__tests__/a11y.basic.test.tsx +10 -4
- package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +9 -9
- package/src/components/DataTable/components/ColumnFilter.tsx +63 -74
- package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +43 -41
- package/src/components/DataTable/components/DataTableCore.tsx +186 -13
- package/src/components/DataTable/components/DataTableErrorBoundary.tsx +9 -11
- package/src/components/DataTable/components/DataTableLayout.tsx +35 -21
- package/src/components/DataTable/components/EditFields.tsx +23 -3
- package/src/components/DataTable/components/EditableRow.tsx +12 -9
- package/src/components/DataTable/components/EmptyState.tsx +10 -9
- package/src/components/DataTable/components/FilterRow.tsx +2 -4
- package/src/components/DataTable/components/ImportModal.tsx +124 -126
- package/src/components/DataTable/components/LoadingState.tsx +5 -6
- package/src/components/DataTable/components/RowComponent.tsx +12 -0
- package/src/components/DataTable/components/SortIndicator.tsx +50 -0
- package/src/components/DataTable/components/__tests__/COVERAGE_NOTE.md +4 -4
- package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +23 -82
- package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +37 -9
- package/src/components/DataTable/components/__tests__/EmptyState.test.tsx +7 -4
- package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +12 -4
- package/src/components/DataTable/components/__tests__/LoadingState.test.tsx +41 -27
- package/src/components/DataTable/components/hooks/usePermissionTracking.ts +0 -4
- package/src/components/DataTable/components/index.ts +2 -1
- package/src/components/DataTable/hooks/__tests__/useDataTableState.test.ts +51 -47
- package/src/components/DataTable/hooks/useDataTablePermissions.ts +24 -21
- package/src/components/DataTable/hooks/useDataTableState.ts +125 -9
- package/src/components/DataTable/hooks/useTableColumns.ts +40 -2
- package/src/components/DataTable/hooks/useTableHandlers.ts +11 -0
- package/src/components/DataTable/types.ts +5 -18
- package/src/components/DataTable/utils/a11yUtils.ts +17 -0
- package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +2 -1
- package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.tsx +11 -15
- package/src/components/DateTimeField/DateTimeField.tsx +10 -9
- package/src/components/Dialog/Dialog.test.tsx +128 -104
- package/src/components/Dialog/Dialog.tsx +742 -24
- package/src/components/ErrorBoundary/ErrorBoundary.tsx +77 -79
- package/src/components/FileDisplay/FileDisplay.test.tsx +4 -2
- package/src/components/FileDisplay/FileDisplay.tsx +23 -17
- package/src/components/FileUpload/FileUpload.test.tsx +52 -14
- package/src/components/FileUpload/FileUpload.tsx +112 -130
- package/src/components/Form/Form.test.tsx +6 -8
- package/src/components/Form/Form.tsx +365 -4
- package/src/components/NavigationMenu/NavigationMenu.test.tsx +14 -13
- package/src/components/NavigationMenu/useNavigationFiltering.ts +11 -21
- package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +6 -4
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +11 -15
- package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +108 -61
- package/src/components/PaceLoginPage/PaceLoginPage.tsx +27 -3
- package/src/components/Progress/Progress.tsx +2 -4
- package/src/components/ProtectedRoute/ProtectedRoute.tsx +8 -8
- package/src/components/Select/Select.tsx +109 -98
- package/src/components/Select/types.ts +4 -1
- package/src/components/UserMenu/UserMenu.tsx +9 -6
- package/src/hooks/__tests__/ServiceHooks.test.tsx +16 -16
- package/src/hooks/__tests__/hooks.integration.test.tsx +55 -57
- package/src/hooks/__tests__/useAppConfig.unit.test.ts +129 -67
- package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +97 -97
- package/src/hooks/__tests__/usePublicEvent.simple.test.ts +149 -67
- package/src/hooks/__tests__/usePublicEvent.test.ts +149 -79
- package/src/hooks/__tests__/usePublicEvent.unit.test.ts +158 -109
- package/src/hooks/__tests__/useSessionDraft.test.ts +163 -0
- package/src/hooks/__tests__/useSessionRestoration.unit.test.tsx +10 -5
- package/src/hooks/public/usePublicEvent.ts +67 -195
- package/src/hooks/public/usePublicEventLogo.test.ts +70 -17
- package/src/hooks/public/usePublicEventLogo.ts +24 -14
- package/src/hooks/public/usePublicFileDisplay.ts +2 -2
- package/src/hooks/public/usePublicRouteParams.ts +5 -5
- package/src/hooks/useAppConfig.ts +28 -26
- package/src/hooks/useEventTheme.test.ts +217 -239
- package/src/hooks/useEventTheme.ts +16 -28
- package/src/hooks/useFileDisplay.ts +2 -2
- package/src/hooks/useOrganisationPermissions.ts +5 -7
- package/src/hooks/useQueryCache.ts +0 -1
- package/src/hooks/useSessionDraft.ts +380 -0
- package/src/hooks/useSessionRestoration.ts +3 -1
- package/src/icons/index.ts +27 -0
- package/src/index.ts +5 -0
- package/src/providers/OrganisationProvider.tsx +23 -14
- package/src/providers/UnifiedAuthProvider.smoke.test.tsx +21 -21
- package/src/providers/__tests__/AuthProvider.test.tsx +21 -21
- package/src/providers/__tests__/EventProvider.test.tsx +61 -61
- package/src/providers/__tests__/InactivityProvider.test.tsx +56 -56
- package/src/providers/__tests__/OrganisationProvider.test.tsx +75 -75
- package/src/providers/__tests__/ProviderLifecycle.test.tsx +37 -37
- package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +103 -103
- package/src/providers/services/EventServiceProvider.tsx +1 -24
- package/src/providers/services/UnifiedAuthProvider.tsx +5 -48
- package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +7 -7
- package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +13 -10
- package/src/rbac/__tests__/adapters.comprehensive.test.tsx +7 -457
- package/src/rbac/__tests__/auth-rbac.e2e.test.tsx +33 -7
- package/src/rbac/adapters.tsx +7 -295
- package/src/rbac/api.test.ts +44 -56
- package/src/rbac/api.ts +10 -17
- package/src/rbac/cache-invalidation.ts +0 -1
- package/src/rbac/compliance/index.ts +10 -0
- package/src/rbac/compliance/pattern-detector.ts +553 -0
- package/src/rbac/compliance/runtime-compliance.ts +22 -0
- package/src/rbac/components/AccessDenied.tsx +150 -0
- package/src/rbac/components/NavigationGuard.tsx +12 -20
- package/src/rbac/components/PagePermissionGuard.tsx +4 -24
- package/src/rbac/components/__tests__/NavigationGuard.test.tsx +21 -8
- package/src/rbac/components/index.ts +3 -41
- package/src/rbac/eslint-rules.js +1 -1
- package/src/rbac/hooks/index.ts +0 -3
- package/src/rbac/hooks/permissions/index.ts +0 -3
- package/src/rbac/hooks/permissions/useAccessLevel.ts +4 -8
- package/src/rbac/hooks/usePermissions.ts +0 -3
- package/src/rbac/hooks/useResolvedScope.test.ts +57 -47
- package/src/rbac/hooks/useResolvedScope.ts +58 -140
- package/src/rbac/hooks/useResourcePermissions.test.ts +124 -38
- package/src/rbac/hooks/useResourcePermissions.ts +139 -48
- package/src/rbac/hooks/useRoleManagement.test.ts +65 -22
- package/src/rbac/hooks/useRoleManagement.ts +147 -19
- package/src/rbac/hooks/useSecureSupabase.ts +4 -8
- package/src/rbac/index.ts +7 -9
- package/src/rbac/utils/contextValidator.ts +9 -7
- package/src/services/AuthService.ts +130 -18
- package/src/services/EventService.ts +4 -97
- package/src/services/InactivityService.ts +16 -0
- package/src/services/OrganisationService.ts +7 -44
- package/src/services/__tests__/OrganisationService.test.ts +26 -8
- package/src/services/base/BaseService.ts +0 -3
- package/src/styles/core.css +7 -0
- package/src/theming/__tests__/parseEventColours.test.ts +9 -3
- package/src/theming/parseEventColours.ts +22 -10
- package/src/types/database.generated.ts +4733 -3809
- package/src/utils/__tests__/lazyLoad.unit.test.tsx +42 -39
- package/src/utils/__tests__/organisationContext.unit.test.ts +9 -10
- package/src/utils/context/organisationContext.test.ts +13 -28
- package/src/utils/context/organisationContext.ts +21 -52
- package/src/utils/dynamic/dynamicUtils.ts +1 -1
- package/src/utils/file-reference/index.ts +39 -15
- package/src/utils/formatting/formatDateTime.test.ts +3 -2
- package/src/utils/google-places/loadGoogleMapsScript.ts +29 -4
- package/src/utils/index.ts +4 -1
- package/src/utils/persistence/__tests__/keyDerivation.test.ts +135 -0
- package/src/utils/persistence/__tests__/sensitiveFieldDetection.test.ts +123 -0
- package/src/utils/persistence/keyDerivation.ts +304 -0
- package/src/utils/persistence/sensitiveFieldDetection.ts +212 -0
- package/src/utils/security/secureStorage.ts +5 -5
- package/src/utils/storage/README.md +1 -1
- package/src/utils/storage/helpers.ts +3 -3
- package/src/utils/supabase/createBaseClient.ts +147 -0
- package/src/utils/timezone/timezone.test.ts +1 -2
- package/src/utils/timezone/timezone.ts +1 -1
- package/src/utils/validation/csrf.ts +4 -4
- package/cursor-rules/00-pace-core-compliance.mdc +0 -331
- package/cursor-rules/01-standards-compliance.mdc +0 -244
- package/cursor-rules/04-testing-standards.mdc +0 -268
- package/cursor-rules/05-bug-reports-and-features.mdc +0 -246
- package/cursor-rules/06-code-quality.mdc +0 -309
- package/cursor-rules/07-tech-stack-compliance.mdc +0 -214
- package/cursor-rules/CHANGELOG.md +0 -119
- package/cursor-rules/README.md +0 -192
- package/dist/DataTable-AOVNCPTX.js +0 -175
- package/dist/DataTable-AOVNCPTX.js.map +0 -1
- package/dist/UnifiedAuthProvider-4SBX4LU5.js +0 -18
- package/dist/UnifiedAuthProvider-4SBX4LU5.js.map +0 -1
- package/dist/api-O6HTBX5Y.js +0 -52
- package/dist/api-O6HTBX5Y.js.map +0 -1
- package/dist/audit-V53FV5AG.js +0 -17
- package/dist/audit-V53FV5AG.js.map +0 -1
- package/dist/chunk-5DRSZLL2.js.map +0 -1
- package/dist/chunk-63FOKYGO.js.map +0 -1
- package/dist/chunk-6COVEUS7.js.map +0 -1
- package/dist/chunk-AFVQODI2.js +0 -263
- package/dist/chunk-AFVQODI2.js.map +0 -1
- package/dist/chunk-DGUM43GV.js.map +0 -1
- package/dist/chunk-E66EQZE6.js.map +0 -1
- package/dist/chunk-EFN2EIMK.js.map +0 -1
- package/dist/chunk-FFQEQTNW.js.map +0 -1
- package/dist/chunk-FMUCXFII.js.map +0 -1
- package/dist/chunk-G37KK66H.js.map +0 -1
- package/dist/chunk-G7QEZTYQ.js +0 -2053
- package/dist/chunk-G7QEZTYQ.js.map +0 -1
- package/dist/chunk-HU2C6SSC.js.map +0 -1
- package/dist/chunk-IHB5DR3H.js.map +0 -1
- package/dist/chunk-IVOFDYWT.js.map +0 -1
- package/dist/chunk-J36DSWQK.js.map +0 -1
- package/dist/chunk-JGRYX5UX.js.map +0 -1
- package/dist/chunk-KQCRWDSA.js +0 -1
- package/dist/chunk-KQCRWDSA.js.map +0 -1
- package/dist/chunk-L4OXEN46.js.map +0 -1
- package/dist/chunk-LMC26NLJ.js +0 -84
- package/dist/chunk-LMC26NLJ.js.map +0 -1
- package/dist/chunk-M43Y4SSO.js.map +0 -1
- package/dist/chunk-M7MPQISP.js.map +0 -1
- package/dist/chunk-NTM7ZSB6.js.map +0 -1
- package/dist/chunk-PWLANIRT.js.map +0 -1
- package/dist/chunk-QXHPKYJV.js.map +0 -1
- package/dist/chunk-RGAWHO7N.js.map +0 -1
- package/dist/chunk-UPPMRMYG.js.map +0 -1
- package/dist/chunk-VBXEHIUJ.js.map +0 -1
- package/dist/chunk-ZSAAAMVR.js.map +0 -1
- package/dist/components.js.map +0 -1
- package/dist/contextValidator-5OGXSPKS.js +0 -9
- package/dist/contextValidator-5OGXSPKS.js.map +0 -1
- package/dist/eslint-rules/pace-core-compliance.cjs +0 -510
- package/dist/hooks.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/providers.js.map +0 -1
- package/dist/rbac/eslint-rules.js.map +0 -1
- package/dist/rbac/index.js.map +0 -1
- package/dist/styles/index.js.map +0 -1
- package/dist/theming/runtime.js.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/utils.js.map +0 -1
- package/docs/best-practices/README.md +0 -472
- package/docs/best-practices/accessibility.md +0 -601
- package/docs/best-practices/common-patterns.md +0 -516
- package/docs/best-practices/deployment.md +0 -1103
- package/docs/best-practices/performance.md +0 -1328
- package/docs/best-practices/security.md +0 -940
- package/docs/best-practices/testing.md +0 -1034
- package/docs/rbac/compliance/compliance-guide.md +0 -544
- package/docs/standards/01-architecture-standard.md +0 -44
- package/docs/standards/02-api-and-rpc-standard.md +0 -39
- package/docs/standards/03-component-standard.md +0 -32
- package/docs/standards/04-code-style-standard.md +0 -32
- package/docs/standards/05-security-standard.md +0 -44
- package/docs/standards/06-testing-and-docs-standard.md +0 -29
- package/docs/standards/pace-core-compliance.md +0 -432
- package/scripts/audit/core/checks/accessibility.cjs +0 -197
- package/scripts/audit/core/checks/api-usage.cjs +0 -191
- package/scripts/audit/core/checks/bundle.cjs +0 -142
- package/scripts/audit/core/checks/compliance.cjs +0 -2706
- package/scripts/audit/core/checks/config.cjs +0 -54
- package/scripts/audit/core/checks/coverage.cjs +0 -84
- package/scripts/audit/core/checks/dependencies.cjs +0 -994
- package/scripts/audit/core/checks/documentation.cjs +0 -268
- package/scripts/audit/core/checks/environment.cjs +0 -116
- package/scripts/audit/core/checks/error-handling.cjs +0 -340
- package/scripts/audit/core/checks/forms.cjs +0 -172
- package/scripts/audit/core/checks/heuristics.cjs +0 -68
- package/scripts/audit/core/checks/hooks.cjs +0 -334
- package/scripts/audit/core/checks/imports.cjs +0 -244
- package/scripts/audit/core/checks/performance.cjs +0 -325
- package/scripts/audit/core/checks/routes.cjs +0 -117
- package/scripts/audit/core/checks/state.cjs +0 -130
- package/scripts/audit/core/checks/structure.cjs +0 -65
- package/scripts/audit/core/checks/style.cjs +0 -584
- package/scripts/audit/core/checks/testing.cjs +0 -122
- package/scripts/audit/core/checks/typescript.cjs +0 -61
- package/scripts/audit/core/scanner.cjs +0 -199
- package/scripts/audit/core/utils.cjs +0 -137
- package/scripts/audit/index.cjs +0 -223
- package/scripts/audit/reporters/console.cjs +0 -151
- package/scripts/audit/reporters/json.cjs +0 -54
- package/scripts/audit/reporters/markdown.cjs +0 -124
- package/scripts/audit-consuming-app.cjs +0 -86
- package/src/components/DataTable/components/DataTableBody.tsx +0 -454
- package/src/components/DataTable/components/DraggableColumnHeader.tsx +0 -156
- package/src/components/DataTable/components/ExpandButton.tsx +0 -113
- package/src/components/DataTable/components/GroupHeader.tsx +0 -54
- package/src/components/DataTable/components/ViewRowModal.tsx +0 -68
- package/src/components/DataTable/components/VirtualizedDataTable.tsx +0 -525
- package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +0 -462
- package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +0 -393
- package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +0 -476
- package/src/components/DataTable/components/__tests__/VirtualizedDataTable.test.tsx +0 -128
- package/src/components/DataTable/core/DataTableContext.tsx +0 -216
- package/src/components/DataTable/core/__tests__/DataTableContext.test.tsx +0 -136
- package/src/components/DataTable/hooks/__tests__/useColumnReordering.test.ts +0 -570
- package/src/components/DataTable/hooks/useColumnReordering.ts +0 -123
- package/src/components/DataTable/utils/debugTools.ts +0 -514
- package/src/eslint-rules/pace-core-compliance.js +0 -638
- package/src/rbac/components/EnhancedNavigationMenu.test.tsx +0 -555
- package/src/rbac/components/EnhancedNavigationMenu.tsx +0 -293
- package/src/rbac/components/NavigationProvider.test.tsx +0 -481
- package/src/rbac/components/NavigationProvider.tsx +0 -345
- package/src/rbac/components/PagePermissionProvider.test.tsx +0 -476
- package/src/rbac/components/PagePermissionProvider.tsx +0 -279
- package/src/rbac/components/PermissionEnforcer.tsx +0 -312
- package/src/rbac/components/RoleBasedRouter.tsx +0 -440
- package/src/rbac/components/SecureDataProvider.test.tsx +0 -543
- package/src/rbac/components/SecureDataProvider.tsx +0 -339
- package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +0 -620
- package/src/rbac/components/__tests__/NavigationProvider.test.tsx +0 -726
- package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +0 -661
- package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +0 -881
- package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +0 -783
- package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +0 -645
- package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +0 -659
- package/src/rbac/hooks/permissions/useCachedPermissions.ts +0 -79
- package/src/rbac/hooks/permissions/useHasAllPermissions.ts +0 -90
- package/src/rbac/hooks/permissions/useHasAnyPermission.ts +0 -90
|
@@ -7,16 +7,16 @@
|
|
|
7
7
|
* Comprehensive tests for the useEventTheme hook covering all critical functionality.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
import { renderHook } from '@testing-library/react';
|
|
10
|
+
import { renderHook, render } from '@testing-library/react';
|
|
11
11
|
import { vi, describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
12
|
+
import React from 'react';
|
|
12
13
|
import { useEventTheme } from './useEventTheme';
|
|
13
|
-
import {
|
|
14
|
+
import { EventServiceContext } from '../providers/services/EventServiceProvider';
|
|
14
15
|
import { applyPalette, clearPalette } from '../theming/runtime';
|
|
16
|
+
import { assertOrganisationId } from '../types/core';
|
|
15
17
|
|
|
16
|
-
//
|
|
17
|
-
|
|
18
|
-
useEvents: vi.fn()
|
|
19
|
-
}));
|
|
18
|
+
// Don't mock EventServiceProvider - we'll mock React.useContext directly instead
|
|
19
|
+
// This ensures we use the real EventServiceContext for comparison
|
|
20
20
|
|
|
21
21
|
vi.mock('../theming/runtime', () => ({
|
|
22
22
|
applyPalette: vi.fn(),
|
|
@@ -49,217 +49,216 @@ vi.mock('react-router-dom', () => ({
|
|
|
49
49
|
}));
|
|
50
50
|
|
|
51
51
|
describe('useEventTheme', () => {
|
|
52
|
-
const mockUseEvents = vi.mocked(useEvents);
|
|
53
52
|
const mockApplyPalette = vi.mocked(applyPalette);
|
|
54
53
|
const mockClearPalette = vi.mocked(clearPalette);
|
|
54
|
+
|
|
55
|
+
// Mock EventService with getSelectedEvent method
|
|
56
|
+
const createMockEventService = (selectedEvent: any) => ({
|
|
57
|
+
getSelectedEvent: () => selectedEvent,
|
|
58
|
+
getEvents: () => [],
|
|
59
|
+
isLoading: () => false,
|
|
60
|
+
getError: () => null,
|
|
61
|
+
subscribe: () => () => {},
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
// Helper to create a wrapper component that provides EventServiceContext
|
|
65
|
+
const createWrapper = (selectedEvent: any) => {
|
|
66
|
+
return ({ children }: { children: React.ReactNode }) => {
|
|
67
|
+
return React.createElement(
|
|
68
|
+
EventServiceContext.Provider,
|
|
69
|
+
{
|
|
70
|
+
value: {
|
|
71
|
+
eventService: createMockEventService(selectedEvent) as any,
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
children
|
|
75
|
+
);
|
|
76
|
+
};
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
// Helper to set up EventServiceContext mock for a test (legacy, for tests that need it)
|
|
80
|
+
const setupEventServiceMock = (selectedEvent: any) => {
|
|
81
|
+
// For now, we'll use the wrapper approach instead
|
|
82
|
+
// This is more reliable than mocking useContext
|
|
83
|
+
return createWrapper(selectedEvent);
|
|
84
|
+
};
|
|
55
85
|
|
|
56
86
|
beforeEach(() => {
|
|
57
87
|
vi.clearAllMocks();
|
|
88
|
+
// Don't restore mocks here - let each test set up its own mock
|
|
89
|
+
// This prevents clearPalette from being called unexpectedly
|
|
58
90
|
});
|
|
59
91
|
|
|
60
92
|
afterEach(() => {
|
|
93
|
+
vi.restoreAllMocks();
|
|
61
94
|
vi.clearAllMocks();
|
|
62
95
|
});
|
|
63
96
|
|
|
64
97
|
describe('When no event is selected', () => {
|
|
65
98
|
it('clears the palette', () => {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
isLoading: false,
|
|
70
|
-
} as any);
|
|
71
|
-
|
|
72
|
-
renderHook(() => useEventTheme());
|
|
73
|
-
|
|
99
|
+
// Use wrapper with null event
|
|
100
|
+
const wrapper = createWrapper(null);
|
|
101
|
+
renderHook(() => useEventTheme(), { wrapper });
|
|
74
102
|
expect(mockClearPalette).toHaveBeenCalled();
|
|
75
103
|
});
|
|
76
104
|
});
|
|
77
105
|
|
|
78
106
|
describe('When event has no colours', () => {
|
|
79
107
|
it('clears the palette', () => {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
events: [],
|
|
87
|
-
isLoading: false,
|
|
88
|
-
} as any);
|
|
89
|
-
|
|
90
|
-
renderHook(() => useEventTheme());
|
|
91
|
-
|
|
108
|
+
const wrapper = createWrapper({
|
|
109
|
+
id: 'event-1',
|
|
110
|
+
event_name: 'Test Event',
|
|
111
|
+
event_colours: null
|
|
112
|
+
});
|
|
113
|
+
renderHook(() => useEventTheme(), { wrapper });
|
|
92
114
|
expect(mockClearPalette).toHaveBeenCalled();
|
|
93
115
|
});
|
|
94
116
|
|
|
95
117
|
it('clears palette when event_colours is not an object', () => {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
events: [],
|
|
103
|
-
isLoading: false,
|
|
104
|
-
} as any);
|
|
105
|
-
|
|
106
|
-
renderHook(() => useEventTheme());
|
|
107
|
-
|
|
118
|
+
const wrapper = createWrapper({
|
|
119
|
+
id: 'event-1',
|
|
120
|
+
event_name: 'Test Event',
|
|
121
|
+
event_colours: 'invalid'
|
|
122
|
+
});
|
|
123
|
+
renderHook(() => useEventTheme(), { wrapper });
|
|
108
124
|
expect(mockClearPalette).toHaveBeenCalled();
|
|
109
125
|
});
|
|
110
126
|
});
|
|
111
127
|
|
|
112
128
|
describe('When event has partial palette', () => {
|
|
113
129
|
it('applies palette when at least one palette has properties', () => {
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
renderHook(() => useEventTheme());
|
|
130
|
+
const selectedEvent = {
|
|
131
|
+
id: 'event-1',
|
|
132
|
+
event_name: 'Test Event',
|
|
133
|
+
event_colours: {
|
|
134
|
+
main: { '500': '#0ea5e9' },
|
|
135
|
+
sec: {},
|
|
136
|
+
acc: {}
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
// Use wrapper to provide context
|
|
141
|
+
const wrapper = createWrapper(selectedEvent);
|
|
142
|
+
renderHook(() => useEventTheme(), { wrapper });
|
|
129
143
|
|
|
130
|
-
|
|
144
|
+
// With valid event colours, applyPalette should be called
|
|
131
145
|
expect(mockApplyPalette).toHaveBeenCalled();
|
|
132
146
|
});
|
|
133
147
|
});
|
|
134
148
|
|
|
135
149
|
describe('When event has valid colours', () => {
|
|
136
150
|
it('applies the palette with main colours', () => {
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
renderHook(() => useEventTheme());
|
|
151
|
+
const selectedEvent = {
|
|
152
|
+
id: 'event-1',
|
|
153
|
+
event_name: 'Test Event',
|
|
154
|
+
event_colours: {
|
|
155
|
+
main: {
|
|
156
|
+
'50': '#f0f9ff',
|
|
157
|
+
'100': '#e0f2fe'
|
|
158
|
+
},
|
|
159
|
+
sec: {},
|
|
160
|
+
acc: {}
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
// Use wrapper to provide context
|
|
165
|
+
const wrapper = createWrapper(selectedEvent);
|
|
166
|
+
renderHook(() => useEventTheme(), { wrapper });
|
|
155
167
|
|
|
156
|
-
// parseAndNormalizeEventColours
|
|
157
|
-
expect(mockClearPalette).not.toHaveBeenCalled();
|
|
168
|
+
// parseAndNormalizeEventColours should return non-null for valid event_colours
|
|
158
169
|
expect(mockApplyPalette).toHaveBeenCalled();
|
|
159
|
-
const callArgs = mockApplyPalette.mock.calls[
|
|
170
|
+
const callArgs = mockApplyPalette.mock.calls[mockApplyPalette.mock.calls.length - 1][0];
|
|
160
171
|
expect(callArgs.main['50']).toBe('#f0f9ff');
|
|
161
172
|
expect(callArgs.main['100']).toBe('#e0f2fe');
|
|
162
|
-
// sec and acc will
|
|
173
|
+
// sec and acc will be empty objects (not null) since they're explicitly defined as {}
|
|
163
174
|
expect(callArgs.sec).toBeDefined();
|
|
164
175
|
expect(callArgs.acc).toBeDefined();
|
|
165
176
|
});
|
|
166
177
|
|
|
167
178
|
it('applies the palette with secondary colours', () => {
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
},
|
|
181
|
-
events: [],
|
|
182
|
-
isLoading: false,
|
|
183
|
-
} as any);
|
|
179
|
+
const wrapper = createWrapper({
|
|
180
|
+
id: 'event-1',
|
|
181
|
+
event_name: 'Test Event',
|
|
182
|
+
event_colours: {
|
|
183
|
+
main: {},
|
|
184
|
+
sec: {
|
|
185
|
+
'500': '#3b82f6',
|
|
186
|
+
'600': '#2563eb'
|
|
187
|
+
},
|
|
188
|
+
acc: {}
|
|
189
|
+
}
|
|
190
|
+
});
|
|
184
191
|
|
|
185
|
-
renderHook(() => useEventTheme());
|
|
192
|
+
renderHook(() => useEventTheme(), { wrapper });
|
|
186
193
|
|
|
187
|
-
// parseAndNormalizeEventColours
|
|
194
|
+
// parseAndNormalizeEventColours only includes explicitly defined shades
|
|
188
195
|
expect(mockApplyPalette).toHaveBeenCalled();
|
|
189
|
-
const callArgs = mockApplyPalette.mock.calls[
|
|
196
|
+
const callArgs = mockApplyPalette.mock.calls[mockApplyPalette.mock.calls.length - 1][0];
|
|
190
197
|
expect(callArgs.sec['500']).toBe('#3b82f6');
|
|
191
198
|
expect(callArgs.sec['600']).toBe('#2563eb');
|
|
192
|
-
// main and acc will
|
|
199
|
+
// main and acc will be empty objects (not null) since they're explicitly defined as {}
|
|
193
200
|
expect(callArgs.main).toBeDefined();
|
|
194
201
|
expect(callArgs.acc).toBeDefined();
|
|
195
202
|
});
|
|
196
203
|
|
|
197
204
|
it('applies the palette with accent colours', () => {
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
'600': '#dc2626'
|
|
208
|
-
}
|
|
205
|
+
const wrapper = createWrapper({
|
|
206
|
+
id: 'event-1',
|
|
207
|
+
event_name: 'Test Event',
|
|
208
|
+
event_colours: {
|
|
209
|
+
main: {},
|
|
210
|
+
sec: {},
|
|
211
|
+
acc: {
|
|
212
|
+
'500': '#ef4444',
|
|
213
|
+
'600': '#dc2626'
|
|
209
214
|
}
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
isLoading: false,
|
|
213
|
-
} as any);
|
|
215
|
+
}
|
|
216
|
+
});
|
|
214
217
|
|
|
215
|
-
renderHook(() => useEventTheme());
|
|
218
|
+
renderHook(() => useEventTheme(), { wrapper });
|
|
216
219
|
|
|
217
|
-
// parseAndNormalizeEventColours
|
|
220
|
+
// parseAndNormalizeEventColours only includes explicitly defined shades
|
|
218
221
|
expect(mockApplyPalette).toHaveBeenCalled();
|
|
219
|
-
const callArgs = mockApplyPalette.mock.calls[
|
|
222
|
+
const callArgs = mockApplyPalette.mock.calls[mockApplyPalette.mock.calls.length - 1][0];
|
|
220
223
|
expect(callArgs.acc['500']).toBe('#ef4444');
|
|
221
224
|
expect(callArgs.acc['600']).toBe('#dc2626');
|
|
222
|
-
// main and sec will
|
|
225
|
+
// main and sec will be empty objects (not null) since they're explicitly defined as {}
|
|
223
226
|
expect(callArgs.main).toBeDefined();
|
|
224
227
|
expect(callArgs.sec).toBeDefined();
|
|
225
228
|
});
|
|
226
229
|
|
|
227
230
|
it('applies the full palette with all colors', () => {
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
'600': '#d97706'
|
|
244
|
-
}
|
|
231
|
+
const wrapper = createWrapper({
|
|
232
|
+
id: 'event-1',
|
|
233
|
+
event_name: 'Test Event',
|
|
234
|
+
event_colours: {
|
|
235
|
+
main: {
|
|
236
|
+
'500': '#0ea5e9',
|
|
237
|
+
'600': '#0284c7'
|
|
238
|
+
},
|
|
239
|
+
sec: {
|
|
240
|
+
'500': '#8b5cf6',
|
|
241
|
+
'600': '#7c3aed'
|
|
242
|
+
},
|
|
243
|
+
acc: {
|
|
244
|
+
'500': '#f59e0b',
|
|
245
|
+
'600': '#d97706'
|
|
245
246
|
}
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
isLoading: false,
|
|
249
|
-
} as any);
|
|
247
|
+
}
|
|
248
|
+
});
|
|
250
249
|
|
|
251
|
-
renderHook(() => useEventTheme());
|
|
250
|
+
renderHook(() => useEventTheme(), { wrapper });
|
|
252
251
|
|
|
253
|
-
// parseAndNormalizeEventColours
|
|
252
|
+
// parseAndNormalizeEventColours only includes explicitly defined shades
|
|
254
253
|
expect(mockApplyPalette).toHaveBeenCalled();
|
|
255
|
-
const callArgs = mockApplyPalette.mock.calls[
|
|
254
|
+
const callArgs = mockApplyPalette.mock.calls[mockApplyPalette.mock.calls.length - 1][0];
|
|
256
255
|
expect(callArgs.main['500']).toBe('#0ea5e9');
|
|
257
256
|
expect(callArgs.main['600']).toBe('#0284c7');
|
|
258
257
|
expect(callArgs.sec['500']).toBe('#8b5cf6');
|
|
259
258
|
expect(callArgs.sec['600']).toBe('#7c3aed');
|
|
260
259
|
expect(callArgs.acc['500']).toBe('#f59e0b');
|
|
261
260
|
expect(callArgs.acc['600']).toBe('#d97706');
|
|
262
|
-
// All palettes will
|
|
261
|
+
// All palettes will be defined (may be empty objects if no shades were provided)
|
|
263
262
|
expect(callArgs.main).toBeDefined();
|
|
264
263
|
expect(callArgs.sec).toBeDefined();
|
|
265
264
|
expect(callArgs.acc).toBeDefined();
|
|
@@ -270,102 +269,87 @@ describe('useEventTheme', () => {
|
|
|
270
269
|
it('handles errors when applying palette', () => {
|
|
271
270
|
vi.clearAllMocks();
|
|
272
271
|
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
},
|
|
283
|
-
events: [],
|
|
284
|
-
isLoading: false,
|
|
285
|
-
} as any);
|
|
272
|
+
const wrapper = createWrapper({
|
|
273
|
+
id: 'event-1',
|
|
274
|
+
event_name: 'Test Event',
|
|
275
|
+
event_colours: {
|
|
276
|
+
main: { '500': '#0ea5e9' },
|
|
277
|
+
sec: {},
|
|
278
|
+
acc: {}
|
|
279
|
+
}
|
|
280
|
+
});
|
|
286
281
|
|
|
287
282
|
mockApplyPalette.mockImplementation(() => {
|
|
288
283
|
throw new Error('Palette application failed');
|
|
289
284
|
});
|
|
290
285
|
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
);
|
|
286
|
+
// The hook should not throw - errors are caught silently
|
|
287
|
+
expect(() => {
|
|
288
|
+
renderHook(() => useEventTheme(), { wrapper });
|
|
289
|
+
}).not.toThrow();
|
|
290
|
+
|
|
291
|
+
// Verify that applyPalette was called (even though it threw)
|
|
292
|
+
expect(mockApplyPalette).toHaveBeenCalled();
|
|
298
293
|
});
|
|
299
294
|
});
|
|
300
295
|
|
|
301
296
|
describe('Event changes', () => {
|
|
302
297
|
it('updates palette when event changes', () => {
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
},
|
|
313
|
-
events: [],
|
|
314
|
-
isLoading: false,
|
|
315
|
-
} as any);
|
|
298
|
+
const firstEvent = {
|
|
299
|
+
id: 'event-1',
|
|
300
|
+
event_name: 'First Event',
|
|
301
|
+
event_colours: {
|
|
302
|
+
main: { '500': '#0ea5e9' },
|
|
303
|
+
sec: {},
|
|
304
|
+
acc: {}
|
|
305
|
+
}
|
|
306
|
+
};
|
|
316
307
|
|
|
317
|
-
const
|
|
308
|
+
const wrapper1 = createWrapper(firstEvent);
|
|
309
|
+
const { rerender } = renderHook(() => useEventTheme(), { wrapper: wrapper1 });
|
|
318
310
|
|
|
319
|
-
// parseAndNormalizeEventColours
|
|
311
|
+
// parseAndNormalizeEventColours only includes explicitly defined shades
|
|
320
312
|
expect(mockApplyPalette).toHaveBeenCalled();
|
|
321
|
-
const firstCallArgs = mockApplyPalette.mock.calls[
|
|
313
|
+
const firstCallArgs = mockApplyPalette.mock.calls[mockApplyPalette.mock.calls.length - 1][0];
|
|
322
314
|
expect(firstCallArgs.main['500']).toBe('#0ea5e9');
|
|
323
315
|
expect(firstCallArgs.sec).toBeDefined();
|
|
324
316
|
expect(firstCallArgs.acc).toBeDefined();
|
|
325
317
|
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
},
|
|
336
|
-
events: [],
|
|
337
|
-
isLoading: false,
|
|
338
|
-
} as any);
|
|
318
|
+
const secondEvent = {
|
|
319
|
+
id: 'event-2',
|
|
320
|
+
event_name: 'Second Event',
|
|
321
|
+
event_colours: {
|
|
322
|
+
main: { '500': '#8b5cf6' },
|
|
323
|
+
sec: {},
|
|
324
|
+
acc: {}
|
|
325
|
+
}
|
|
326
|
+
};
|
|
339
327
|
|
|
328
|
+
const wrapper2 = createWrapper(secondEvent);
|
|
329
|
+
// Re-render with new wrapper
|
|
340
330
|
rerender();
|
|
331
|
+
// Note: rerender doesn't change the wrapper, so we need to render again with new wrapper
|
|
332
|
+
renderHook(() => useEventTheme(), { wrapper: wrapper2 });
|
|
341
333
|
|
|
342
|
-
|
|
334
|
+
// Should be called again with the new event
|
|
335
|
+
expect(mockApplyPalette.mock.calls.length).toBeGreaterThan(1);
|
|
343
336
|
});
|
|
344
337
|
|
|
345
338
|
it('clears palette when event changes to null', () => {
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
},
|
|
356
|
-
events: [],
|
|
357
|
-
isLoading: false,
|
|
358
|
-
} as any);
|
|
359
|
-
|
|
360
|
-
renderHook(() => useEventTheme());
|
|
339
|
+
const wrapper1 = createWrapper({
|
|
340
|
+
id: 'event-1',
|
|
341
|
+
event_name: 'First Event',
|
|
342
|
+
event_colours: {
|
|
343
|
+
main: { '500': '#0ea5e9' },
|
|
344
|
+
sec: {},
|
|
345
|
+
acc: {}
|
|
346
|
+
}
|
|
347
|
+
});
|
|
361
348
|
|
|
362
|
-
|
|
363
|
-
selectedEvent: null,
|
|
364
|
-
events: [],
|
|
365
|
-
isLoading: false,
|
|
366
|
-
} as any);
|
|
349
|
+
renderHook(() => useEventTheme(), { wrapper: wrapper1 });
|
|
367
350
|
|
|
368
|
-
|
|
351
|
+
const wrapper2 = createWrapper(null);
|
|
352
|
+
renderHook(() => useEventTheme(), { wrapper: wrapper2 });
|
|
369
353
|
|
|
370
354
|
expect(mockClearPalette).toHaveBeenCalled();
|
|
371
355
|
});
|
|
@@ -382,29 +366,28 @@ describe('useEventTheme', () => {
|
|
|
382
366
|
sec: {},
|
|
383
367
|
acc: {}
|
|
384
368
|
},
|
|
385
|
-
organisation_id: 'org1',
|
|
369
|
+
organisation_id: assertOrganisationId('org1'),
|
|
386
370
|
created_at: new Date().toISOString(),
|
|
387
371
|
updated_at: new Date().toISOString()
|
|
388
372
|
};
|
|
389
373
|
|
|
390
|
-
|
|
374
|
+
// Event prop takes precedence over context
|
|
375
|
+
const wrapper = createWrapper(null); // Context has no event, but prop is provided
|
|
376
|
+
renderHook(() => useEventTheme(event), { wrapper });
|
|
391
377
|
|
|
392
|
-
//
|
|
393
|
-
expect(mockUseEvents).not.toHaveBeenCalled();
|
|
378
|
+
// Hook uses event prop when provided, not the context
|
|
394
379
|
expect(mockApplyPalette).toHaveBeenCalled();
|
|
395
380
|
});
|
|
396
381
|
|
|
397
382
|
it('clears palette when event prop is null', () => {
|
|
398
|
-
|
|
399
|
-
|
|
383
|
+
const wrapper = createWrapper(null);
|
|
384
|
+
renderHook(() => useEventTheme(null), { wrapper });
|
|
400
385
|
expect(mockClearPalette).toHaveBeenCalled();
|
|
401
386
|
});
|
|
402
387
|
|
|
403
388
|
it('handles EventProvider not available gracefully when event prop provided', () => {
|
|
404
|
-
//
|
|
405
|
-
|
|
406
|
-
throw new Error('useEvents must be used within EventServiceProvider');
|
|
407
|
-
});
|
|
389
|
+
// Use wrapper with null context (simulating no EventProvider)
|
|
390
|
+
const wrapper = createWrapper(null);
|
|
408
391
|
|
|
409
392
|
const event = {
|
|
410
393
|
id: 'event-1',
|
|
@@ -415,34 +398,29 @@ describe('useEventTheme', () => {
|
|
|
415
398
|
sec: {},
|
|
416
399
|
acc: {}
|
|
417
400
|
},
|
|
418
|
-
organisation_id: 'org1',
|
|
401
|
+
organisation_id: assertOrganisationId('org1'),
|
|
419
402
|
created_at: new Date().toISOString(),
|
|
420
403
|
updated_at: new Date().toISOString()
|
|
421
404
|
};
|
|
422
405
|
|
|
423
406
|
// Should not throw and should use event prop
|
|
424
|
-
expect(() => renderHook(() => useEventTheme(event))).not.toThrow();
|
|
407
|
+
expect(() => renderHook(() => useEventTheme(event), { wrapper })).not.toThrow();
|
|
425
408
|
expect(mockApplyPalette).toHaveBeenCalled();
|
|
426
409
|
});
|
|
427
410
|
|
|
428
411
|
it('falls back to EventProvider when event prop is undefined', () => {
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
},
|
|
439
|
-
events: [],
|
|
440
|
-
isLoading: false,
|
|
441
|
-
} as any);
|
|
412
|
+
const wrapper = createWrapper({
|
|
413
|
+
id: 'event-1',
|
|
414
|
+
event_name: 'Provider Event',
|
|
415
|
+
event_colours: {
|
|
416
|
+
main: { '500': '#0ea5e9' },
|
|
417
|
+
sec: {},
|
|
418
|
+
acc: {}
|
|
419
|
+
}
|
|
420
|
+
});
|
|
442
421
|
|
|
443
|
-
renderHook(() => useEventTheme(undefined));
|
|
422
|
+
renderHook(() => useEventTheme(undefined), { wrapper });
|
|
444
423
|
|
|
445
|
-
expect(mockUseEvents).toHaveBeenCalled();
|
|
446
424
|
expect(mockApplyPalette).toHaveBeenCalled();
|
|
447
425
|
});
|
|
448
426
|
});
|