@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
|
@@ -85,29 +85,4 @@ var PermissionErrorCode = /* @__PURE__ */ ((PermissionErrorCode2) => {
|
|
|
85
85
|
return PermissionErrorCode2;
|
|
86
86
|
})(PermissionErrorCode || {});
|
|
87
87
|
|
|
88
|
-
export {
|
|
89
|
-
createUserId,
|
|
90
|
-
createSessionToken,
|
|
91
|
-
createPermissionString,
|
|
92
|
-
createRequestId,
|
|
93
|
-
createOrganisationId,
|
|
94
|
-
createEventId,
|
|
95
|
-
createAppId,
|
|
96
|
-
createPageId,
|
|
97
|
-
isUserId,
|
|
98
|
-
isSessionToken,
|
|
99
|
-
isPermissionString,
|
|
100
|
-
isRequestId,
|
|
101
|
-
isOrganisationId,
|
|
102
|
-
isEventId,
|
|
103
|
-
isAppId,
|
|
104
|
-
isPageId,
|
|
105
|
-
assertUserId,
|
|
106
|
-
assertOrganisationId,
|
|
107
|
-
assertEventId,
|
|
108
|
-
assertAppId,
|
|
109
|
-
assertPageId,
|
|
110
|
-
AuthErrorCode,
|
|
111
|
-
PermissionErrorCode
|
|
112
|
-
};
|
|
113
|
-
//# sourceMappingURL=chunk-QXHPKYJV.js.map
|
|
88
|
+
export { AuthErrorCode, PermissionErrorCode, assertAppId, assertEventId, assertOrganisationId, assertPageId, assertUserId, createAppId, createEventId, createOrganisationId, createPageId, createPermissionString, createRequestId, createSessionToken, createUserId, isAppId, isEventId, isOrganisationId, isPageId, isPermissionString, isRequestId, isSessionToken, isUserId };
|
|
@@ -1,33 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
} from
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
} from
|
|
7
|
-
import {
|
|
8
|
-
assertAppId
|
|
9
|
-
} from "./chunk-QXHPKYJV.js";
|
|
10
|
-
import {
|
|
11
|
-
createAddressFromPlaceResult,
|
|
12
|
-
fetchPlaceAutocomplete,
|
|
13
|
-
fetchPlaceDetails,
|
|
14
|
-
getAddressByPlaceId
|
|
15
|
-
} from "./chunk-G37KK66H.js";
|
|
16
|
-
import {
|
|
17
|
-
setOrganisationContext
|
|
18
|
-
} from "./chunk-VBXEHIUJ.js";
|
|
19
|
-
import {
|
|
20
|
-
applyPalette,
|
|
21
|
-
clearPalette,
|
|
22
|
-
parseAndNormalizeEventColours
|
|
23
|
-
} from "./chunk-L4OXEN46.js";
|
|
24
|
-
import {
|
|
25
|
-
createLogger,
|
|
26
|
-
logger
|
|
27
|
-
} from "./chunk-PWLANIRT.js";
|
|
1
|
+
import { clearPalette, parseAndNormalizeEventColours, applyPalette } from './chunk-ZKAWKYT4.js';
|
|
2
|
+
import { EventServiceContext } from './chunk-FTCRZOG2.js';
|
|
3
|
+
import { assertAppId } from './chunk-4SXLQIZO.js';
|
|
4
|
+
import { fetchPlaceDetails, createAddressFromPlaceResult, getAddressByPlaceId, fetchPlaceAutocomplete, setOrganisationContext } from './chunk-FYHN4DD5.js';
|
|
5
|
+
import { createLogger, logger } from './chunk-TTRFSOKR.js';
|
|
6
|
+
import { useState, useEffect, useCallback, useRef, useMemo, useContext } from 'react';
|
|
7
|
+
import { useLocation } from 'react-router-dom';
|
|
28
8
|
|
|
29
|
-
// src/hooks/useDebounce.ts
|
|
30
|
-
import { useState, useEffect } from "react";
|
|
31
9
|
function useDebounce(value, delay) {
|
|
32
10
|
const [debouncedValue, setDebouncedValue] = useState(value);
|
|
33
11
|
useEffect(() => {
|
|
@@ -40,9 +18,6 @@ function useDebounce(value, delay) {
|
|
|
40
18
|
}, [value, delay]);
|
|
41
19
|
return debouncedValue;
|
|
42
20
|
}
|
|
43
|
-
|
|
44
|
-
// src/hooks/useQueryCache.ts
|
|
45
|
-
import { useCallback } from "react";
|
|
46
21
|
var log = createLogger("useQueryCache");
|
|
47
22
|
var queryCache = /* @__PURE__ */ new Map();
|
|
48
23
|
var CLEANUP_INTERVAL_MS = 5 * 60 * 1e3;
|
|
@@ -62,7 +37,6 @@ function runCacheCleanup() {
|
|
|
62
37
|
}
|
|
63
38
|
if (typeof window !== "undefined" && !cleanupTimer) {
|
|
64
39
|
cleanupTimer = setInterval(runCacheCleanup, CLEANUP_INTERVAL_MS);
|
|
65
|
-
log.debug("Query cache cleanup initialized.");
|
|
66
40
|
window.addEventListener("beforeunload", () => {
|
|
67
41
|
if (cleanupTimer) {
|
|
68
42
|
clearInterval(cleanupTimer);
|
|
@@ -226,9 +200,6 @@ var queryCacheHelpers = {
|
|
|
226
200
|
return promise;
|
|
227
201
|
}
|
|
228
202
|
};
|
|
229
|
-
|
|
230
|
-
// src/hooks/useAddressAutocomplete.ts
|
|
231
|
-
import { useState as useState2, useEffect as useEffect3, useCallback as useCallback2, useRef as useRef2, useMemo } from "react";
|
|
232
203
|
function useAddressAutocomplete(apiKey, inputValue, options = {}) {
|
|
233
204
|
const {
|
|
234
205
|
debounceDelay = 300,
|
|
@@ -241,18 +212,18 @@ function useAddressAutocomplete(apiKey, inputValue, options = {}) {
|
|
|
241
212
|
},
|
|
242
213
|
autocompleteOptions
|
|
243
214
|
} = options;
|
|
244
|
-
const [suggestions, setSuggestions] =
|
|
245
|
-
const [isLoading, setIsLoading] =
|
|
246
|
-
const [error, setError] =
|
|
215
|
+
const [suggestions, setSuggestions] = useState([]);
|
|
216
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
217
|
+
const [error, setError] = useState(null);
|
|
247
218
|
const debouncedInput = useDebounce(inputValue, debounceDelay);
|
|
248
219
|
const { getCachedQuery } = useQueryCache();
|
|
249
|
-
const abortControllerRef =
|
|
220
|
+
const abortControllerRef = useRef(null);
|
|
250
221
|
const memoizedAutocompleteOptions = useMemo(
|
|
251
222
|
() => autocompleteOptions,
|
|
252
223
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
253
224
|
[JSON.stringify(autocompleteOptions)]
|
|
254
225
|
);
|
|
255
|
-
|
|
226
|
+
useEffect(() => {
|
|
256
227
|
if (abortControllerRef.current) {
|
|
257
228
|
abortControllerRef.current.abort();
|
|
258
229
|
}
|
|
@@ -303,7 +274,7 @@ function useAddressAutocomplete(apiKey, inputValue, options = {}) {
|
|
|
303
274
|
}
|
|
304
275
|
};
|
|
305
276
|
}, [debouncedInput, apiKey, cacheEnabled, cacheTTL.autocomplete]);
|
|
306
|
-
const selectAddress =
|
|
277
|
+
const selectAddress = useCallback(
|
|
307
278
|
async (placeId) => {
|
|
308
279
|
if (!placeId || !apiKey) {
|
|
309
280
|
return null;
|
|
@@ -338,7 +309,7 @@ function useAddressAutocomplete(apiKey, inputValue, options = {}) {
|
|
|
338
309
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
339
310
|
[apiKey, cacheEnabled, cacheTTL.placeDetails]
|
|
340
311
|
);
|
|
341
|
-
const getAddressByPlaceIdFn =
|
|
312
|
+
const getAddressByPlaceIdFn = useCallback(
|
|
342
313
|
async (placeId) => {
|
|
343
314
|
if (!placeId || !apiKey) {
|
|
344
315
|
return null;
|
|
@@ -370,7 +341,7 @@ function useAddressAutocomplete(apiKey, inputValue, options = {}) {
|
|
|
370
341
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
371
342
|
[apiKey, cacheEnabled, cacheTTL.placeDetails]
|
|
372
343
|
);
|
|
373
|
-
const clearSuggestions =
|
|
344
|
+
const clearSuggestions = useCallback(() => {
|
|
374
345
|
setSuggestions([]);
|
|
375
346
|
setError(null);
|
|
376
347
|
}, []);
|
|
@@ -502,12 +473,12 @@ async function extractFileMetadata(file, options, uploadedBy) {
|
|
|
502
473
|
const dimensions = await getImageDimensions(file);
|
|
503
474
|
metadata.width = dimensions.width;
|
|
504
475
|
metadata.height = dimensions.height;
|
|
505
|
-
} catch (
|
|
476
|
+
} catch (_error) {
|
|
506
477
|
}
|
|
507
478
|
}
|
|
508
479
|
try {
|
|
509
480
|
metadata.hash = await generateFileHash(file);
|
|
510
|
-
} catch (
|
|
481
|
+
} catch (_error) {
|
|
511
482
|
}
|
|
512
483
|
return metadata;
|
|
513
484
|
}
|
|
@@ -614,7 +585,7 @@ function getPublicUrl(supabase, path, isPublic = true) {
|
|
|
614
585
|
if (/^https?:\/\//i.test(path)) {
|
|
615
586
|
return path;
|
|
616
587
|
}
|
|
617
|
-
|
|
588
|
+
const normalisedPath = path.trim().replace(/^\/+/, "");
|
|
618
589
|
if (!normalisedPath) {
|
|
619
590
|
throw new Error("Storage path cannot be empty after normalisation");
|
|
620
591
|
}
|
|
@@ -677,7 +648,6 @@ async function getSignedUrl(supabase, path, options) {
|
|
|
677
648
|
}
|
|
678
649
|
var globalUrlCache = /* @__PURE__ */ new Map();
|
|
679
650
|
var MAX_CACHE_SIZE = 500;
|
|
680
|
-
var DEFAULT_TTL_MS = 3600 * 1e3;
|
|
681
651
|
function getCacheKey(fileId, filePath, isPublic) {
|
|
682
652
|
return `file-url:${fileId}:${isPublic ? "public" : "private"}`;
|
|
683
653
|
}
|
|
@@ -892,9 +862,6 @@ async function archiveFile(supabase, path, options) {
|
|
|
892
862
|
};
|
|
893
863
|
}
|
|
894
864
|
}
|
|
895
|
-
|
|
896
|
-
// src/hooks/public/usePublicFileDisplay.ts
|
|
897
|
-
import { useState as useState3, useEffect as useEffect4, useCallback as useCallback3 } from "react";
|
|
898
865
|
var publicFileCache = /* @__PURE__ */ new Map();
|
|
899
866
|
function usePublicFileDisplay(table_name, record_id, organisation_id, category, options) {
|
|
900
867
|
const {
|
|
@@ -903,14 +870,14 @@ function usePublicFileDisplay(table_name, record_id, organisation_id, category,
|
|
|
903
870
|
enableCache = true,
|
|
904
871
|
supabase
|
|
905
872
|
} = options;
|
|
906
|
-
const [fileUrl, setFileUrl] =
|
|
907
|
-
const [fileReference, setFileReference] =
|
|
908
|
-
const [fileReferences, setFileReferences] =
|
|
909
|
-
const [fileUrls, setFileUrls] =
|
|
910
|
-
const [fileCount, setFileCount] =
|
|
911
|
-
const [isLoading, setIsLoading] =
|
|
912
|
-
const [error, setError] =
|
|
913
|
-
const fetchFiles =
|
|
873
|
+
const [fileUrl, setFileUrl] = useState(null);
|
|
874
|
+
const [fileReference, setFileReference] = useState(null);
|
|
875
|
+
const [fileReferences, setFileReferences] = useState([]);
|
|
876
|
+
const [fileUrls, setFileUrls] = useState(/* @__PURE__ */ new Map());
|
|
877
|
+
const [fileCount, setFileCount] = useState(0);
|
|
878
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
879
|
+
const [error, setError] = useState(null);
|
|
880
|
+
const fetchFiles = useCallback(async () => {
|
|
914
881
|
if (!table_name || !record_id || !supabase) {
|
|
915
882
|
setFileUrl(null);
|
|
916
883
|
setFileReference(null);
|
|
@@ -1162,7 +1129,7 @@ function usePublicFileDisplay(table_name, record_id, organisation_id, category,
|
|
|
1162
1129
|
setIsLoading(false);
|
|
1163
1130
|
}
|
|
1164
1131
|
}, [table_name, record_id, organisation_id, category, supabase, cacheTtl, enableCache]);
|
|
1165
|
-
|
|
1132
|
+
useEffect(() => {
|
|
1166
1133
|
if (table_name && record_id) {
|
|
1167
1134
|
fetchFiles();
|
|
1168
1135
|
} else {
|
|
@@ -1175,7 +1142,7 @@ function usePublicFileDisplay(table_name, record_id, organisation_id, category,
|
|
|
1175
1142
|
setError(null);
|
|
1176
1143
|
}
|
|
1177
1144
|
}, [fetchFiles, table_name, record_id, organisation_id]);
|
|
1178
|
-
const refetch =
|
|
1145
|
+
const refetch = useCallback(async () => {
|
|
1179
1146
|
if (!table_name || !record_id) return;
|
|
1180
1147
|
if (enableCache) {
|
|
1181
1148
|
const cacheKey = `public_file_${table_name}_${record_id}_${organisation_id === void 0 ? "undefined" : organisation_id ?? "null"}_${category || "all"}`;
|
|
@@ -1209,9 +1176,6 @@ function getPublicFileDisplayCacheStats() {
|
|
|
1209
1176
|
};
|
|
1210
1177
|
}
|
|
1211
1178
|
|
|
1212
|
-
// src/hooks/useFileDisplay.ts
|
|
1213
|
-
import { useState as useState4, useEffect as useEffect5, useCallback as useCallback4, useRef as useRef3 } from "react";
|
|
1214
|
-
|
|
1215
1179
|
// src/utils/file-reference/index.ts
|
|
1216
1180
|
var log3 = createLogger("FileReferenceService");
|
|
1217
1181
|
var FileReferenceServiceImpl = class {
|
|
@@ -1270,6 +1234,19 @@ var FileReferenceServiceImpl = class {
|
|
|
1270
1234
|
authenticatedUserId = authUser.id;
|
|
1271
1235
|
log3.debug("Using authenticated user ID for user-scoped file upload", { userId: authenticatedUserId });
|
|
1272
1236
|
}
|
|
1237
|
+
let isSuperAdminUser = false;
|
|
1238
|
+
const userIdForCheck = authenticatedUserId || options.userId;
|
|
1239
|
+
if (userIdForCheck) {
|
|
1240
|
+
try {
|
|
1241
|
+
const { isSuperAdmin } = await import('./api-Y4MQWOFW.js');
|
|
1242
|
+
isSuperAdminUser = await isSuperAdmin(userIdForCheck);
|
|
1243
|
+
if (isSuperAdminUser) {
|
|
1244
|
+
log3.debug("Super admin detected - bypassing permission checks", { userId: userIdForCheck });
|
|
1245
|
+
}
|
|
1246
|
+
} catch (superAdminCheckError) {
|
|
1247
|
+
log3.warn("Failed to check super-admin status, proceeding with normal permission checks", superAdminCheckError);
|
|
1248
|
+
}
|
|
1249
|
+
}
|
|
1273
1250
|
const uploadResult = await uploadFile(this.supabase, file, {
|
|
1274
1251
|
appName: "file-reference",
|
|
1275
1252
|
orgId: options.organisation_id || void 0,
|
|
@@ -1296,6 +1273,17 @@ var FileReferenceServiceImpl = class {
|
|
|
1296
1273
|
if (!isUserScoped && options.organisation_id) {
|
|
1297
1274
|
await setOrganisationContext(this.supabase, options.organisation_id);
|
|
1298
1275
|
}
|
|
1276
|
+
let rpcUserId = null;
|
|
1277
|
+
if (authenticatedUserId) {
|
|
1278
|
+
rpcUserId = authenticatedUserId;
|
|
1279
|
+
} else if (options.userId) {
|
|
1280
|
+
rpcUserId = options.userId;
|
|
1281
|
+
} else {
|
|
1282
|
+
const { data: { user: authUser } } = await this.supabase.auth.getUser();
|
|
1283
|
+
if (authUser) {
|
|
1284
|
+
rpcUserId = authUser.id;
|
|
1285
|
+
}
|
|
1286
|
+
}
|
|
1299
1287
|
const { data, error } = await this.supabase.rpc("data_file_reference_create", {
|
|
1300
1288
|
p_table_name: options.table_name,
|
|
1301
1289
|
p_record_id: options.record_id,
|
|
@@ -1315,23 +1303,14 @@ var FileReferenceServiceImpl = class {
|
|
|
1315
1303
|
...options.custom_metadata
|
|
1316
1304
|
},
|
|
1317
1305
|
p_is_public: options.is_public || false,
|
|
1318
|
-
p_user_id:
|
|
1319
|
-
//
|
|
1306
|
+
p_user_id: rpcUserId
|
|
1307
|
+
// Always pass authenticated user ID for SECURITY DEFINER functions
|
|
1320
1308
|
});
|
|
1321
1309
|
if (error) {
|
|
1322
1310
|
await deleteFile(this.supabase, filePath, options.is_public || false);
|
|
1323
1311
|
throw new Error(`Failed to create file reference: ${error.message}`);
|
|
1324
1312
|
}
|
|
1325
1313
|
if (!data || data === null) {
|
|
1326
|
-
let isSuperAdminUser = false;
|
|
1327
|
-
try {
|
|
1328
|
-
const { data: { user: authUser } } = await this.supabase.auth.getUser();
|
|
1329
|
-
if (authUser) {
|
|
1330
|
-
isSuperAdminUser = await isSuperAdmin(authUser.id);
|
|
1331
|
-
}
|
|
1332
|
-
} catch (superAdminCheckError) {
|
|
1333
|
-
log3.warn("Failed to check super-admin status", superAdminCheckError);
|
|
1334
|
-
}
|
|
1335
1314
|
await deleteFile(this.supabase, filePath, options.is_public || false);
|
|
1336
1315
|
const appName = await this.getAppName(options.app_id).catch(() => "unknown");
|
|
1337
1316
|
const pageContextDisplay = options.pageContext || "undefined";
|
|
@@ -1684,20 +1663,20 @@ function useFileDisplay(table_name, record_id, organisation_id, category, option
|
|
|
1684
1663
|
enableCache = true,
|
|
1685
1664
|
supabase
|
|
1686
1665
|
} = options;
|
|
1687
|
-
const [fileUrl, setFileUrl] =
|
|
1688
|
-
const [fileReference, setFileReference] =
|
|
1689
|
-
const [fileReferences, setFileReferences] =
|
|
1690
|
-
const [fileUrls, setFileUrls] =
|
|
1691
|
-
const [fileCount, setFileCount] =
|
|
1692
|
-
const [isLoading, setIsLoading] =
|
|
1693
|
-
const [error, setError] =
|
|
1694
|
-
const isMountedRef =
|
|
1666
|
+
const [fileUrl, setFileUrl] = useState(null);
|
|
1667
|
+
const [fileReference, setFileReference] = useState(null);
|
|
1668
|
+
const [fileReferences, setFileReferences] = useState([]);
|
|
1669
|
+
const [fileUrls, setFileUrls] = useState(/* @__PURE__ */ new Map());
|
|
1670
|
+
const [fileCount, setFileCount] = useState(0);
|
|
1671
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
1672
|
+
const [error, setError] = useState(null);
|
|
1673
|
+
const isMountedRef = useRef(true);
|
|
1695
1674
|
const safeSetState = (setter, value) => {
|
|
1696
1675
|
if (isMountedRef.current) {
|
|
1697
1676
|
setter(value);
|
|
1698
1677
|
}
|
|
1699
1678
|
};
|
|
1700
|
-
const fetchFiles =
|
|
1679
|
+
const fetchFiles = useCallback(async () => {
|
|
1701
1680
|
if (!table_name || !record_id || !supabase) {
|
|
1702
1681
|
safeSetState(setFileUrl, null);
|
|
1703
1682
|
safeSetState(setFileReference, null);
|
|
@@ -2046,7 +2025,7 @@ function useFileDisplay(table_name, record_id, organisation_id, category, option
|
|
|
2046
2025
|
safeSetState(setIsLoading, false);
|
|
2047
2026
|
}
|
|
2048
2027
|
}, [table_name, record_id, organisation_id, category, supabase, cacheTtl, enableCache]);
|
|
2049
|
-
|
|
2028
|
+
useEffect(() => {
|
|
2050
2029
|
isMountedRef.current = true;
|
|
2051
2030
|
if (table_name && record_id && supabase) {
|
|
2052
2031
|
fetchFiles().catch((err) => {
|
|
@@ -2067,7 +2046,7 @@ function useFileDisplay(table_name, record_id, organisation_id, category, option
|
|
|
2067
2046
|
isMountedRef.current = false;
|
|
2068
2047
|
};
|
|
2069
2048
|
}, [table_name, record_id, organisation_id, supabase]);
|
|
2070
|
-
const refetch =
|
|
2049
|
+
const refetch = useCallback(async () => {
|
|
2071
2050
|
if (!table_name || !record_id || !supabase) return;
|
|
2072
2051
|
if (enableCache) {
|
|
2073
2052
|
const cacheKey = `file_${table_name}_${record_id}_${organisation_id === void 0 ? "undefined" : organisation_id ?? "null"}_${category || "all"}`;
|
|
@@ -2108,29 +2087,12 @@ function invalidateFileDisplayCache(table_name, record_id, organisation_id, cate
|
|
|
2108
2087
|
authenticatedFileCache.delete(allCategoryKey);
|
|
2109
2088
|
}
|
|
2110
2089
|
}
|
|
2111
|
-
|
|
2112
|
-
// src/hooks/useEventTheme.ts
|
|
2113
|
-
import { useEffect as useEffect6 } from "react";
|
|
2114
|
-
import { useLocation } from "react-router-dom";
|
|
2115
|
-
var log4 = createLogger("useEventTheme");
|
|
2116
2090
|
function useEventTheme(event) {
|
|
2117
2091
|
const location = useLocation();
|
|
2118
|
-
|
|
2119
|
-
|
|
2120
|
-
|
|
2121
|
-
|
|
2122
|
-
selectedEvent = eventsContext.selectedEvent;
|
|
2123
|
-
} else {
|
|
2124
|
-
selectedEvent = event;
|
|
2125
|
-
}
|
|
2126
|
-
} catch (error) {
|
|
2127
|
-
if (event !== void 0) {
|
|
2128
|
-
selectedEvent = event;
|
|
2129
|
-
} else {
|
|
2130
|
-
selectedEvent = null;
|
|
2131
|
-
}
|
|
2132
|
-
}
|
|
2133
|
-
useEffect6(() => {
|
|
2092
|
+
const eventServiceContext = useContext(EventServiceContext);
|
|
2093
|
+
const eventsContextSelectedEvent = eventServiceContext?.eventService?.getSelectedEvent() ?? null;
|
|
2094
|
+
const selectedEvent = event !== void 0 ? event : eventsContextSelectedEvent;
|
|
2095
|
+
useEffect(() => {
|
|
2134
2096
|
const isOnLoginRoute = location.pathname === "/login" || location.pathname.startsWith("/login");
|
|
2135
2097
|
if (isOnLoginRoute) {
|
|
2136
2098
|
clearPalette();
|
|
@@ -2149,20 +2111,16 @@ function useEventTheme(event) {
|
|
|
2149
2111
|
try {
|
|
2150
2112
|
applyPalette(normalized);
|
|
2151
2113
|
} catch (error) {
|
|
2152
|
-
log4.error("Failed to apply event palette:", error);
|
|
2153
2114
|
}
|
|
2154
2115
|
return () => {
|
|
2155
2116
|
};
|
|
2156
2117
|
}, [selectedEvent, location.pathname]);
|
|
2157
2118
|
}
|
|
2158
|
-
|
|
2159
|
-
// src/hooks/usePreventTabReload.ts
|
|
2160
|
-
import { useEffect as useEffect7, useRef as useRef4 } from "react";
|
|
2161
2119
|
function usePreventTabReload(options = {}) {
|
|
2162
2120
|
const { enabled = true, gracePeriodMs = 2e3 } = options;
|
|
2163
|
-
const isRestoringFromCacheRef =
|
|
2164
|
-
const gracePeriodTimeoutRef =
|
|
2165
|
-
|
|
2121
|
+
const isRestoringFromCacheRef = useRef(false);
|
|
2122
|
+
const gracePeriodTimeoutRef = useRef(null);
|
|
2123
|
+
useEffect(() => {
|
|
2166
2124
|
if (!enabled || typeof window === "undefined") return;
|
|
2167
2125
|
const handlePageShow = (event) => {
|
|
2168
2126
|
if (event.persisted) {
|
|
@@ -2198,40 +2156,4 @@ function usePreventTabReload(options = {}) {
|
|
|
2198
2156
|
}, [enabled, gracePeriodMs]);
|
|
2199
2157
|
}
|
|
2200
2158
|
|
|
2201
|
-
export {
|
|
2202
|
-
useDebounce,
|
|
2203
|
-
cleanupQueryCache,
|
|
2204
|
-
useQueryCache,
|
|
2205
|
-
queryCacheHelpers,
|
|
2206
|
-
useAddressAutocomplete,
|
|
2207
|
-
FILE_SIZE_LIMITS,
|
|
2208
|
-
DEFAULT_FILE_SIZE_LIMIT,
|
|
2209
|
-
APP_PATH_MAPPING,
|
|
2210
|
-
STORAGE_CONFIG,
|
|
2211
|
-
getFileSizeLimit,
|
|
2212
|
-
getBucketName,
|
|
2213
|
-
validateFileSize,
|
|
2214
|
-
generateFilePath,
|
|
2215
|
-
generateUniqueFileName,
|
|
2216
|
-
extractFileMetadata,
|
|
2217
|
-
uploadFile,
|
|
2218
|
-
getPublicUrl,
|
|
2219
|
-
getSignedUrl,
|
|
2220
|
-
generateFileUrlsBatch,
|
|
2221
|
-
deleteFile,
|
|
2222
|
-
listFiles,
|
|
2223
|
-
downloadFile,
|
|
2224
|
-
archiveFile,
|
|
2225
|
-
usePublicFileDisplay,
|
|
2226
|
-
clearPublicFileDisplayCache,
|
|
2227
|
-
getPublicFileDisplayCacheStats,
|
|
2228
|
-
createFileReferenceService,
|
|
2229
|
-
uploadFileWithReference,
|
|
2230
|
-
useFileDisplay,
|
|
2231
|
-
clearFileDisplayCache,
|
|
2232
|
-
getFileDisplayCacheStats,
|
|
2233
|
-
invalidateFileDisplayCache,
|
|
2234
|
-
useEventTheme,
|
|
2235
|
-
usePreventTabReload
|
|
2236
|
-
};
|
|
2237
|
-
//# sourceMappingURL=chunk-UPPMRMYG.js.map
|
|
2159
|
+
export { APP_PATH_MAPPING, DEFAULT_FILE_SIZE_LIMIT, FILE_SIZE_LIMITS, STORAGE_CONFIG, archiveFile, cleanupQueryCache, clearFileDisplayCache, clearPublicFileDisplayCache, createFileReferenceService, deleteFile, downloadFile, extractFileMetadata, generateFilePath, generateFileUrlsBatch, generateUniqueFileName, getBucketName, getFileDisplayCacheStats, getFileSizeLimit, getPublicFileDisplayCacheStats, getPublicUrl, getSignedUrl, invalidateFileDisplayCache, listFiles, queryCacheHelpers, uploadFile, uploadFileWithReference, useAddressAutocomplete, useDebounce, useEventTheme, useFileDisplay, usePreventTabReload, usePublicFileDisplay, useQueryCache, validateFileSize };
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { Button } from './chunk-BM4CQ5P3.js';
|
|
2
|
+
import { ShieldX } from 'lucide-react';
|
|
3
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
4
|
+
|
|
5
|
+
function AccessDenied({
|
|
6
|
+
message,
|
|
7
|
+
resource,
|
|
8
|
+
operation,
|
|
9
|
+
onGoBack,
|
|
10
|
+
onSignOut,
|
|
11
|
+
className = "",
|
|
12
|
+
showSignOut = false
|
|
13
|
+
}) {
|
|
14
|
+
const defaultMessage = message || (resource && operation ? `You don't have permission to ${operation} ${resource}.` : "You don't have permission to access this page.");
|
|
15
|
+
const handleGoBack = () => {
|
|
16
|
+
if (onGoBack) {
|
|
17
|
+
onGoBack();
|
|
18
|
+
} else {
|
|
19
|
+
window.history.back();
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
const handleSignOut = () => {
|
|
23
|
+
if (onSignOut) {
|
|
24
|
+
onSignOut();
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
return /* @__PURE__ */ jsx(
|
|
28
|
+
"main",
|
|
29
|
+
{
|
|
30
|
+
className: `flex flex-col items-center justify-center min-h-[400px] p-8 text-center ${className}`,
|
|
31
|
+
role: "alert",
|
|
32
|
+
"aria-live": "polite",
|
|
33
|
+
children: /* @__PURE__ */ jsxs("section", { className: "max-w-md", children: [
|
|
34
|
+
/* @__PURE__ */ jsx("div", { className: "mb-6 flex justify-center", children: /* @__PURE__ */ jsx(ShieldX, { className: "size-16 text-acc-500", "aria-hidden": "true" }) }),
|
|
35
|
+
/* @__PURE__ */ jsx("h2", { className: "text-2xl font-semibold text-sec-900 mb-3", children: "Access Denied" }),
|
|
36
|
+
/* @__PURE__ */ jsx("p", { className: "text-sec-600 mb-6", children: defaultMessage }),
|
|
37
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col sm:flex-row gap-3 justify-center", children: [
|
|
38
|
+
/* @__PURE__ */ jsx(
|
|
39
|
+
Button,
|
|
40
|
+
{
|
|
41
|
+
onClick: handleGoBack,
|
|
42
|
+
variant: "default",
|
|
43
|
+
"aria-label": "Go back to previous page",
|
|
44
|
+
children: "Go Back"
|
|
45
|
+
}
|
|
46
|
+
),
|
|
47
|
+
showSignOut && onSignOut && /* @__PURE__ */ jsx(
|
|
48
|
+
Button,
|
|
49
|
+
{
|
|
50
|
+
onClick: handleSignOut,
|
|
51
|
+
variant: "outline",
|
|
52
|
+
"aria-label": "Sign out of your account",
|
|
53
|
+
children: "Sign Out"
|
|
54
|
+
}
|
|
55
|
+
)
|
|
56
|
+
] })
|
|
57
|
+
] })
|
|
58
|
+
}
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export { AccessDenied };
|
|
@@ -1,9 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
} from "./chunk-PWLANIRT.js";
|
|
1
|
+
import { createLogger } from './chunk-TTRFSOKR.js';
|
|
2
|
+
import { useRef, useEffect } from 'react';
|
|
4
3
|
|
|
5
|
-
// src/hooks/useComponentPerformance.ts
|
|
6
|
-
import { useEffect, useRef } from "react";
|
|
7
4
|
var log = createLogger("useComponentPerformance");
|
|
8
5
|
function useComponentPerformance({
|
|
9
6
|
componentName,
|
|
@@ -31,7 +28,4 @@ function useComponentPerformance({
|
|
|
31
28
|
};
|
|
32
29
|
}
|
|
33
30
|
|
|
34
|
-
export {
|
|
35
|
-
useComponentPerformance
|
|
36
|
-
};
|
|
37
|
-
//# sourceMappingURL=chunk-E66EQZE6.js.map
|
|
31
|
+
export { useComponentPerformance };
|
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
import { clsx } from 'clsx';
|
|
2
|
+
import { twMerge } from 'tailwind-merge';
|
|
3
|
+
|
|
4
|
+
// src/utils/core/cn.ts
|
|
5
|
+
function cn(...inputs) {
|
|
6
|
+
return twMerge(clsx(inputs));
|
|
7
|
+
}
|
|
8
|
+
|
|
1
9
|
// src/utils/performance/performanceBudgets.ts
|
|
2
10
|
var PERFORMANCE_BUDGETS = {
|
|
3
11
|
COMPONENT_RENDER: { threshold: 50 },
|
|
@@ -69,8 +77,4 @@ performanceBudgetMonitor.setBudget("CHUNK_COUNT", 10, "warning");
|
|
|
69
77
|
performanceBudgetMonitor.setBudget("TREESHAKING_SCORE", 70, "warning");
|
|
70
78
|
performanceBudgetMonitor.setBudget("ERROR_BOUNDARY_TRIGGER", 5, "error");
|
|
71
79
|
|
|
72
|
-
export {
|
|
73
|
-
PERFORMANCE_BUDGETS,
|
|
74
|
-
performanceBudgetMonitor
|
|
75
|
-
};
|
|
76
|
-
//# sourceMappingURL=chunk-FMUCXFII.js.map
|
|
80
|
+
export { PERFORMANCE_BUDGETS, cn, performanceBudgetMonitor };
|
|
@@ -1,9 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
import { clsx } from "clsx";
|
|
3
|
-
import { twMerge } from "tailwind-merge";
|
|
4
|
-
function cn(...inputs) {
|
|
5
|
-
return twMerge(clsx(inputs));
|
|
6
|
-
}
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
7
2
|
|
|
8
3
|
// src/utils/validation/htmlSanitization.ts
|
|
9
4
|
function sanitizeHtml(html) {
|
|
@@ -58,11 +53,18 @@ function renderSafeHtml(html, options = {}) {
|
|
|
58
53
|
warnings: validation.warnings
|
|
59
54
|
};
|
|
60
55
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
56
|
+
var LoadingSpinner = ({
|
|
57
|
+
size = "md",
|
|
58
|
+
className = ""
|
|
59
|
+
}) => {
|
|
60
|
+
const sizeClasses = {
|
|
61
|
+
sm: "size-4",
|
|
62
|
+
md: "size-6",
|
|
63
|
+
lg: "size-8"
|
|
64
|
+
};
|
|
65
|
+
const validSize = size && size in sizeClasses ? size : "md";
|
|
66
|
+
const sizeClass = sizeClasses[validSize];
|
|
67
|
+
return /* @__PURE__ */ jsx("canvas", { className: `inline-block animate-spin rounded-full border-2 border-solid border-current border-r-transparent motion-reduce:animate-[spin_1.5s_linear_infinite] ${sizeClass} ${className}`.trim(), role: "status", children: /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Loading..." }) });
|
|
67
68
|
};
|
|
68
|
-
|
|
69
|
+
|
|
70
|
+
export { LoadingSpinner, renderSafeHtml, sanitizeHtml, validateHtml };
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
logger
|
|
3
|
-
} from "./chunk-PWLANIRT.js";
|
|
1
|
+
import { logger } from './chunk-TTRFSOKR.js';
|
|
4
2
|
|
|
5
3
|
// src/rbac/audit-batched.ts
|
|
6
4
|
var DEFAULT_CONFIG = {
|
|
@@ -422,11 +420,4 @@ async function emitAuditEvent(event) {
|
|
|
422
420
|
}
|
|
423
421
|
}
|
|
424
422
|
|
|
425
|
-
export {
|
|
426
|
-
RBACAuditManager,
|
|
427
|
-
createAuditManager,
|
|
428
|
-
setGlobalAuditManager,
|
|
429
|
-
getGlobalAuditManager,
|
|
430
|
-
emitAuditEvent
|
|
431
|
-
};
|
|
432
|
-
//# sourceMappingURL=chunk-63FOKYGO.js.map
|
|
423
|
+
export { RBACAuditManager, createAuditManager, emitAuditEvent, getGlobalAuditManager, setGlobalAuditManager };
|