@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,20 +1,71 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
1
|
+
import { emitAuditEvent, createAuditManager, setGlobalAuditManager } from './chunk-AHU7G2R5.js';
|
|
2
|
+
import { createLogger } from './chunk-TTRFSOKR.js';
|
|
3
|
+
|
|
4
|
+
// src/rbac/types.ts
|
|
5
|
+
var RBACError = class extends Error {
|
|
6
|
+
constructor(message, code, context) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.code = code;
|
|
9
|
+
this.context = context;
|
|
10
|
+
this.name = "RBACError";
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
var PermissionDeniedError = class extends RBACError {
|
|
14
|
+
constructor(permission, context) {
|
|
15
|
+
super(
|
|
16
|
+
`Permission denied: ${permission}`,
|
|
17
|
+
"PERMISSION_DENIED",
|
|
18
|
+
{ permission, ...context }
|
|
19
|
+
);
|
|
20
|
+
this.name = "PermissionDeniedError";
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
var OrganisationContextRequiredError = class extends RBACError {
|
|
24
|
+
constructor() {
|
|
25
|
+
super(
|
|
26
|
+
"Organisation context is required for this operation",
|
|
27
|
+
"ORGANISATION_CONTEXT_REQUIRED"
|
|
28
|
+
);
|
|
29
|
+
this.name = "OrganisationContextRequiredError";
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
var EventContextRequiredError = class extends RBACError {
|
|
33
|
+
constructor() {
|
|
34
|
+
super(
|
|
35
|
+
"Event context is required for this operation",
|
|
36
|
+
"EVENT_CONTEXT_REQUIRED"
|
|
37
|
+
);
|
|
38
|
+
this.name = "EventContextRequiredError";
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
var RBACNotInitializedError = class extends RBACError {
|
|
42
|
+
constructor() {
|
|
43
|
+
super(
|
|
44
|
+
"RBAC system not initialized. Please call setupRBAC(supabase) before using any RBAC components or hooks. See: https://docs.pace-core.dev/rbac/setup",
|
|
45
|
+
"RBAC_NOT_INITIALIZED"
|
|
46
|
+
);
|
|
47
|
+
this.name = "RBACNotInitializedError";
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
var InvalidScopeError = class extends RBACError {
|
|
51
|
+
constructor(scope, reason) {
|
|
52
|
+
super(
|
|
53
|
+
`Invalid scope provided: ${JSON.stringify(scope)}. ${reason}`,
|
|
54
|
+
"INVALID_SCOPE",
|
|
55
|
+
{ scope, reason }
|
|
56
|
+
);
|
|
57
|
+
this.name = "InvalidScopeError";
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
var MissingUserContextError = class extends RBACError {
|
|
61
|
+
constructor() {
|
|
62
|
+
super(
|
|
63
|
+
"User context is required but not available. Make sure to wrap your app with an auth provider.",
|
|
64
|
+
"MISSING_USER_CONTEXT"
|
|
65
|
+
);
|
|
66
|
+
this.name = "MissingUserContextError";
|
|
67
|
+
}
|
|
68
|
+
};
|
|
18
69
|
|
|
19
70
|
// src/rbac/cache.ts
|
|
20
71
|
var RBACCache = class {
|
|
@@ -512,7 +563,6 @@ var RBACCacheInvalidationManager = class {
|
|
|
512
563
|
var globalCacheInvalidationManager = null;
|
|
513
564
|
function initializeCacheInvalidation(supabase) {
|
|
514
565
|
if (globalCacheInvalidationManager) {
|
|
515
|
-
log.debug("Cleaning up existing cache invalidation manager before creating new one");
|
|
516
566
|
globalCacheInvalidationManager.cleanup();
|
|
517
567
|
}
|
|
518
568
|
globalCacheInvalidationManager = new RBACCacheInvalidationManager(supabase);
|
|
@@ -554,8 +604,6 @@ function categorizeError(error) {
|
|
|
554
604
|
return "validation_error" /* VALIDATION */;
|
|
555
605
|
case "MISSING_USER_CONTEXT":
|
|
556
606
|
return "authentication_error" /* AUTHENTICATION */;
|
|
557
|
-
default:
|
|
558
|
-
break;
|
|
559
607
|
}
|
|
560
608
|
}
|
|
561
609
|
if (error && typeof error === "object") {
|
|
@@ -1141,27 +1189,27 @@ var RBACEngine = class {
|
|
|
1141
1189
|
});
|
|
1142
1190
|
return false;
|
|
1143
1191
|
}
|
|
1144
|
-
const
|
|
1145
|
-
rbacCache.set(cacheKey,
|
|
1192
|
+
const hasPermission = data === true;
|
|
1193
|
+
rbacCache.set(cacheKey, hasPermission, 6e4);
|
|
1146
1194
|
const duration = Date.now() - startTime;
|
|
1147
1195
|
if (scope.organisationId) {
|
|
1148
1196
|
const resolvedPageId = await this.resolvePageId(pageId, scope.appId);
|
|
1149
1197
|
await emitAuditEvent({
|
|
1150
|
-
type:
|
|
1198
|
+
type: hasPermission ? "permission_check" : "permission_denied",
|
|
1151
1199
|
userId,
|
|
1152
1200
|
organisationId: scope.organisationId,
|
|
1153
1201
|
eventId: scope.eventId,
|
|
1154
1202
|
appId: scope.appId,
|
|
1155
1203
|
pageId: resolvedPageId,
|
|
1156
1204
|
permission,
|
|
1157
|
-
decision:
|
|
1205
|
+
decision: hasPermission,
|
|
1158
1206
|
source: "api",
|
|
1159
1207
|
duration_ms: duration,
|
|
1160
1208
|
cache_hit: cacheHit,
|
|
1161
1209
|
cache_source: cacheSource
|
|
1162
1210
|
});
|
|
1163
1211
|
}
|
|
1164
|
-
return
|
|
1212
|
+
return hasPermission;
|
|
1165
1213
|
} catch (error) {
|
|
1166
1214
|
const category = categorizeError(error);
|
|
1167
1215
|
const eventType = mapErrorCategoryToSecurityEventType(category);
|
|
@@ -1280,7 +1328,7 @@ var RBACEngine = class {
|
|
|
1280
1328
|
for (const page of pages) {
|
|
1281
1329
|
for (const operation of ["read", "create", "update", "delete"]) {
|
|
1282
1330
|
const permissionString = `${operation}:page.${page.page_name}`;
|
|
1283
|
-
const
|
|
1331
|
+
const hasPermission = await this.isPermitted(
|
|
1284
1332
|
{
|
|
1285
1333
|
userId,
|
|
1286
1334
|
scope,
|
|
@@ -1290,7 +1338,7 @@ var RBACEngine = class {
|
|
|
1290
1338
|
securityContext
|
|
1291
1339
|
);
|
|
1292
1340
|
const permissionKey = permissionString;
|
|
1293
|
-
permissionMap[permissionKey] =
|
|
1341
|
+
permissionMap[permissionKey] = hasPermission;
|
|
1294
1342
|
}
|
|
1295
1343
|
}
|
|
1296
1344
|
}
|
|
@@ -1607,11 +1655,194 @@ function getInFlightRequestCount() {
|
|
|
1607
1655
|
return inFlightRequests.size;
|
|
1608
1656
|
}
|
|
1609
1657
|
|
|
1658
|
+
// src/rbac/utils/eventContext.ts
|
|
1659
|
+
var orgDerivationCache = /* @__PURE__ */ new Map();
|
|
1660
|
+
var MAX_CACHE_SIZE = 100;
|
|
1661
|
+
async function getOrganisationFromEvent(supabase, eventId) {
|
|
1662
|
+
if (orgDerivationCache.has(eventId)) {
|
|
1663
|
+
return orgDerivationCache.get(eventId) ?? null;
|
|
1664
|
+
}
|
|
1665
|
+
const { data, error } = await supabase.from("core_events").select("organisation_id").eq("event_id", eventId).single();
|
|
1666
|
+
let organisationId = null;
|
|
1667
|
+
if (error || !data) {
|
|
1668
|
+
organisationId = null;
|
|
1669
|
+
} else if (data.organisation_id) {
|
|
1670
|
+
organisationId = data.organisation_id;
|
|
1671
|
+
} else {
|
|
1672
|
+
organisationId = null;
|
|
1673
|
+
}
|
|
1674
|
+
if (orgDerivationCache.size >= MAX_CACHE_SIZE) {
|
|
1675
|
+
const firstKey = orgDerivationCache.keys().next().value;
|
|
1676
|
+
if (firstKey) {
|
|
1677
|
+
orgDerivationCache.delete(firstKey);
|
|
1678
|
+
}
|
|
1679
|
+
}
|
|
1680
|
+
orgDerivationCache.set(eventId, organisationId);
|
|
1681
|
+
return organisationId;
|
|
1682
|
+
}
|
|
1683
|
+
|
|
1684
|
+
// src/rbac/utils/contextValidator.ts
|
|
1685
|
+
var log3 = createLogger("ContextValidator");
|
|
1686
|
+
function allowsOptionalContexts(appName) {
|
|
1687
|
+
return appName === "PORTAL" || appName === "ADMIN";
|
|
1688
|
+
}
|
|
1689
|
+
var ContextValidator = class {
|
|
1690
|
+
/**
|
|
1691
|
+
* Derive organisation ID from event ID
|
|
1692
|
+
*
|
|
1693
|
+
* @param supabase - Supabase client
|
|
1694
|
+
* @param eventId - Event ID
|
|
1695
|
+
* @returns Organisation ID or null
|
|
1696
|
+
*/
|
|
1697
|
+
static async deriveOrgFromEvent(supabase, eventId) {
|
|
1698
|
+
return getOrganisationFromEvent(supabase, eventId);
|
|
1699
|
+
}
|
|
1700
|
+
/**
|
|
1701
|
+
* Resolve scope based on page-level scope_type
|
|
1702
|
+
*
|
|
1703
|
+
* This method handles page-level scoping. All pages have explicit scope_type set.
|
|
1704
|
+
* Used for hybrid apps that have both event and organisation pages.
|
|
1705
|
+
*
|
|
1706
|
+
* @param scope - Current scope
|
|
1707
|
+
* @param pageScopeType - Page scope type ('event', 'organisation', or 'both')
|
|
1708
|
+
* @param appName - App name (for PORTAL/ADMIN special case)
|
|
1709
|
+
* @param supabase - Supabase client (for deriving org from event, only if not already provided)
|
|
1710
|
+
* @param immediateOrganisationId - Optional immediate organisation ID (from selectedEvent.organisation_id) - avoids querying
|
|
1711
|
+
* @returns Resolved scope with all required context
|
|
1712
|
+
*/
|
|
1713
|
+
static async resolveScopeForPage(scope, pageScopeType, appName, supabase, immediateOrganisationId) {
|
|
1714
|
+
const effectiveScopeType = pageScopeType;
|
|
1715
|
+
if (effectiveScopeType === "both") {
|
|
1716
|
+
if (!scope.organisationId && !scope.eventId) {
|
|
1717
|
+
if (allowsOptionalContexts(appName)) {
|
|
1718
|
+
return {
|
|
1719
|
+
isValid: true,
|
|
1720
|
+
resolvedScope: {
|
|
1721
|
+
organisationId: void 0,
|
|
1722
|
+
eventId: void 0,
|
|
1723
|
+
appId: scope.appId
|
|
1724
|
+
},
|
|
1725
|
+
error: null
|
|
1726
|
+
};
|
|
1727
|
+
}
|
|
1728
|
+
return {
|
|
1729
|
+
isValid: false,
|
|
1730
|
+
resolvedScope: null,
|
|
1731
|
+
error: new Error("Page requires either organisation or event context")
|
|
1732
|
+
};
|
|
1733
|
+
}
|
|
1734
|
+
let organisationId = scope.organisationId || immediateOrganisationId || void 0;
|
|
1735
|
+
if (!organisationId && scope.eventId && supabase) {
|
|
1736
|
+
try {
|
|
1737
|
+
const derivedOrgId = await this.deriveOrgFromEvent(supabase, scope.eventId);
|
|
1738
|
+
organisationId = derivedOrgId || void 0;
|
|
1739
|
+
} catch (error) {
|
|
1740
|
+
log3.warn("Failed to derive org from event for both-scope page:", error);
|
|
1741
|
+
}
|
|
1742
|
+
}
|
|
1743
|
+
return {
|
|
1744
|
+
isValid: true,
|
|
1745
|
+
resolvedScope: {
|
|
1746
|
+
organisationId,
|
|
1747
|
+
eventId: scope.eventId,
|
|
1748
|
+
appId: scope.appId
|
|
1749
|
+
},
|
|
1750
|
+
error: null
|
|
1751
|
+
};
|
|
1752
|
+
}
|
|
1753
|
+
if (effectiveScopeType === "event") {
|
|
1754
|
+
if (!scope.eventId) {
|
|
1755
|
+
if (allowsOptionalContexts(appName)) {
|
|
1756
|
+
return {
|
|
1757
|
+
isValid: true,
|
|
1758
|
+
resolvedScope: {
|
|
1759
|
+
organisationId: scope.organisationId,
|
|
1760
|
+
eventId: void 0,
|
|
1761
|
+
appId: scope.appId
|
|
1762
|
+
},
|
|
1763
|
+
error: null
|
|
1764
|
+
};
|
|
1765
|
+
}
|
|
1766
|
+
return {
|
|
1767
|
+
isValid: false,
|
|
1768
|
+
resolvedScope: null,
|
|
1769
|
+
error: new EventContextRequiredError()
|
|
1770
|
+
};
|
|
1771
|
+
}
|
|
1772
|
+
let organisationId = scope.organisationId || immediateOrganisationId || void 0;
|
|
1773
|
+
if (!organisationId && supabase && scope.eventId) {
|
|
1774
|
+
try {
|
|
1775
|
+
const derivedOrgId = await this.deriveOrgFromEvent(supabase, scope.eventId);
|
|
1776
|
+
organisationId = derivedOrgId || void 0;
|
|
1777
|
+
if (!organisationId) {
|
|
1778
|
+
return {
|
|
1779
|
+
isValid: false,
|
|
1780
|
+
resolvedScope: null,
|
|
1781
|
+
error: new Error("Could not resolve organisation from event context")
|
|
1782
|
+
};
|
|
1783
|
+
}
|
|
1784
|
+
} catch (error) {
|
|
1785
|
+
log3.error("Failed to derive org from event:", error);
|
|
1786
|
+
return {
|
|
1787
|
+
isValid: false,
|
|
1788
|
+
resolvedScope: null,
|
|
1789
|
+
error: error instanceof Error ? error : new Error("Failed to derive organisation from event")
|
|
1790
|
+
};
|
|
1791
|
+
}
|
|
1792
|
+
}
|
|
1793
|
+
return {
|
|
1794
|
+
isValid: true,
|
|
1795
|
+
resolvedScope: {
|
|
1796
|
+
organisationId,
|
|
1797
|
+
eventId: scope.eventId,
|
|
1798
|
+
appId: scope.appId
|
|
1799
|
+
},
|
|
1800
|
+
error: null
|
|
1801
|
+
};
|
|
1802
|
+
}
|
|
1803
|
+
if (effectiveScopeType === "organisation") {
|
|
1804
|
+
if (!scope.organisationId) {
|
|
1805
|
+
if (allowsOptionalContexts(appName)) {
|
|
1806
|
+
return {
|
|
1807
|
+
isValid: true,
|
|
1808
|
+
resolvedScope: {
|
|
1809
|
+
organisationId: void 0,
|
|
1810
|
+
eventId: scope.eventId,
|
|
1811
|
+
appId: scope.appId
|
|
1812
|
+
},
|
|
1813
|
+
error: null
|
|
1814
|
+
};
|
|
1815
|
+
}
|
|
1816
|
+
return {
|
|
1817
|
+
isValid: false,
|
|
1818
|
+
resolvedScope: null,
|
|
1819
|
+
error: new OrganisationContextRequiredError()
|
|
1820
|
+
};
|
|
1821
|
+
}
|
|
1822
|
+
return {
|
|
1823
|
+
isValid: true,
|
|
1824
|
+
resolvedScope: {
|
|
1825
|
+
organisationId: scope.organisationId,
|
|
1826
|
+
eventId: scope.eventId,
|
|
1827
|
+
// Event is optional for org-scoped pages
|
|
1828
|
+
appId: scope.appId
|
|
1829
|
+
},
|
|
1830
|
+
error: null
|
|
1831
|
+
};
|
|
1832
|
+
}
|
|
1833
|
+
return {
|
|
1834
|
+
isValid: false,
|
|
1835
|
+
resolvedScope: null,
|
|
1836
|
+
error: new Error("Invalid scope type")
|
|
1837
|
+
};
|
|
1838
|
+
}
|
|
1839
|
+
};
|
|
1840
|
+
|
|
1610
1841
|
// src/rbac/api.ts
|
|
1611
|
-
var
|
|
1842
|
+
var log4 = createLogger("RBACAPI");
|
|
1612
1843
|
var globalEngine = null;
|
|
1613
1844
|
function setupRBAC(supabase, config) {
|
|
1614
|
-
|
|
1845
|
+
getRBACLogger();
|
|
1615
1846
|
const isDevelopment = import.meta.env.MODE === "development";
|
|
1616
1847
|
const fullConfig = {
|
|
1617
1848
|
supabase,
|
|
@@ -1753,7 +1984,7 @@ async function isPermitted(input, appName, precomputedSuperAdmin = null) {
|
|
|
1753
1984
|
}
|
|
1754
1985
|
pageScopeType = scopeType;
|
|
1755
1986
|
} catch (err) {
|
|
1756
|
-
|
|
1987
|
+
log4.error("Failed to get page scope type:", err);
|
|
1757
1988
|
throw new Error(`Failed to determine page scope type: ${err instanceof Error ? err.message : String(err)}`);
|
|
1758
1989
|
}
|
|
1759
1990
|
} else {
|
|
@@ -1840,17 +2071,14 @@ async function isPermittedCached(input, appName) {
|
|
|
1840
2071
|
return result;
|
|
1841
2072
|
});
|
|
1842
2073
|
}
|
|
1843
|
-
async function hasPermission(input) {
|
|
1844
|
-
return isPermitted(input);
|
|
1845
|
-
}
|
|
1846
2074
|
async function hasAnyPermission(input) {
|
|
1847
2075
|
const { permissions, ...baseInput } = input;
|
|
1848
2076
|
for (const permission of permissions) {
|
|
1849
|
-
const
|
|
2077
|
+
const hasPermission = await isPermitted({
|
|
1850
2078
|
...baseInput,
|
|
1851
2079
|
permission
|
|
1852
2080
|
});
|
|
1853
|
-
if (
|
|
2081
|
+
if (hasPermission) {
|
|
1854
2082
|
return true;
|
|
1855
2083
|
}
|
|
1856
2084
|
}
|
|
@@ -1859,11 +2087,11 @@ async function hasAnyPermission(input) {
|
|
|
1859
2087
|
async function hasAllPermissions(input) {
|
|
1860
2088
|
const { permissions, ...baseInput } = input;
|
|
1861
2089
|
for (const permission of permissions) {
|
|
1862
|
-
const
|
|
2090
|
+
const hasPermission = await isPermitted({
|
|
1863
2091
|
...baseInput,
|
|
1864
2092
|
permission
|
|
1865
2093
|
});
|
|
1866
|
-
if (!
|
|
2094
|
+
if (!hasPermission) {
|
|
1867
2095
|
return false;
|
|
1868
2096
|
}
|
|
1869
2097
|
}
|
|
@@ -1893,19 +2121,17 @@ async function getPageScopeType(pageId, appId, appName) {
|
|
|
1893
2121
|
if (!uuidRegex.test(resolvedPageId)) {
|
|
1894
2122
|
throw new Error(`Could not resolve pageId ${pageId} to a valid UUID`);
|
|
1895
2123
|
}
|
|
1896
|
-
const { data, error } = await engine["supabase"].
|
|
1897
|
-
p_page_id: resolvedPageId
|
|
1898
|
-
});
|
|
2124
|
+
const { data: pageData, error } = await engine["supabase"].from("rbac_app_pages").select("scope_type").eq("id", resolvedPageId).single();
|
|
1899
2125
|
if (error) {
|
|
1900
|
-
|
|
2126
|
+
log4.error("Error fetching page scope type:", { pageId, appId, error });
|
|
1901
2127
|
throw new Error(`Failed to get page scope type: ${error.message}`);
|
|
1902
2128
|
}
|
|
1903
|
-
if (!
|
|
2129
|
+
if (!pageData || !pageData.scope_type) {
|
|
1904
2130
|
throw new Error(`Page ${resolvedPageId} does not have scope_type set`);
|
|
1905
2131
|
}
|
|
1906
|
-
return
|
|
2132
|
+
return pageData.scope_type;
|
|
1907
2133
|
} catch (err) {
|
|
1908
|
-
|
|
2134
|
+
log4.error("Error fetching page scope type:", err);
|
|
1909
2135
|
throw err instanceof Error ? err : new Error(`Failed to get page scope type: ${String(err)}`);
|
|
1910
2136
|
}
|
|
1911
2137
|
}
|
|
@@ -1948,46 +2174,4 @@ function clearCache() {
|
|
|
1948
2174
|
rbacCache.clear();
|
|
1949
2175
|
}
|
|
1950
2176
|
|
|
1951
|
-
export {
|
|
1952
|
-
RBACCache,
|
|
1953
|
-
rbacCache,
|
|
1954
|
-
CACHE_PATTERNS,
|
|
1955
|
-
createRBACConfig,
|
|
1956
|
-
getRBACConfig,
|
|
1957
|
-
getRBACLogger,
|
|
1958
|
-
isDebugMode,
|
|
1959
|
-
isDevelopmentMode,
|
|
1960
|
-
RBACEngine,
|
|
1961
|
-
createRBACEngine,
|
|
1962
|
-
enablePerformanceMonitoring,
|
|
1963
|
-
disablePerformanceMonitoring,
|
|
1964
|
-
isPerformanceMonitoringEnabled,
|
|
1965
|
-
recordPermissionCheck,
|
|
1966
|
-
recordAuditEvent,
|
|
1967
|
-
getPerformanceMetrics,
|
|
1968
|
-
resetPerformanceMetrics,
|
|
1969
|
-
getPerformanceSummary,
|
|
1970
|
-
clearInFlightRequests,
|
|
1971
|
-
getInFlightRequestCount,
|
|
1972
|
-
setupRBAC,
|
|
1973
|
-
isRBACInitialized,
|
|
1974
|
-
getAccessLevel,
|
|
1975
|
-
getPermissionMap,
|
|
1976
|
-
resolveAppContext,
|
|
1977
|
-
getRoleContext,
|
|
1978
|
-
isPermitted,
|
|
1979
|
-
isPermittedCached,
|
|
1980
|
-
hasPermission,
|
|
1981
|
-
hasAnyPermission,
|
|
1982
|
-
hasAllPermissions,
|
|
1983
|
-
isSuperAdmin,
|
|
1984
|
-
getPageScopeType,
|
|
1985
|
-
isOrganisationAdmin,
|
|
1986
|
-
isEventAdmin,
|
|
1987
|
-
invalidateUserCache,
|
|
1988
|
-
invalidateOrganisationCache,
|
|
1989
|
-
invalidateEventCache,
|
|
1990
|
-
invalidateAppCache,
|
|
1991
|
-
clearCache
|
|
1992
|
-
};
|
|
1993
|
-
//# sourceMappingURL=chunk-EFN2EIMK.js.map
|
|
2177
|
+
export { CACHE_PATTERNS, ContextValidator, EventContextRequiredError, OrganisationContextRequiredError, RBACCache, RBACEngine, RBACNotInitializedError, clearCache, clearInFlightRequests, createRBACConfig, createRBACEngine, disablePerformanceMonitoring, enablePerformanceMonitoring, getAccessLevel, getInFlightRequestCount, getPageScopeType, getPerformanceMetrics, getPerformanceSummary, getPermissionMap, getRBACConfig, getRBACLogger, getRoleContext, hasAllPermissions, hasAnyPermission, invalidateAppCache, invalidateEventCache, invalidateOrganisationCache, invalidateUserCache, isDebugMode, isDevelopmentMode, isEventAdmin, isOrganisationAdmin, isPerformanceMonitoringEnabled, isPermitted, isPermittedCached, isRBACInitialized, isSuperAdmin, rbacCache, recordAuditEvent, recordPermissionCheck, resetPerformanceMetrics, resolveAppContext, setupRBAC };
|
|
@@ -1,9 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
createLogger
|
|
3
|
-
} from "./chunk-PWLANIRT.js";
|
|
1
|
+
import { createLogger } from './chunk-TTRFSOKR.js';
|
|
4
2
|
|
|
5
3
|
// src/theming/parseEventColours.ts
|
|
6
|
-
var log = createLogger("ParseEventColours");
|
|
7
4
|
function parseAndNormalizeEventColours(input) {
|
|
8
5
|
try {
|
|
9
6
|
if (!input) return null;
|
|
@@ -17,10 +14,12 @@ function parseAndNormalizeEventColours(input) {
|
|
|
17
14
|
} else if (typeof input !== "object") {
|
|
18
15
|
return null;
|
|
19
16
|
}
|
|
20
|
-
const main = obj?.main || null;
|
|
21
|
-
const sec = obj?.sec || null;
|
|
22
|
-
const acc = obj?.acc || null;
|
|
23
|
-
if (!main && !sec && !acc)
|
|
17
|
+
const main = obj?.main || obj?.["ev-main"] || null;
|
|
18
|
+
const sec = obj?.sec || obj?.["ev-sec"] || null;
|
|
19
|
+
const acc = obj?.acc || obj?.["ev-acc"] || null;
|
|
20
|
+
if (!main && !sec && !acc) {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
24
23
|
const fill = (p) => {
|
|
25
24
|
if (!p || typeof p !== "object") return {};
|
|
26
25
|
const out = {};
|
|
@@ -38,19 +37,18 @@ function parseAndNormalizeEventColours(input) {
|
|
|
38
37
|
acc: fill(acc)
|
|
39
38
|
};
|
|
40
39
|
} catch (error) {
|
|
41
|
-
log.warn("Failed to parse/normalize event colours:", error);
|
|
42
40
|
return null;
|
|
43
41
|
}
|
|
44
42
|
}
|
|
45
43
|
|
|
46
44
|
// src/theming/runtime.ts
|
|
47
|
-
var
|
|
45
|
+
var log = createLogger("ThemingRuntime");
|
|
48
46
|
function formatOklchCss(color) {
|
|
49
47
|
return `oklch(${color.L} ${color.C} ${color.H})`;
|
|
50
48
|
}
|
|
51
49
|
function applyPalette(palette) {
|
|
52
50
|
if (typeof document === "undefined" || document === null) {
|
|
53
|
-
|
|
51
|
+
log.warn("Document not available (SSR) - palette not applied");
|
|
54
52
|
return;
|
|
55
53
|
}
|
|
56
54
|
const root = document.documentElement;
|
|
@@ -159,19 +157,7 @@ function getCurrentThemeData() {
|
|
|
159
157
|
if (typeof document === "undefined" || document === null) {
|
|
160
158
|
return null;
|
|
161
159
|
}
|
|
162
|
-
const root = document.documentElement;
|
|
163
|
-
const main = {};
|
|
164
|
-
const sec = {};
|
|
165
|
-
const acc = {};
|
|
166
160
|
return null;
|
|
167
161
|
}
|
|
168
162
|
|
|
169
|
-
export {
|
|
170
|
-
parseAndNormalizeEventColours,
|
|
171
|
-
applyPalette,
|
|
172
|
-
clearPalette,
|
|
173
|
-
generateSSRThemeCSS,
|
|
174
|
-
isDynamicThemingActive,
|
|
175
|
-
getCurrentThemeData
|
|
176
|
-
};
|
|
177
|
-
//# sourceMappingURL=chunk-L4OXEN46.js.map
|
|
163
|
+
export { applyPalette, clearPalette, generateSSRThemeCSS, getCurrentThemeData, isDynamicThemingActive, parseAndNormalizeEventColours };
|
package/dist/components.d.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
export { a as UnifiedAuthContextType, d as UnifiedAuthProvider, c as UnifiedAuthProviderProps, u as useUnifiedAuth } from './UnifiedAuthProvider-CKvHP1MK.js';
|
|
2
|
-
export { A as AddressField, k as AddressFieldProps, l as AddressFieldRef, o as Alert, q as AlertDescription, p as AlertTitle, r as Avatar, s as AvatarProps, t as Badge, u as BadgeProps, v as BadgeVariant, B as Button, a as ButtonProps, am as Calendar, an as CalendarProps, C as Card, g as CardActions, i as CardActionsProps, f as CardContent, e as CardDescription, c as CardFooter, b as CardHeader, h as CardProps, d as CardTitle, w as Checkbox,
|
|
2
|
+
export { A as AddressField, k as AddressFieldProps, l as AddressFieldRef, o as Alert, q as AlertDescription, p as AlertTitle, r as Avatar, s as AvatarProps, t as Badge, u as BadgeProps, v as BadgeVariant, B as Button, a as ButtonProps, am as Calendar, an as CalendarProps, C as Card, g as CardActions, i as CardActionsProps, f as CardContent, e as CardDescription, c as CardFooter, b as CardHeader, h as CardProps, d as CardTitle, w as Checkbox, aP as ContextSelector, aQ as ContextSelectorProps, M as Dialog, V as DialogBody, a4 as DialogBodyProps, Q as DialogClose, a1 as DialogCloseProps, R as DialogContent, $ as DialogContentProps, Y as DialogDescription, W as DialogFooter, a3 as DialogFooterProps, U as DialogHeader, a2 as DialogHeaderProps, N as DialogPortal, a0 as DialogPortalProps, Z as DialogProps, a5 as DialogSize, X as DialogTitle, O as DialogTrigger, _ as DialogTriggerProps, aS as ErrorBoundary, aU as ErrorBoundaryProps, aT as ErrorBoundaryProvider, aW as ErrorBoundaryProviderProps, aV as ErrorBoundaryState, b1 as FileDisplay, b2 as FileDisplayProps, a$ as FileUpload, b0 as FileUploadProps, aK as Footer, aL as FooterProps, aD as Form, aE as FormField, aG as FormFieldProps, aF as FormProps, aX as GlobalErrorHandler, aJ as Header, I as Input, j as InputProps, L as Label, m as LabelProps, aY as LoadingSpinner, aH as LoginForm, aI as LoginFormProps, aO as NavigationMenu, bk as PaceAppLayout, bj as PaceAppLayoutProps, bm as PaceLoginPage, bl as PaceLoginPageProps, P as Progress, y as ProgressProps, aM as ProtectedRoute, aN as ProtectedRouteProps, bc as PublicPageFooter, bi as PublicPageFooterProps, bb as PublicPageHeader, bh as PublicPageHeaderProps, ba as PublicPageLayout, bg as PublicPageLayoutProps, bd as PublicPageProvider, a6 as Select, aa as SelectContent, a7 as SelectGroup, ac as SelectItem, ab as SelectLabel, ad as SelectSeparator, a9 as SelectTrigger, a8 as SelectValue, aZ as SessionRestorationLoader, a_ as SessionRestorationLoaderProps, S as Switch, x as SwitchProps, z as Table, E as TableBody, F as TableCaption, G as TableCell, H as TableFooter, J as TableHead, D as TableHeader, K as TableRow, ae as Tabs, ah as TabsContent, al as TabsContentProps, af as TabsList, aj as TabsListProps, ai as TabsProps, ag as TabsTrigger, ak as TabsTriggerProps, T as Textarea, n as TextareaProps, ao as Toast, aq as ToastAction, aw as ToastActionElement, av as ToastClose, au as ToastDescription, ax as ToastProps, ar as ToastProvider, at as ToastTitle, as as ToastViewport, ap as Toaster, ay as Tooltip, aA as TooltipContent, aB as TooltipProvider, aC as TooltipRoot, az as TooltipTrigger, b9 as UseFileReferenceForRecordReturn, b7 as UseFileReferenceOptions, b8 as UseFileReferenceReturn, aR as UserMenu, b3 as useFileReference, b5 as useFileReferenceById, b4 as useFileReferenceForRecord, b6 as useFilesByCategory, bf as useIsPublicPage, be as usePublicPageContext } from './PublicPageProvider-DlsCaR5v.js';
|
|
3
3
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
4
4
|
export { u as useToast } from './useToast-AyaT-x7p.js';
|
|
5
|
-
export { D as DataTable, a as DataTableProps } from './DataTable-
|
|
6
|
-
export { c as AggregateConfig, A as AutocompleteOptions, d as DataRecord, a as DataTableAction, D as DataTableColumn, b as DataTableToolbarButton, E as EmptyStateConfig, G as GetRowId, P as ParsedAddress } from './types-
|
|
5
|
+
export { D as DataTable, a as DataTableProps } from './DataTable-DRUIgtUH.js';
|
|
6
|
+
export { c as AggregateConfig, A as AutocompleteOptions, d as DataRecord, a as DataTableAction, D as DataTableColumn, b as DataTableToolbarButton, E as EmptyStateConfig, G as GetRowId, P as ParsedAddress } from './types-DXstZpNI.js';
|
|
7
7
|
export { F as FileCategory, b as FileMetadata, a as FileReference, c as FileUploadOptions } from './file-reference-BavO2eQj.js';
|
|
8
|
+
export { a as NavigationItem, N as NavigationMenuProps } from './types-t9H8qKRw.js';
|
|
8
9
|
import 'react';
|
|
9
10
|
import '@supabase/supabase-js';
|
|
10
11
|
import './event-CW5YB_2p.js';
|
|
@@ -19,8 +20,8 @@ import '@radix-ui/react-toast';
|
|
|
19
20
|
import '@radix-ui/react-tooltip';
|
|
20
21
|
import 'react-hook-form';
|
|
21
22
|
import 'zod';
|
|
22
|
-
import './types-BeoeWV5I.js';
|
|
23
23
|
import '@tanstack/react-table';
|
|
24
|
+
import './types-BeoeWV5I.js';
|
|
24
25
|
|
|
25
26
|
/**
|
|
26
27
|
* @file DateTimeField Component
|
|
@@ -130,11 +131,12 @@ declare function DateTimeField({ label, value, onChange, timezone, required, cla
|
|
|
130
131
|
* Provides a calendar interface with timezone context for date selection.
|
|
131
132
|
*
|
|
132
133
|
* Features:
|
|
133
|
-
* - Calendar date selection
|
|
134
|
+
* - Calendar date selection with dropdown month/year navigation
|
|
134
135
|
* - Timezone display (shows "Local" when matches user timezone)
|
|
135
136
|
* - Optional "Done" button
|
|
136
137
|
* - Accessible date selection
|
|
137
138
|
* - Keyboard navigation support
|
|
139
|
+
* - Wide date range support (1900-2100) via dropdown selectors
|
|
138
140
|
*
|
|
139
141
|
* @example
|
|
140
142
|
* ```tsx
|