@jmruthers/pace-core 0.6.5 → 0.6.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +104 -0
- package/README.md +5 -403
- package/audit-tool/00-dependencies.cjs +394 -0
- package/audit-tool/audits/01-pace-core-compliance.cjs +556 -0
- package/audit-tool/audits/02-project-structure.cjs +255 -0
- package/audit-tool/audits/03-architecture.cjs +196 -0
- package/audit-tool/audits/04-code-quality.cjs +149 -0
- package/audit-tool/audits/05-styling.cjs +224 -0
- package/audit-tool/audits/06-security-rbac.cjs +544 -0
- package/audit-tool/audits/07-api-tech-stack.cjs +301 -0
- package/audit-tool/audits/08-testing-documentation.cjs +202 -0
- package/audit-tool/audits/09-operations.cjs +208 -0
- package/audit-tool/index.cjs +291 -0
- package/audit-tool/utils/code-utils.cjs +218 -0
- package/audit-tool/utils/file-utils.cjs +230 -0
- package/audit-tool/utils/report-utils.cjs +241 -0
- package/core-usage-manifest.json +93 -0
- package/cursor-rules/00-standards-overview.mdc +156 -0
- package/cursor-rules/01-pace-core-compliance.mdc +586 -0
- package/cursor-rules/02-project-structure.mdc +42 -4
- package/cursor-rules/{03-solid-principles.mdc → 03-architecture.mdc} +126 -10
- package/cursor-rules/04-code-quality.mdc +419 -0
- package/cursor-rules/{08-markup-quality.mdc → 05-styling.mdc} +104 -34
- package/cursor-rules/06-security-rbac.mdc +518 -0
- package/cursor-rules/07-api-tech-stack.mdc +377 -0
- package/cursor-rules/08-testing-documentation.mdc +324 -0
- package/cursor-rules/09-operations.mdc +365 -0
- package/dist/{AuthService-Cb34EQs3.d.ts → AuthService-DmfO5rGS.d.ts} +10 -0
- package/dist/DataTable-7PMH7XN7.js +15 -0
- package/dist/{DataTable-BMRU8a1j.d.ts → DataTable-DRUIgtUH.d.ts} +1 -1
- package/dist/{PublicPageProvider-QTFVrL-Z.d.ts → PublicPageProvider-DlsCaR5v.d.ts} +33 -72
- package/dist/UnifiedAuthProvider-ZT6TIGM7.js +7 -0
- package/dist/api-Y4MQWOFW.js +4 -0
- package/dist/audit-MYQXYZFU.js +3 -0
- package/dist/{chunk-DGUM43GV.js → chunk-3RG5ZIWI.js} +1 -4
- package/dist/{chunk-QXHPKYJV.js → chunk-4SXLQIZO.js} +1 -26
- package/dist/{chunk-UPPMRMYG.js → chunk-5X4QLXRG.js} +73 -151
- package/dist/chunk-6F3IILHI.js +62 -0
- package/dist/{chunk-E66EQZE6.js → chunk-6GLLNA6U.js} +3 -9
- package/dist/{chunk-ZSAAAMVR.js → chunk-6QYDGKQY.js} +1 -4
- package/dist/{chunk-FMUCXFII.js → chunk-7ILTDCL2.js} +9 -5
- package/dist/{chunk-M43Y4SSO.js → chunk-A3W6LW53.js} +15 -13
- package/dist/{chunk-63FOKYGO.js → chunk-AHU7G2R5.js} +2 -11
- package/dist/{chunk-HU2C6SSC.js → chunk-BM4CQ5P3.js} +606 -559
- package/dist/chunk-C7NSAPTL.js +1 -0
- package/dist/{chunk-J36DSWQK.js → chunk-FEJLJNWA.js} +7 -41
- package/dist/{chunk-IHB5DR3H.js → chunk-FTCRZOG2.js} +188 -387
- package/dist/{chunk-G37KK66H.js → chunk-FYHN4DD5.js} +60 -19
- package/dist/chunk-GHYHJTYV.js +994 -0
- package/dist/{chunk-VBXEHIUJ.js → chunk-HF6O3O37.js} +6 -88
- package/dist/{chunk-FFQEQTNW.js → chunk-IUBRCBSY.js} +134 -45
- package/dist/{chunk-6COVEUS7.js → chunk-JGWDVX64.js} +983 -1034
- package/dist/{chunk-RGAWHO7N.js → chunk-L4XMVJKY.js} +77 -222
- package/dist/chunk-MBADTM7L.js +64 -0
- package/dist/{chunk-M7MPQISP.js → chunk-OJ4SKRSV.js} +3 -16
- package/dist/{chunk-IVOFDYWT.js → chunk-Q7Q7V5NV.js} +2109 -1604
- package/dist/{chunk-JGRYX5UX.js → chunk-S7DKJPLT.js} +29 -58
- package/dist/{chunk-PWLANIRT.js → chunk-TTRFSOKR.js} +1 -7
- package/dist/{chunk-5DRSZLL2.js → chunk-UH3NTO3F.js} +1 -6
- package/dist/{chunk-NTM7ZSB6.js → chunk-VBCS3DUA.js} +261 -168
- package/dist/{chunk-EFN2EIMK.js → chunk-ZFYPMX46.js} +271 -87
- package/dist/{chunk-L4OXEN46.js → chunk-ZKAWKYT4.js} +10 -24
- package/dist/components.d.ts +7 -5
- package/dist/components.js +46 -257
- package/dist/{database.generated-CzIvgcPu.d.ts → database.generated-CcnC_DRc.d.ts} +4795 -3691
- package/dist/eslint-rules/index.cjs +35 -0
- package/{src/eslint-rules/pace-core-compliance.cjs → dist/eslint-rules/rules/01-pace-core-compliance.cjs} +234 -235
- package/dist/eslint-rules/rules/04-code-quality.cjs +290 -0
- package/dist/eslint-rules/rules/05-styling.cjs +61 -0
- package/dist/eslint-rules/rules/06-security-rbac.cjs +806 -0
- package/dist/eslint-rules/rules/07-api-tech-stack.cjs +263 -0
- package/dist/eslint-rules/rules/08-testing.cjs +94 -0
- package/dist/eslint-rules/utils/helpers.cjs +42 -0
- package/dist/eslint-rules/utils/manifest-loader.cjs +75 -0
- package/dist/hooks.d.ts +6 -6
- package/dist/hooks.js +62 -172
- package/dist/icons/index.d.ts +1 -0
- package/dist/icons/index.js +1 -0
- package/dist/index.d.ts +12 -11
- package/dist/index.js +67 -660
- package/dist/providers.d.ts +2 -2
- package/dist/providers.js +8 -35
- package/dist/rbac/eslint-rules.d.ts +46 -44
- package/dist/rbac/eslint-rules.js +7 -4
- package/dist/rbac/index.d.ts +109 -586
- package/dist/rbac/index.js +14 -207
- package/dist/styles/index.js +2 -12
- package/dist/theming/runtime.d.ts +14 -1
- package/dist/theming/runtime.js +3 -19
- package/dist/{timezone-CHhWg6b4.d.ts → timezone-BZe_eUxx.d.ts} +175 -1
- package/dist/{types-CkbwOr4Y.d.ts → types-DXstZpNI.d.ts} +4 -17
- package/dist/types-t9H8qKRw.d.ts +55 -0
- package/dist/types.d.ts +1 -1
- package/dist/types.js +7 -94
- package/dist/{usePublicRouteParams-ClnV4tnv.d.ts → usePublicRouteParams-MamNgwqe.d.ts} +20 -20
- package/dist/utils.d.ts +24 -117
- package/dist/utils.js +54 -392
- package/docs/README.md +17 -7
- package/docs/api/README.md +4 -402
- package/docs/api/modules.md +301 -871
- package/docs/api-reference/components.md +21 -21
- package/docs/api-reference/deprecated.md +31 -6
- package/docs/api-reference/hooks.md +80 -80
- package/docs/api-reference/rpc-functions.md +78 -3
- package/docs/api-reference/types.md +1 -1
- package/docs/api-reference/utilities.md +1 -1
- package/docs/architecture/README.md +1 -1
- package/docs/core-concepts/events.md +3 -3
- package/docs/core-concepts/organisations.md +6 -6
- package/docs/core-concepts/permissions.md +6 -6
- package/docs/documentation-index.md +12 -18
- package/docs/getting-started/cursor-rules.md +3 -23
- package/docs/getting-started/dependencies.md +650 -0
- package/docs/getting-started/documentation-index.md +1 -1
- package/docs/getting-started/examples/README.md +4 -4
- package/docs/getting-started/examples/full-featured-app.md +1 -1
- package/docs/getting-started/faq.md +2 -2
- package/docs/getting-started/installation-guide.md +20 -7
- package/docs/getting-started/quick-reference.md +4 -4
- package/docs/getting-started/quick-start.md +23 -12
- package/docs/implementation-guides/authentication.md +15 -15
- package/docs/implementation-guides/component-styling.md +1 -1
- package/docs/implementation-guides/data-tables.md +126 -33
- package/docs/implementation-guides/datatable-rbac-usage.md +1 -1
- package/docs/implementation-guides/dynamic-colors.md +3 -3
- package/docs/implementation-guides/file-upload-storage.md +2 -2
- package/docs/implementation-guides/hierarchical-datatable.md +40 -60
- package/docs/implementation-guides/inactivity-tracking.md +3 -3
- package/docs/implementation-guides/large-datasets.md +3 -2
- package/docs/implementation-guides/organisation-security.md +2 -2
- package/docs/implementation-guides/performance.md +2 -2
- package/docs/implementation-guides/permission-enforcement.md +5 -1
- package/docs/migration/V0.3.44_organisation-context-timing-fix.md +1 -1
- package/docs/migration/V0.4.0_rbac-migration.md +6 -6
- package/docs/rbac/MIGRATION_GUIDE.md +819 -0
- package/docs/rbac/RBAC_CONTRACT.md +724 -0
- package/docs/rbac/README.md +17 -8
- package/docs/rbac/advanced-patterns.md +6 -6
- package/docs/rbac/api-reference.md +20 -20
- package/docs/rbac/edge-functions-guide.md +376 -0
- package/docs/rbac/event-based-apps.md +3 -3
- package/docs/rbac/examples.md +41 -41
- package/docs/rbac/getting-started.md +37 -37
- package/docs/rbac/performance.md +1 -1
- package/docs/rbac/quick-start.md +52 -52
- package/docs/rbac/secure-client-protection.md +1 -35
- package/docs/rbac/troubleshooting.md +1 -1
- package/docs/security/README.md +5 -5
- package/docs/standards/0-standards-overview.md +220 -0
- package/docs/standards/1-pace-core-compliance-standards.md +986 -0
- package/docs/standards/2-project-structure-standards.md +949 -0
- package/docs/standards/3-architecture-standards.md +606 -0
- package/docs/standards/4-code-quality-standards.md +728 -0
- package/docs/standards/5-styling-standards.md +348 -0
- package/docs/standards/{07-rbac-and-rls-standard.md → 6-security-rbac-standards.md} +269 -66
- package/docs/standards/7-api-tech-stack-standards.md +662 -0
- package/docs/standards/8-testing-documentation-standards.md +401 -0
- package/docs/standards/9-operations-standards.md +1102 -0
- package/docs/standards/README.md +185 -57
- package/docs/troubleshooting/README.md +4 -4
- package/docs/troubleshooting/common-issues.md +2 -2
- package/docs/troubleshooting/debugging.md +9 -9
- package/docs/troubleshooting/migration.md +4 -4
- package/docs/troubleshooting/organisation-context-setup.md +42 -19
- package/eslint-config-pace-core.cjs +33 -6
- package/package.json +35 -23
- package/scripts/install-cursor-rules.cjs +25 -6
- package/scripts/install-eslint-config.cjs +284 -0
- package/src/__tests__/fixtures/supabase.ts +1 -1
- package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +3 -3
- package/src/__tests__/helpers/__tests__/optimized-test-setup.test.ts +1 -1
- package/src/__tests__/helpers/__tests__/supabaseMock.test.ts +1 -1
- package/src/__tests__/helpers/__tests__/test-providers.test.tsx +2 -2
- package/src/__tests__/helpers/__tests__/test-utils.test.tsx +13 -13
- package/src/__tests__/helpers/component-test-utils.tsx +1 -1
- package/src/__tests__/helpers/supabaseMock.ts +2 -2
- package/src/__tests__/integration/UserProfile.test.tsx +14 -14
- package/src/__tests__/public-recipe-view.test.ts +38 -9
- package/src/__tests__/rbac/PagePermissionGuard.test.tsx +6 -6
- package/src/__tests__/templates/accessibility.test.template.tsx +9 -9
- package/src/__tests__/templates/component.test.template.tsx +18 -15
- package/src/components/Button/Button.tsx +5 -1
- package/src/components/Calendar/Calendar.tsx +201 -47
- package/src/components/ContextSelector/ContextSelector.tsx +106 -119
- package/src/components/DataTable/AUDIT_REPORT.md +293 -0
- package/src/components/DataTable/__tests__/DataTableCore.test.tsx +10 -2
- package/src/components/DataTable/__tests__/a11y.basic.test.tsx +10 -4
- package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +9 -9
- package/src/components/DataTable/components/ColumnFilter.tsx +63 -74
- package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +43 -41
- package/src/components/DataTable/components/DataTableCore.tsx +186 -13
- package/src/components/DataTable/components/DataTableErrorBoundary.tsx +9 -11
- package/src/components/DataTable/components/DataTableLayout.tsx +35 -21
- package/src/components/DataTable/components/EditFields.tsx +23 -3
- package/src/components/DataTable/components/EditableRow.tsx +12 -9
- package/src/components/DataTable/components/EmptyState.tsx +10 -9
- package/src/components/DataTable/components/FilterRow.tsx +2 -4
- package/src/components/DataTable/components/ImportModal.tsx +124 -126
- package/src/components/DataTable/components/LoadingState.tsx +5 -6
- package/src/components/DataTable/components/RowComponent.tsx +12 -0
- package/src/components/DataTable/components/SortIndicator.tsx +50 -0
- package/src/components/DataTable/components/__tests__/COVERAGE_NOTE.md +4 -4
- package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +23 -82
- package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +37 -9
- package/src/components/DataTable/components/__tests__/EmptyState.test.tsx +7 -4
- package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +12 -4
- package/src/components/DataTable/components/__tests__/LoadingState.test.tsx +41 -27
- package/src/components/DataTable/components/hooks/usePermissionTracking.ts +0 -4
- package/src/components/DataTable/components/index.ts +2 -1
- package/src/components/DataTable/hooks/__tests__/useDataTableState.test.ts +51 -47
- package/src/components/DataTable/hooks/useDataTablePermissions.ts +24 -21
- package/src/components/DataTable/hooks/useDataTableState.ts +125 -9
- package/src/components/DataTable/hooks/useTableColumns.ts +40 -2
- package/src/components/DataTable/hooks/useTableHandlers.ts +11 -0
- package/src/components/DataTable/types.ts +5 -18
- package/src/components/DataTable/utils/a11yUtils.ts +17 -0
- package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +2 -1
- package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.tsx +11 -15
- package/src/components/DateTimeField/DateTimeField.tsx +10 -9
- package/src/components/Dialog/Dialog.test.tsx +128 -104
- package/src/components/Dialog/Dialog.tsx +742 -24
- package/src/components/ErrorBoundary/ErrorBoundary.tsx +77 -79
- package/src/components/FileDisplay/FileDisplay.test.tsx +4 -2
- package/src/components/FileDisplay/FileDisplay.tsx +23 -17
- package/src/components/FileUpload/FileUpload.test.tsx +52 -14
- package/src/components/FileUpload/FileUpload.tsx +112 -130
- package/src/components/Form/Form.test.tsx +6 -8
- package/src/components/Form/Form.tsx +365 -4
- package/src/components/NavigationMenu/NavigationMenu.test.tsx +14 -13
- package/src/components/NavigationMenu/useNavigationFiltering.ts +11 -21
- package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +6 -4
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +11 -15
- package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +108 -61
- package/src/components/PaceLoginPage/PaceLoginPage.tsx +27 -3
- package/src/components/Progress/Progress.tsx +2 -4
- package/src/components/ProtectedRoute/ProtectedRoute.tsx +8 -8
- package/src/components/Select/Select.tsx +109 -98
- package/src/components/Select/types.ts +4 -1
- package/src/components/UserMenu/UserMenu.tsx +9 -6
- package/src/hooks/__tests__/ServiceHooks.test.tsx +16 -16
- package/src/hooks/__tests__/hooks.integration.test.tsx +55 -57
- package/src/hooks/__tests__/useAppConfig.unit.test.ts +129 -67
- package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +97 -97
- package/src/hooks/__tests__/usePublicEvent.simple.test.ts +149 -67
- package/src/hooks/__tests__/usePublicEvent.test.ts +149 -79
- package/src/hooks/__tests__/usePublicEvent.unit.test.ts +158 -109
- package/src/hooks/__tests__/useSessionDraft.test.ts +163 -0
- package/src/hooks/__tests__/useSessionRestoration.unit.test.tsx +10 -5
- package/src/hooks/public/usePublicEvent.ts +67 -195
- package/src/hooks/public/usePublicEventLogo.test.ts +70 -17
- package/src/hooks/public/usePublicEventLogo.ts +24 -14
- package/src/hooks/public/usePublicFileDisplay.ts +2 -2
- package/src/hooks/public/usePublicRouteParams.ts +5 -5
- package/src/hooks/useAppConfig.ts +28 -26
- package/src/hooks/useEventTheme.test.ts +217 -239
- package/src/hooks/useEventTheme.ts +16 -28
- package/src/hooks/useFileDisplay.ts +2 -2
- package/src/hooks/useOrganisationPermissions.ts +5 -7
- package/src/hooks/useQueryCache.ts +0 -1
- package/src/hooks/useSessionDraft.ts +380 -0
- package/src/hooks/useSessionRestoration.ts +3 -1
- package/src/icons/index.ts +27 -0
- package/src/index.ts +5 -0
- package/src/providers/OrganisationProvider.tsx +23 -14
- package/src/providers/UnifiedAuthProvider.smoke.test.tsx +21 -21
- package/src/providers/__tests__/AuthProvider.test.tsx +21 -21
- package/src/providers/__tests__/EventProvider.test.tsx +61 -61
- package/src/providers/__tests__/InactivityProvider.test.tsx +56 -56
- package/src/providers/__tests__/OrganisationProvider.test.tsx +75 -75
- package/src/providers/__tests__/ProviderLifecycle.test.tsx +37 -37
- package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +103 -103
- package/src/providers/services/EventServiceProvider.tsx +1 -24
- package/src/providers/services/UnifiedAuthProvider.tsx +5 -48
- package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +7 -7
- package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +13 -10
- package/src/rbac/__tests__/adapters.comprehensive.test.tsx +7 -457
- package/src/rbac/__tests__/auth-rbac.e2e.test.tsx +33 -7
- package/src/rbac/adapters.tsx +7 -295
- package/src/rbac/api.test.ts +44 -56
- package/src/rbac/api.ts +10 -17
- package/src/rbac/cache-invalidation.ts +0 -1
- package/src/rbac/compliance/index.ts +10 -0
- package/src/rbac/compliance/pattern-detector.ts +553 -0
- package/src/rbac/compliance/runtime-compliance.ts +22 -0
- package/src/rbac/components/AccessDenied.tsx +150 -0
- package/src/rbac/components/NavigationGuard.tsx +12 -20
- package/src/rbac/components/PagePermissionGuard.tsx +4 -24
- package/src/rbac/components/__tests__/NavigationGuard.test.tsx +21 -8
- package/src/rbac/components/index.ts +3 -41
- package/src/rbac/eslint-rules.js +1 -1
- package/src/rbac/hooks/index.ts +0 -3
- package/src/rbac/hooks/permissions/index.ts +0 -3
- package/src/rbac/hooks/permissions/useAccessLevel.ts +4 -8
- package/src/rbac/hooks/usePermissions.ts +0 -3
- package/src/rbac/hooks/useResolvedScope.test.ts +57 -47
- package/src/rbac/hooks/useResolvedScope.ts +58 -140
- package/src/rbac/hooks/useResourcePermissions.test.ts +124 -38
- package/src/rbac/hooks/useResourcePermissions.ts +139 -48
- package/src/rbac/hooks/useRoleManagement.test.ts +65 -22
- package/src/rbac/hooks/useRoleManagement.ts +147 -19
- package/src/rbac/hooks/useSecureSupabase.ts +4 -8
- package/src/rbac/index.ts +7 -9
- package/src/rbac/utils/contextValidator.ts +9 -7
- package/src/services/AuthService.ts +130 -18
- package/src/services/EventService.ts +4 -97
- package/src/services/InactivityService.ts +16 -0
- package/src/services/OrganisationService.ts +7 -44
- package/src/services/__tests__/OrganisationService.test.ts +26 -8
- package/src/services/base/BaseService.ts +0 -3
- package/src/styles/core.css +7 -0
- package/src/theming/__tests__/parseEventColours.test.ts +9 -3
- package/src/theming/parseEventColours.ts +22 -10
- package/src/types/database.generated.ts +4733 -3809
- package/src/utils/__tests__/lazyLoad.unit.test.tsx +42 -39
- package/src/utils/__tests__/organisationContext.unit.test.ts +9 -10
- package/src/utils/context/organisationContext.test.ts +13 -28
- package/src/utils/context/organisationContext.ts +21 -52
- package/src/utils/dynamic/dynamicUtils.ts +1 -1
- package/src/utils/file-reference/index.ts +39 -15
- package/src/utils/formatting/formatDateTime.test.ts +3 -2
- package/src/utils/google-places/loadGoogleMapsScript.ts +29 -4
- package/src/utils/index.ts +4 -1
- package/src/utils/persistence/__tests__/keyDerivation.test.ts +135 -0
- package/src/utils/persistence/__tests__/sensitiveFieldDetection.test.ts +123 -0
- package/src/utils/persistence/keyDerivation.ts +304 -0
- package/src/utils/persistence/sensitiveFieldDetection.ts +212 -0
- package/src/utils/security/secureStorage.ts +5 -5
- package/src/utils/storage/README.md +1 -1
- package/src/utils/storage/helpers.ts +3 -3
- package/src/utils/supabase/createBaseClient.ts +147 -0
- package/src/utils/timezone/timezone.test.ts +1 -2
- package/src/utils/timezone/timezone.ts +1 -1
- package/src/utils/validation/csrf.ts +4 -4
- package/cursor-rules/00-pace-core-compliance.mdc +0 -331
- package/cursor-rules/01-standards-compliance.mdc +0 -244
- package/cursor-rules/04-testing-standards.mdc +0 -268
- package/cursor-rules/05-bug-reports-and-features.mdc +0 -246
- package/cursor-rules/06-code-quality.mdc +0 -309
- package/cursor-rules/07-tech-stack-compliance.mdc +0 -214
- package/cursor-rules/CHANGELOG.md +0 -119
- package/cursor-rules/README.md +0 -192
- package/dist/DataTable-AOVNCPTX.js +0 -175
- package/dist/DataTable-AOVNCPTX.js.map +0 -1
- package/dist/UnifiedAuthProvider-4SBX4LU5.js +0 -18
- package/dist/UnifiedAuthProvider-4SBX4LU5.js.map +0 -1
- package/dist/api-O6HTBX5Y.js +0 -52
- package/dist/api-O6HTBX5Y.js.map +0 -1
- package/dist/audit-V53FV5AG.js +0 -17
- package/dist/audit-V53FV5AG.js.map +0 -1
- package/dist/chunk-5DRSZLL2.js.map +0 -1
- package/dist/chunk-63FOKYGO.js.map +0 -1
- package/dist/chunk-6COVEUS7.js.map +0 -1
- package/dist/chunk-AFVQODI2.js +0 -263
- package/dist/chunk-AFVQODI2.js.map +0 -1
- package/dist/chunk-DGUM43GV.js.map +0 -1
- package/dist/chunk-E66EQZE6.js.map +0 -1
- package/dist/chunk-EFN2EIMK.js.map +0 -1
- package/dist/chunk-FFQEQTNW.js.map +0 -1
- package/dist/chunk-FMUCXFII.js.map +0 -1
- package/dist/chunk-G37KK66H.js.map +0 -1
- package/dist/chunk-G7QEZTYQ.js +0 -2053
- package/dist/chunk-G7QEZTYQ.js.map +0 -1
- package/dist/chunk-HU2C6SSC.js.map +0 -1
- package/dist/chunk-IHB5DR3H.js.map +0 -1
- package/dist/chunk-IVOFDYWT.js.map +0 -1
- package/dist/chunk-J36DSWQK.js.map +0 -1
- package/dist/chunk-JGRYX5UX.js.map +0 -1
- package/dist/chunk-KQCRWDSA.js +0 -1
- package/dist/chunk-KQCRWDSA.js.map +0 -1
- package/dist/chunk-L4OXEN46.js.map +0 -1
- package/dist/chunk-LMC26NLJ.js +0 -84
- package/dist/chunk-LMC26NLJ.js.map +0 -1
- package/dist/chunk-M43Y4SSO.js.map +0 -1
- package/dist/chunk-M7MPQISP.js.map +0 -1
- package/dist/chunk-NTM7ZSB6.js.map +0 -1
- package/dist/chunk-PWLANIRT.js.map +0 -1
- package/dist/chunk-QXHPKYJV.js.map +0 -1
- package/dist/chunk-RGAWHO7N.js.map +0 -1
- package/dist/chunk-UPPMRMYG.js.map +0 -1
- package/dist/chunk-VBXEHIUJ.js.map +0 -1
- package/dist/chunk-ZSAAAMVR.js.map +0 -1
- package/dist/components.js.map +0 -1
- package/dist/contextValidator-5OGXSPKS.js +0 -9
- package/dist/contextValidator-5OGXSPKS.js.map +0 -1
- package/dist/eslint-rules/pace-core-compliance.cjs +0 -510
- package/dist/hooks.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/providers.js.map +0 -1
- package/dist/rbac/eslint-rules.js.map +0 -1
- package/dist/rbac/index.js.map +0 -1
- package/dist/styles/index.js.map +0 -1
- package/dist/theming/runtime.js.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/utils.js.map +0 -1
- package/docs/best-practices/README.md +0 -472
- package/docs/best-practices/accessibility.md +0 -601
- package/docs/best-practices/common-patterns.md +0 -516
- package/docs/best-practices/deployment.md +0 -1103
- package/docs/best-practices/performance.md +0 -1328
- package/docs/best-practices/security.md +0 -940
- package/docs/best-practices/testing.md +0 -1034
- package/docs/rbac/compliance/compliance-guide.md +0 -544
- package/docs/standards/01-architecture-standard.md +0 -44
- package/docs/standards/02-api-and-rpc-standard.md +0 -39
- package/docs/standards/03-component-standard.md +0 -32
- package/docs/standards/04-code-style-standard.md +0 -32
- package/docs/standards/05-security-standard.md +0 -44
- package/docs/standards/06-testing-and-docs-standard.md +0 -29
- package/docs/standards/pace-core-compliance.md +0 -432
- package/scripts/audit/core/checks/accessibility.cjs +0 -197
- package/scripts/audit/core/checks/api-usage.cjs +0 -191
- package/scripts/audit/core/checks/bundle.cjs +0 -142
- package/scripts/audit/core/checks/compliance.cjs +0 -2706
- package/scripts/audit/core/checks/config.cjs +0 -54
- package/scripts/audit/core/checks/coverage.cjs +0 -84
- package/scripts/audit/core/checks/dependencies.cjs +0 -994
- package/scripts/audit/core/checks/documentation.cjs +0 -268
- package/scripts/audit/core/checks/environment.cjs +0 -116
- package/scripts/audit/core/checks/error-handling.cjs +0 -340
- package/scripts/audit/core/checks/forms.cjs +0 -172
- package/scripts/audit/core/checks/heuristics.cjs +0 -68
- package/scripts/audit/core/checks/hooks.cjs +0 -334
- package/scripts/audit/core/checks/imports.cjs +0 -244
- package/scripts/audit/core/checks/performance.cjs +0 -325
- package/scripts/audit/core/checks/routes.cjs +0 -117
- package/scripts/audit/core/checks/state.cjs +0 -130
- package/scripts/audit/core/checks/structure.cjs +0 -65
- package/scripts/audit/core/checks/style.cjs +0 -584
- package/scripts/audit/core/checks/testing.cjs +0 -122
- package/scripts/audit/core/checks/typescript.cjs +0 -61
- package/scripts/audit/core/scanner.cjs +0 -199
- package/scripts/audit/core/utils.cjs +0 -137
- package/scripts/audit/index.cjs +0 -223
- package/scripts/audit/reporters/console.cjs +0 -151
- package/scripts/audit/reporters/json.cjs +0 -54
- package/scripts/audit/reporters/markdown.cjs +0 -124
- package/scripts/audit-consuming-app.cjs +0 -86
- package/src/components/DataTable/components/DataTableBody.tsx +0 -454
- package/src/components/DataTable/components/DraggableColumnHeader.tsx +0 -156
- package/src/components/DataTable/components/ExpandButton.tsx +0 -113
- package/src/components/DataTable/components/GroupHeader.tsx +0 -54
- package/src/components/DataTable/components/ViewRowModal.tsx +0 -68
- package/src/components/DataTable/components/VirtualizedDataTable.tsx +0 -525
- package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +0 -462
- package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +0 -393
- package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +0 -476
- package/src/components/DataTable/components/__tests__/VirtualizedDataTable.test.tsx +0 -128
- package/src/components/DataTable/core/DataTableContext.tsx +0 -216
- package/src/components/DataTable/core/__tests__/DataTableContext.test.tsx +0 -136
- package/src/components/DataTable/hooks/__tests__/useColumnReordering.test.ts +0 -570
- package/src/components/DataTable/hooks/useColumnReordering.ts +0 -123
- package/src/components/DataTable/utils/debugTools.ts +0 -514
- package/src/eslint-rules/pace-core-compliance.js +0 -638
- package/src/rbac/components/EnhancedNavigationMenu.test.tsx +0 -555
- package/src/rbac/components/EnhancedNavigationMenu.tsx +0 -293
- package/src/rbac/components/NavigationProvider.test.tsx +0 -481
- package/src/rbac/components/NavigationProvider.tsx +0 -345
- package/src/rbac/components/PagePermissionProvider.test.tsx +0 -476
- package/src/rbac/components/PagePermissionProvider.tsx +0 -279
- package/src/rbac/components/PermissionEnforcer.tsx +0 -312
- package/src/rbac/components/RoleBasedRouter.tsx +0 -440
- package/src/rbac/components/SecureDataProvider.test.tsx +0 -543
- package/src/rbac/components/SecureDataProvider.tsx +0 -339
- package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +0 -620
- package/src/rbac/components/__tests__/NavigationProvider.test.tsx +0 -726
- package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +0 -661
- package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +0 -881
- package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +0 -783
- package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +0 -645
- package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +0 -659
- package/src/rbac/hooks/permissions/useCachedPermissions.ts +0 -79
- package/src/rbac/hooks/permissions/useHasAllPermissions.ts +0 -90
- package/src/rbac/hooks/permissions/useHasAnyPermission.ts +0 -90
|
@@ -1,33 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
uploadFile
|
|
12
|
-
} from "./chunk-UPPMRMYG.js";
|
|
13
|
-
import {
|
|
14
|
-
useOrganisationSecurity,
|
|
15
|
-
usePublicPageContext
|
|
16
|
-
} from "./chunk-NTM7ZSB6.js";
|
|
17
|
-
import {
|
|
18
|
-
useOrganisations
|
|
19
|
-
} from "./chunk-IHB5DR3H.js";
|
|
20
|
-
import {
|
|
21
|
-
assertOrganisationId
|
|
22
|
-
} from "./chunk-QXHPKYJV.js";
|
|
23
|
-
import {
|
|
24
|
-
createLogger,
|
|
25
|
-
logger
|
|
26
|
-
} from "./chunk-PWLANIRT.js";
|
|
1
|
+
import { generateFilePath, generateUniqueFileName, extractFileMetadata, uploadFile, getPublicUrl, getSignedUrl, deleteFile, downloadFile, listFiles, archiveFile } from './chunk-5X4QLXRG.js';
|
|
2
|
+
import { useOrganisationSecurity, usePublicPageContext } from './chunk-VBCS3DUA.js';
|
|
3
|
+
import { useOrganisations } from './chunk-FTCRZOG2.js';
|
|
4
|
+
import { assertOrganisationId } from './chunk-4SXLQIZO.js';
|
|
5
|
+
import { createLogger, logger } from './chunk-TTRFSOKR.js';
|
|
6
|
+
import { useForm } from 'react-hook-form';
|
|
7
|
+
import { zodResolver } from '@hookform/resolvers/zod';
|
|
8
|
+
import { useState, useMemo, useCallback, useEffect } from 'react';
|
|
9
|
+
import { createClient } from '@supabase/supabase-js';
|
|
10
|
+
import { useParams, useLocation } from 'react-router-dom';
|
|
27
11
|
|
|
28
|
-
// src/hooks/useZodForm.ts
|
|
29
|
-
import { useForm } from "react-hook-form";
|
|
30
|
-
import { zodResolver } from "@hookform/resolvers/zod";
|
|
31
12
|
function useZodForm({
|
|
32
13
|
schema,
|
|
33
14
|
defaultValues,
|
|
@@ -39,9 +20,6 @@ function useZodForm({
|
|
|
39
20
|
mode
|
|
40
21
|
});
|
|
41
22
|
}
|
|
42
|
-
|
|
43
|
-
// src/hooks/useFormDialog.ts
|
|
44
|
-
import { useState } from "react";
|
|
45
23
|
function useFormDialog({
|
|
46
24
|
onOpenChange,
|
|
47
25
|
resetOnClose = true
|
|
@@ -75,9 +53,6 @@ function useFormDialog({
|
|
|
75
53
|
handleOpenChange
|
|
76
54
|
};
|
|
77
55
|
}
|
|
78
|
-
|
|
79
|
-
// src/hooks/useOrganisationPermissions.ts
|
|
80
|
-
import { useMemo } from "react";
|
|
81
56
|
function useOrganisationPermissions(orgId) {
|
|
82
57
|
const {
|
|
83
58
|
selectedOrganisation,
|
|
@@ -85,11 +60,8 @@ function useOrganisationPermissions(orgId) {
|
|
|
85
60
|
validateOrganisationAccess,
|
|
86
61
|
ensureOrganisationContext
|
|
87
62
|
} = useOrganisations();
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
superAdminContext = useOrganisationSecurity().superAdminContext;
|
|
91
|
-
} catch {
|
|
92
|
-
}
|
|
63
|
+
const organisationSecurity = useOrganisationSecurity();
|
|
64
|
+
const superAdminContext = organisationSecurity.superAdminContext;
|
|
93
65
|
const organisationId = useMemo(() => {
|
|
94
66
|
if (orgId) {
|
|
95
67
|
return orgId;
|
|
@@ -127,8 +99,6 @@ function useOrganisationPermissions(orgId) {
|
|
|
127
99
|
}
|
|
128
100
|
const isOrgAdmin = userRole === "org_admin";
|
|
129
101
|
const isLeader = userRole === "leader";
|
|
130
|
-
const isMember = userRole === "member";
|
|
131
|
-
const isSupporter = userRole === "supporter";
|
|
132
102
|
const isSuperAdmin = superAdminContext.isSuperAdmin;
|
|
133
103
|
return {
|
|
134
104
|
isOrgAdmin,
|
|
@@ -197,10 +167,6 @@ StorageUtils.deleteFile = deleteFile;
|
|
|
197
167
|
StorageUtils.downloadFile = downloadFile;
|
|
198
168
|
StorageUtils.listFiles = listFiles;
|
|
199
169
|
StorageUtils.archiveFile = archiveFile;
|
|
200
|
-
|
|
201
|
-
// src/hooks/public/usePublicEvent.ts
|
|
202
|
-
import { useState as useState2, useEffect, useCallback, useMemo as useMemo2 } from "react";
|
|
203
|
-
import { createClient } from "@supabase/supabase-js";
|
|
204
170
|
var publicDataCache = /* @__PURE__ */ new Map();
|
|
205
171
|
function usePublicEvent(eventCode, options = {}) {
|
|
206
172
|
const {
|
|
@@ -208,19 +174,12 @@ function usePublicEvent(eventCode, options = {}) {
|
|
|
208
174
|
// 5 minutes
|
|
209
175
|
enableCache = true
|
|
210
176
|
} = options;
|
|
211
|
-
const [event, setEvent] =
|
|
212
|
-
const [isLoading, setIsLoading] =
|
|
213
|
-
const [error, setError] =
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
} catch {
|
|
218
|
-
environment = {
|
|
219
|
-
supabaseUrl: import.meta.env?.VITE_SUPABASE_URL || import.meta.env?.NEXT_PUBLIC_SUPABASE_URL || null,
|
|
220
|
-
supabaseKey: import.meta.env?.VITE_SUPABASE_PUBLISHABLE_KEY || import.meta.env?.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY || null
|
|
221
|
-
};
|
|
222
|
-
}
|
|
223
|
-
const supabase = useMemo2(() => {
|
|
177
|
+
const [event, setEvent] = useState(null);
|
|
178
|
+
const [isLoading, setIsLoading] = useState(true);
|
|
179
|
+
const [error, setError] = useState(null);
|
|
180
|
+
const publicPageContext = usePublicPageContext();
|
|
181
|
+
const environment = publicPageContext.environment;
|
|
182
|
+
const supabase = useMemo(() => {
|
|
224
183
|
if (typeof window === "undefined") return null;
|
|
225
184
|
if (!environment.supabaseUrl || !environment.supabaseKey) {
|
|
226
185
|
logger.warn("usePublicEvent", "Missing Supabase environment variables. Please ensure VITE_SUPABASE_URL and VITE_SUPABASE_PUBLISHABLE_KEY are set in your environment.");
|
|
@@ -228,13 +187,6 @@ function usePublicEvent(eventCode, options = {}) {
|
|
|
228
187
|
}
|
|
229
188
|
return createClient(environment.supabaseUrl, environment.supabaseKey);
|
|
230
189
|
}, [environment.supabaseUrl, environment.supabaseKey]);
|
|
231
|
-
const refreshSchemaCache = useCallback(async () => {
|
|
232
|
-
try {
|
|
233
|
-
await supabase.from("information_schema.routines").select("routine_name").limit(1);
|
|
234
|
-
} catch (error2) {
|
|
235
|
-
logger.debug("usePublicEvent", "Schema cache refresh attempt failed:", error2);
|
|
236
|
-
}
|
|
237
|
-
}, [supabase]);
|
|
238
190
|
const fetchEvent = useCallback(async () => {
|
|
239
191
|
if (!eventCode || !supabase) {
|
|
240
192
|
setError(new Error("Invalid event code or Supabase client not available"));
|
|
@@ -254,115 +206,40 @@ function usePublicEvent(eventCode, options = {}) {
|
|
|
254
206
|
try {
|
|
255
207
|
setIsLoading(true);
|
|
256
208
|
setError(null);
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
event_date,
|
|
285
|
-
event_venue,
|
|
286
|
-
event_participants,
|
|
287
|
-
event_colours,
|
|
288
|
-
organisation_id,
|
|
289
|
-
event_days,
|
|
290
|
-
event_typicalunit,
|
|
291
|
-
event_rounddown,
|
|
292
|
-
event_youthmultiplier,
|
|
293
|
-
event_catering_email,
|
|
294
|
-
event_news,
|
|
295
|
-
event_billing,
|
|
296
|
-
event_email
|
|
297
|
-
`).eq("event_code", eventCode).eq("is_visible", true).not("organisation_id", "is", null).limit(1).single();
|
|
298
|
-
const tableData = tableResponse2?.data;
|
|
299
|
-
const tableError = tableResponse2?.error;
|
|
300
|
-
if (tableError) {
|
|
301
|
-
throw new Error(tableError?.message || "Failed to fetch event from table");
|
|
302
|
-
}
|
|
303
|
-
if (!tableData) {
|
|
304
|
-
setEvent(null);
|
|
305
|
-
setError(new Error("Event not found"));
|
|
306
|
-
return;
|
|
307
|
-
}
|
|
308
|
-
const logoResponse = await supabase.from("core_file_references").select("file_path").eq("table_name", "core_events").eq("record_id", tableData.event_id).eq("is_public", true).eq("file_metadata->>category", "event_logos").limit(1).single();
|
|
309
|
-
const logoData = logoResponse?.data;
|
|
310
|
-
eventData = {
|
|
311
|
-
...tableData,
|
|
312
|
-
event_logo: logoData?.file_path || null
|
|
313
|
-
};
|
|
314
|
-
}
|
|
315
|
-
} else {
|
|
316
|
-
const errorMessage = rpcError?.message || rpcError?.toString() || "Failed to fetch event";
|
|
317
|
-
setEvent(null);
|
|
318
|
-
setError(new Error(errorMessage));
|
|
319
|
-
setIsLoading(false);
|
|
320
|
-
return;
|
|
321
|
-
}
|
|
322
|
-
} else {
|
|
323
|
-
if (!data || data.length === 0 || !data[0]) {
|
|
324
|
-
setEvent(null);
|
|
325
|
-
setError(new Error("Event not found"));
|
|
326
|
-
return;
|
|
327
|
-
}
|
|
328
|
-
eventData = data[0];
|
|
329
|
-
}
|
|
330
|
-
} catch (rpcError) {
|
|
331
|
-
logger.warn("usePublicEvent", "RPC call failed, falling back to direct table access:", rpcError);
|
|
332
|
-
const tableResponse = await supabase.from("core_events").select(`
|
|
333
|
-
event_id,
|
|
334
|
-
event_name,
|
|
335
|
-
event_date,
|
|
336
|
-
event_venue,
|
|
337
|
-
event_participants,
|
|
338
|
-
event_colours,
|
|
339
|
-
organisation_id,
|
|
340
|
-
event_days,
|
|
341
|
-
event_typicalunit,
|
|
342
|
-
event_rounddown,
|
|
343
|
-
event_youthmultiplier,
|
|
344
|
-
event_catering_email,
|
|
345
|
-
event_news,
|
|
346
|
-
event_billing,
|
|
347
|
-
event_email
|
|
348
|
-
`).eq("event_code", eventCode).eq("is_visible", true).not("organisation_id", "is", null).limit(1).single();
|
|
349
|
-
const tableData = tableResponse?.data;
|
|
350
|
-
const tableError = tableResponse?.error;
|
|
351
|
-
if (tableError) {
|
|
352
|
-
throw new Error(tableError?.message || "Failed to fetch event from table");
|
|
353
|
-
}
|
|
354
|
-
if (!tableData) {
|
|
355
|
-
setEvent(null);
|
|
356
|
-
setError(new Error("Event not found"));
|
|
357
|
-
return;
|
|
358
|
-
}
|
|
359
|
-
const logoResponse = await supabase.from("core_file_references").select("file_path").eq("table_name", "core_events").eq("record_id", tableData.event_id).eq("is_public", true).eq("file_metadata->>category", "event_logos").limit(1).single();
|
|
360
|
-
const logoData = logoResponse?.data;
|
|
361
|
-
eventData = {
|
|
362
|
-
...tableData,
|
|
363
|
-
event_logo: logoData?.file_path || null
|
|
364
|
-
};
|
|
209
|
+
const tableResponse = await supabase.from("core_events").select(`
|
|
210
|
+
event_id,
|
|
211
|
+
event_name,
|
|
212
|
+
event_date,
|
|
213
|
+
event_venue,
|
|
214
|
+
event_participants,
|
|
215
|
+
event_colours,
|
|
216
|
+
organisation_id,
|
|
217
|
+
event_days,
|
|
218
|
+
event_typicalunit,
|
|
219
|
+
event_rounddown,
|
|
220
|
+
event_youthmultiplier,
|
|
221
|
+
event_catering_email,
|
|
222
|
+
event_news,
|
|
223
|
+
event_billing,
|
|
224
|
+
event_email
|
|
225
|
+
`).eq("event_code", eventCode).eq("is_visible", true).not("organisation_id", "is", null).limit(1).single();
|
|
226
|
+
const tableData = tableResponse?.data;
|
|
227
|
+
const tableError = tableResponse?.error;
|
|
228
|
+
if (tableError) {
|
|
229
|
+
const errorMessage = tableError.message === "No rows found" || tableError.code === "PGRST116" ? "Event not found" : tableError?.message || "Failed to fetch event from table";
|
|
230
|
+
throw new Error(errorMessage);
|
|
231
|
+
}
|
|
232
|
+
if (!tableData) {
|
|
233
|
+
setEvent(null);
|
|
234
|
+
setError(new Error("Event not found"));
|
|
235
|
+
return;
|
|
365
236
|
}
|
|
237
|
+
const logoResponse = await supabase.from("core_file_references").select("file_path").eq("table_name", "core_events").eq("record_id", tableData.event_id).eq("is_public", true).eq("file_metadata->>category", "event_logos").limit(1).single();
|
|
238
|
+
const logoData = logoResponse?.data;
|
|
239
|
+
const eventData = {
|
|
240
|
+
...tableData,
|
|
241
|
+
event_logo: logoData?.file_path || null
|
|
242
|
+
};
|
|
366
243
|
const transformedEvent = {
|
|
367
244
|
id: eventData.event_id,
|
|
368
245
|
event_id: eventData.event_id,
|
|
@@ -426,9 +303,6 @@ function getPublicEventCacheStats() {
|
|
|
426
303
|
keys
|
|
427
304
|
};
|
|
428
305
|
}
|
|
429
|
-
|
|
430
|
-
// src/hooks/public/usePublicEventLogo.ts
|
|
431
|
-
import { useState as useState3, useEffect as useEffect2, useCallback as useCallback2, useMemo as useMemo3 } from "react";
|
|
432
306
|
var log = createLogger("usePublicEventLogo");
|
|
433
307
|
var publicDataCache2 = /* @__PURE__ */ new Map();
|
|
434
308
|
function defaultGenerateFallbackText(eventName) {
|
|
@@ -444,13 +318,13 @@ function usePublicEventLogo(eventId, eventName, organisationId, options) {
|
|
|
444
318
|
generateFallbackText = defaultGenerateFallbackText,
|
|
445
319
|
supabase
|
|
446
320
|
} = options;
|
|
447
|
-
const [logoUrl, setLogoUrl] =
|
|
448
|
-
const [isLoading, setIsLoading] =
|
|
449
|
-
const [error, setError] =
|
|
450
|
-
const fallbackText =
|
|
321
|
+
const [logoUrl, setLogoUrl] = useState(null);
|
|
322
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
323
|
+
const [error, setError] = useState(null);
|
|
324
|
+
const fallbackText = useMemo(() => {
|
|
451
325
|
return eventName ? generateFallbackText(eventName) : "EV";
|
|
452
326
|
}, [eventName, generateFallbackText]);
|
|
453
|
-
const fetchLogo =
|
|
327
|
+
const fetchLogo = useCallback(async () => {
|
|
454
328
|
if (!eventId || !organisationId || !supabase) {
|
|
455
329
|
setLogoUrl(null);
|
|
456
330
|
setIsLoading(false);
|
|
@@ -473,18 +347,19 @@ function usePublicEventLogo(eventId, eventName, organisationId, options) {
|
|
|
473
347
|
try {
|
|
474
348
|
setIsLoading(true);
|
|
475
349
|
setError(null);
|
|
476
|
-
const { data, error:
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
350
|
+
const { data: logoData, error: queryError } = await supabase.from("core_file_references").select("file_path").eq("table_name", "core_events").eq("record_id", eventId).eq("is_public", true).eq("file_metadata->>category", "event_logos").limit(1).single();
|
|
351
|
+
if (queryError) {
|
|
352
|
+
if (queryError.code === "PGRST116") {
|
|
353
|
+
setLogoUrl(null);
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
throw new Error(queryError.message || "Failed to fetch logo");
|
|
482
357
|
}
|
|
483
|
-
if (!
|
|
358
|
+
if (!logoData || !logoData.file_path) {
|
|
484
359
|
setLogoUrl(null);
|
|
485
360
|
return;
|
|
486
361
|
}
|
|
487
|
-
const logoUrl2 =
|
|
362
|
+
const logoUrl2 = logoData.file_path;
|
|
488
363
|
if (validateImage) {
|
|
489
364
|
try {
|
|
490
365
|
const response = await fetch(logoUrl2, { method: "HEAD" });
|
|
@@ -516,7 +391,7 @@ function usePublicEventLogo(eventId, eventName, organisationId, options) {
|
|
|
516
391
|
setIsLoading(false);
|
|
517
392
|
}
|
|
518
393
|
}, [eventId, organisationId, supabase, cacheTtl, enableCache, validateImage]);
|
|
519
|
-
|
|
394
|
+
useEffect(() => {
|
|
520
395
|
if (eventId && organisationId) {
|
|
521
396
|
fetchLogo();
|
|
522
397
|
} else {
|
|
@@ -525,7 +400,7 @@ function usePublicEventLogo(eventId, eventName, organisationId, options) {
|
|
|
525
400
|
setError(null);
|
|
526
401
|
}
|
|
527
402
|
}, [fetchLogo, eventId, organisationId]);
|
|
528
|
-
const refetch =
|
|
403
|
+
const refetch = useCallback(async () => {
|
|
529
404
|
if (!eventId || !organisationId) return;
|
|
530
405
|
if (enableCache) {
|
|
531
406
|
const cacheKey = `public_logo_${eventId}_${organisationId}`;
|
|
@@ -555,10 +430,6 @@ function getPublicLogoCacheStats() {
|
|
|
555
430
|
keys
|
|
556
431
|
};
|
|
557
432
|
}
|
|
558
|
-
|
|
559
|
-
// src/hooks/public/usePublicRouteParams.ts
|
|
560
|
-
import { useState as useState4, useCallback as useCallback3, useMemo as useMemo4 } from "react";
|
|
561
|
-
import { useParams, useLocation } from "react-router-dom";
|
|
562
433
|
function validateEventCodeFormat(eventCode) {
|
|
563
434
|
if (!eventCode || typeof eventCode !== "string") return false;
|
|
564
435
|
if (eventCode.length < 2 || eventCode.length > 50) return false;
|
|
@@ -580,9 +451,9 @@ function usePublicRouteParams(options = {}) {
|
|
|
580
451
|
validateEventCode = true
|
|
581
452
|
} = options;
|
|
582
453
|
const params = useParams();
|
|
583
|
-
|
|
584
|
-
const [error, setError] =
|
|
585
|
-
const eventCode =
|
|
454
|
+
useLocation();
|
|
455
|
+
const [error, setError] = useState(null);
|
|
456
|
+
const eventCode = useMemo(() => {
|
|
586
457
|
const code = params[eventCodeParam];
|
|
587
458
|
if (!code) {
|
|
588
459
|
return null;
|
|
@@ -604,20 +475,20 @@ function usePublicRouteParams(options = {}) {
|
|
|
604
475
|
cacheTtl: 5 * 60 * 1e3
|
|
605
476
|
// 5 minutes
|
|
606
477
|
});
|
|
607
|
-
const isLoading =
|
|
478
|
+
const isLoading = useMemo(() => {
|
|
608
479
|
if (!fetchEventData) return false;
|
|
609
480
|
return eventLoading;
|
|
610
481
|
}, [fetchEventData, eventLoading]);
|
|
611
|
-
const finalError =
|
|
482
|
+
const finalError = useMemo(() => {
|
|
612
483
|
if (error) return error;
|
|
613
484
|
if (eventError) return eventError;
|
|
614
485
|
return null;
|
|
615
486
|
}, [error, eventError]);
|
|
616
|
-
const eventId =
|
|
487
|
+
const eventId = useMemo(() => {
|
|
617
488
|
if (!event) return null;
|
|
618
489
|
return event.event_id || event.id;
|
|
619
490
|
}, [event]);
|
|
620
|
-
const refetch =
|
|
491
|
+
const refetch = useCallback(async () => {
|
|
621
492
|
if (!fetchEventData) return;
|
|
622
493
|
await refetchEvent();
|
|
623
494
|
}, [fetchEventData, refetchEvent]);
|
|
@@ -632,7 +503,7 @@ function usePublicRouteParams(options = {}) {
|
|
|
632
503
|
}
|
|
633
504
|
function usePublicEventCode(eventCodeParam = "eventCode") {
|
|
634
505
|
const params = useParams();
|
|
635
|
-
const eventCode =
|
|
506
|
+
const eventCode = useMemo(() => {
|
|
636
507
|
const code = params[eventCodeParam];
|
|
637
508
|
if (!code) {
|
|
638
509
|
return null;
|
|
@@ -642,7 +513,7 @@ function usePublicEventCode(eventCodeParam = "eventCode") {
|
|
|
642
513
|
}
|
|
643
514
|
return code;
|
|
644
515
|
}, [params, eventCodeParam]);
|
|
645
|
-
const error =
|
|
516
|
+
const error = useMemo(() => {
|
|
646
517
|
if (!eventCode) {
|
|
647
518
|
return new Error(`Event code parameter '${eventCodeParam}' not found or invalid`);
|
|
648
519
|
}
|
|
@@ -669,20 +540,4 @@ function extractEventCodeFromPath(path) {
|
|
|
669
540
|
return eventCode;
|
|
670
541
|
}
|
|
671
542
|
|
|
672
|
-
export {
|
|
673
|
-
useZodForm,
|
|
674
|
-
useFormDialog,
|
|
675
|
-
useOrganisationPermissions,
|
|
676
|
-
StorageUtils,
|
|
677
|
-
usePublicEvent,
|
|
678
|
-
clearPublicEventCache,
|
|
679
|
-
getPublicEventCacheStats,
|
|
680
|
-
usePublicEventLogo,
|
|
681
|
-
clearPublicLogoCache,
|
|
682
|
-
getPublicLogoCacheStats,
|
|
683
|
-
usePublicRouteParams,
|
|
684
|
-
usePublicEventCode,
|
|
685
|
-
generatePublicRoutePath,
|
|
686
|
-
extractEventCodeFromPath
|
|
687
|
-
};
|
|
688
|
-
//# sourceMappingURL=chunk-RGAWHO7N.js.map
|
|
543
|
+
export { StorageUtils, clearPublicEventCache, clearPublicLogoCache, extractEventCodeFromPath, generatePublicRoutePath, getPublicEventCacheStats, getPublicLogoCacheStats, useFormDialog, useOrganisationPermissions, usePublicEvent, usePublicEventCode, usePublicEventLogo, usePublicRouteParams, useZodForm };
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
// src/utils/validation/schema.ts
|
|
4
|
+
function pickSchema(schema, keys) {
|
|
5
|
+
const shape = Object.entries(schema.shape).filter(([key]) => keys.includes(key)).reduce((acc, [key, value]) => {
|
|
6
|
+
acc[key] = value;
|
|
7
|
+
return acc;
|
|
8
|
+
}, {});
|
|
9
|
+
return z.object(shape);
|
|
10
|
+
}
|
|
11
|
+
function combineSchemas(schemas) {
|
|
12
|
+
return schemas.reduce(
|
|
13
|
+
(merged, schema) => merged.merge(schema),
|
|
14
|
+
z.object({})
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
var emailSchema = z.string().email("Please enter a valid email address");
|
|
18
|
+
var nameSchema = z.string().min(1, "Name is required").max(100, "Name must be less than 100 characters");
|
|
19
|
+
var phoneSchema = z.string().regex(/^\+?[\d\s\-\(\)]+$/, "Please enter a valid phone number");
|
|
20
|
+
var urlSchema = z.string().url("Please enter a valid URL");
|
|
21
|
+
var dateSchema = z.string().refine((date) => !isNaN(Date.parse(date)), "Please enter a valid date");
|
|
22
|
+
var passwordSchema = z.string().min(8, "Password must be at least 8 characters").regex(/[A-Z]/, "Password must contain at least one uppercase letter").regex(/[a-z]/, "Password must contain at least one lowercase letter").regex(/[0-9]/, "Password must contain at least one number");
|
|
23
|
+
var securePasswordSchema = passwordSchema.regex(/[!@#$%^&*(),.?":{}|<>]/, "Password must contain at least one special character");
|
|
24
|
+
var loginSchema = z.object({
|
|
25
|
+
email: emailSchema,
|
|
26
|
+
password: z.string().min(1, "Password is required")
|
|
27
|
+
});
|
|
28
|
+
var registrationSchema = z.object({
|
|
29
|
+
email: emailSchema,
|
|
30
|
+
password: passwordSchema,
|
|
31
|
+
confirmPassword: z.string()
|
|
32
|
+
}).refine((data) => data.password === data.confirmPassword, {
|
|
33
|
+
message: "Passwords don't match",
|
|
34
|
+
path: ["confirmPassword"]
|
|
35
|
+
});
|
|
36
|
+
var secureLoginSchema = z.object({
|
|
37
|
+
email: emailSchema,
|
|
38
|
+
password: securePasswordSchema
|
|
39
|
+
});
|
|
40
|
+
var passwordResetSchema = z.object({
|
|
41
|
+
email: emailSchema
|
|
42
|
+
});
|
|
43
|
+
var changePasswordSchema = z.object({
|
|
44
|
+
currentPassword: z.string().min(1, "Current password is required"),
|
|
45
|
+
newPassword: securePasswordSchema,
|
|
46
|
+
confirmPassword: z.string()
|
|
47
|
+
}).refine((data) => data.newPassword === data.confirmPassword, {
|
|
48
|
+
message: "Passwords don't match",
|
|
49
|
+
path: ["confirmPassword"]
|
|
50
|
+
});
|
|
51
|
+
var userProfileSchema = z.object({
|
|
52
|
+
name: nameSchema,
|
|
53
|
+
email: emailSchema,
|
|
54
|
+
phone: phoneSchema.optional(),
|
|
55
|
+
website: urlSchema.optional(),
|
|
56
|
+
bio: z.string().max(500).optional()
|
|
57
|
+
});
|
|
58
|
+
var contactFormSchema = z.object({
|
|
59
|
+
name: nameSchema,
|
|
60
|
+
email: emailSchema,
|
|
61
|
+
message: z.string().min(1, "Message is required").max(1e3, "Message must be less than 1000 characters")
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
export { changePasswordSchema, combineSchemas, contactFormSchema, dateSchema, emailSchema, loginSchema, nameSchema, passwordResetSchema, passwordSchema, phoneSchema, pickSchema, registrationSchema, secureLoginSchema, securePasswordSchema, urlSchema, userProfileSchema };
|
|
@@ -1,9 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
} from "./chunk-PWLANIRT.js";
|
|
4
|
-
import {
|
|
5
|
-
__require
|
|
6
|
-
} from "./chunk-DGUM43GV.js";
|
|
1
|
+
import { createLogger } from './chunk-TTRFSOKR.js';
|
|
2
|
+
import { __require } from './chunk-3RG5ZIWI.js';
|
|
7
3
|
|
|
8
4
|
// src/utils/app/appNameResolver.ts
|
|
9
5
|
var log = createLogger("AppNameResolver");
|
|
@@ -106,13 +102,4 @@ function getCurrentAppNameWithFallback(fallback = "default-app") {
|
|
|
106
102
|
return getCurrentAppName() || fallback;
|
|
107
103
|
}
|
|
108
104
|
|
|
109
|
-
export {
|
|
110
|
-
getAppNameFromPackageJson,
|
|
111
|
-
getAppNameFromBuildTime,
|
|
112
|
-
getAppNameFromGlobal,
|
|
113
|
-
getAppNameFromEnvironment,
|
|
114
|
-
getCurrentAppName,
|
|
115
|
-
setRBACAppName,
|
|
116
|
-
getCurrentAppNameWithFallback
|
|
117
|
-
};
|
|
118
|
-
//# sourceMappingURL=chunk-M7MPQISP.js.map
|
|
105
|
+
export { getAppNameFromBuildTime, getAppNameFromEnvironment, getAppNameFromGlobal, getAppNameFromPackageJson, getCurrentAppName, getCurrentAppNameWithFallback, setRBACAppName };
|