@jmruthers/pace-core 0.6.4 → 0.6.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +104 -0
- package/README.md +5 -403
- package/core-usage-manifest.json +93 -0
- package/cursor-rules/00-pace-core-compliance.mdc +128 -26
- package/cursor-rules/01-standards-compliance.mdc +49 -8
- package/cursor-rules/02-project-structure.mdc +6 -0
- package/cursor-rules/03-solid-principles.mdc +2 -0
- package/cursor-rules/04-testing-standards.mdc +2 -0
- package/cursor-rules/05-bug-reports-and-features.mdc +2 -0
- package/cursor-rules/06-code-quality.mdc +2 -0
- package/cursor-rules/07-tech-stack-compliance.mdc +2 -0
- package/cursor-rules/08-markup-quality.mdc +52 -27
- package/cursor-rules/09-rbac-compliance.mdc +462 -0
- package/cursor-rules/10-error-handling-patterns.mdc +179 -0
- package/cursor-rules/11-performance-optimization.mdc +169 -0
- package/cursor-rules/12-ci-cd-integration.mdc +150 -0
- package/dist/{AuthService-Cb34EQs3.d.ts → AuthService-DmfO5rGS.d.ts} +10 -0
- package/dist/{DataTable-BMRU8a1j.d.ts → DataTable-2N_tqbfq.d.ts} +1 -1
- package/dist/DataTable-LRJL4IRV.js +15 -0
- package/dist/{PublicPageProvider-DEMpysFR.d.ts → PublicPageProvider-BBH6Vqg7.d.ts} +72 -139
- package/dist/UnifiedAuthProvider-ZT6TIGM7.js +7 -0
- package/dist/api-Y4MQWOFW.js +4 -0
- package/dist/audit-MYQXYZFU.js +3 -0
- package/dist/{chunk-J36DSWQK.js → chunk-2HGJFNAH.js} +8 -28
- package/dist/{chunk-OEWDTMG7.js → chunk-3O3WHILE.js} +38 -121
- package/dist/{chunk-M43Y4SSO.js → chunk-3QC3KRHK.js} +1 -14
- package/dist/{chunk-DGUM43GV.js → chunk-3RG5ZIWI.js} +1 -4
- package/dist/{chunk-QXHPKYJV.js → chunk-4SXLQIZO.js} +1 -26
- package/dist/chunk-4T7OBVTU.js +62 -0
- package/dist/{chunk-E66EQZE6.js → chunk-6GLLNA6U.js} +3 -9
- package/dist/{chunk-ZSAAAMVR.js → chunk-6QYDGKQY.js} +1 -4
- package/dist/{chunk-NN6WWZ5U.js → chunk-7TYHROIV.js} +579 -563
- package/dist/{chunk-M7MPQISP.js → chunk-A55DK444.js} +9 -16
- package/dist/{chunk-63FOKYGO.js → chunk-AHU7G2R5.js} +2 -11
- package/dist/{chunk-L4OXEN46.js → chunk-BVP2BCJF.js} +2 -16
- package/dist/chunk-C7NSAPTL.js +1 -0
- package/dist/{chunk-YKRAFF5K.js → chunk-FENMYN2U.js} +73 -149
- package/dist/{chunk-AVMLPIM7.js → chunk-FTCRZOG2.js} +284 -432
- package/dist/{chunk-G37KK66H.js → chunk-FYHN4DD5.js} +60 -19
- package/dist/{chunk-VBXEHIUJ.js → chunk-HF6O3O37.js} +6 -88
- package/dist/{chunk-I6DAQMWX.js → chunk-LAZMKTTF.js} +930 -891
- package/dist/{chunk-5EC5MEWX.js → chunk-MAGBIDNS.js} +77 -222
- package/dist/chunk-MBADTM7L.js +64 -0
- package/dist/chunk-OHIK3MIO.js +994 -0
- package/dist/{chunk-6SOIHG6Z.js → chunk-S7DKJPLT.js} +115 -44
- package/dist/{chunk-FMUCXFII.js → chunk-SD6WQY43.js} +1 -5
- package/dist/{chunk-PWLANIRT.js → chunk-TTRFSOKR.js} +1 -7
- package/dist/{chunk-5DRSZLL2.js → chunk-UH3NTO3F.js} +1 -6
- package/dist/{chunk-FFQEQTNW.js → chunk-UIYSCEV7.js} +134 -45
- package/dist/{chunk-3LPHPB62.js → chunk-ZFYPMX46.js} +271 -87
- package/dist/{chunk-7JPAB3T5.js → chunk-ZS5VO5JB.js} +1989 -1283
- package/dist/components.d.ts +6 -6
- package/dist/components.js +57 -267
- package/dist/{database.generated-CzIvgcPu.d.ts → database.generated-CcnC_DRc.d.ts} +4795 -3691
- package/dist/eslint-rules/index.cjs +22 -0
- package/dist/eslint-rules/rules/compliance.cjs +348 -0
- package/dist/eslint-rules/rules/components.cjs +113 -0
- package/dist/eslint-rules/rules/imports.cjs +102 -0
- package/dist/eslint-rules/rules/rbac.cjs +790 -0
- package/dist/eslint-rules/utils/helpers.cjs +42 -0
- package/dist/eslint-rules/utils/manifest-loader.cjs +75 -0
- package/dist/hooks.d.ts +5 -5
- package/dist/hooks.js +62 -270
- package/dist/icons/index.d.ts +1 -0
- package/dist/icons/index.js +1 -0
- package/dist/index.d.ts +36 -26
- package/dist/index.js +87 -690
- package/dist/providers.d.ts +2 -2
- package/dist/providers.js +8 -35
- package/dist/rbac/eslint-rules.d.ts +46 -44
- package/dist/rbac/eslint-rules.js +7 -4
- package/dist/rbac/index.d.ts +124 -594
- package/dist/rbac/index.js +14 -207
- package/dist/styles/index.js +2 -12
- package/dist/theming/runtime.js +3 -19
- package/dist/{timezone-CHhWg6b4.d.ts → timezone-BZe_eUxx.d.ts} +175 -1
- package/dist/{types-CkbwOr4Y.d.ts → types-B-K_5VnO.d.ts} +4 -0
- package/dist/types-t9H8qKRw.d.ts +55 -0
- package/dist/types.d.ts +1 -1
- package/dist/types.js +7 -94
- package/dist/{usePublicRouteParams-i3qtoBgg.d.ts → usePublicRouteParams-COZ28Mvq.d.ts} +9 -9
- package/dist/utils.d.ts +24 -117
- package/dist/utils.js +54 -392
- package/docs/README.md +16 -6
- package/docs/api/README.md +4 -402
- package/docs/api/modules.md +454 -930
- package/docs/api-reference/components.md +3 -1
- package/docs/api-reference/deprecated.md +31 -6
- package/docs/api-reference/rpc-functions.md +78 -3
- package/docs/best-practices/accessibility.md +6 -3
- package/docs/getting-started/cursor-rules.md +3 -23
- package/docs/getting-started/dependencies.md +650 -0
- package/docs/getting-started/installation-guide.md +20 -7
- package/docs/getting-started/quick-start.md +23 -12
- package/docs/implementation-guides/permission-enforcement.md +4 -0
- package/docs/rbac/MIGRATION_GUIDE.md +819 -0
- package/docs/rbac/RBAC_CONTRACT.md +724 -0
- package/docs/rbac/README.md +12 -3
- package/docs/rbac/edge-functions-guide.md +376 -0
- package/docs/rbac/secure-client-protection.md +0 -34
- package/docs/standards/00-pace-core-compliance.md +967 -0
- package/docs/standards/01-standards-compliance.md +188 -0
- package/docs/standards/02-project-structure.md +985 -0
- package/docs/standards/03-solid-principles.md +39 -0
- package/docs/standards/04-testing-standards.md +36 -0
- package/docs/standards/05-bug-reports-and-features.md +27 -0
- package/docs/standards/{04-code-style-standard.md → 06-code-quality.md} +2 -0
- package/docs/standards/07-tech-stack-compliance.md +30 -0
- package/docs/standards/08-markup-quality.md +345 -0
- package/docs/standards/{07-rbac-and-rls-standard.md → 09-rbac-compliance.md} +149 -54
- package/docs/standards/10-error-handling-patterns.md +401 -0
- package/docs/standards/11-performance-optimization.md +348 -0
- package/docs/standards/12-ci-cd-integration.md +370 -0
- package/docs/standards/ALIGNMENT_REVIEW_SUMMARY.md +192 -0
- package/docs/standards/README.md +62 -33
- package/docs/troubleshooting/organisation-context-setup.md +42 -19
- package/eslint-config-pace-core.cjs +20 -4
- package/package.json +31 -21
- package/scripts/audit/audit-compliance.cjs +1295 -0
- package/scripts/audit/audit-components.cjs +260 -0
- package/scripts/audit/audit-dependencies.cjs +395 -0
- package/scripts/audit/audit-rbac.cjs +954 -0
- package/scripts/audit/audit-standards.cjs +1268 -0
- package/scripts/audit/index.cjs +1898 -194
- package/scripts/install-cursor-rules.cjs +259 -8
- package/scripts/validate-master.js +1 -1
- package/src/__tests__/fixtures/supabase.ts +1 -1
- package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +1 -1
- package/src/__tests__/helpers/__tests__/optimized-test-setup.test.ts +1 -1
- package/src/__tests__/helpers/__tests__/supabaseMock.test.ts +1 -1
- package/src/__tests__/helpers/__tests__/test-utils.test.tsx +3 -3
- package/src/__tests__/helpers/component-test-utils.tsx +1 -1
- package/src/__tests__/helpers/supabaseMock.ts +2 -2
- package/src/__tests__/public-recipe-view.test.ts +38 -9
- package/src/components/Button/Button.tsx +5 -1
- package/src/components/ContextSelector/ContextSelector.tsx +42 -39
- package/src/components/DataTable/__tests__/keyboard.test.tsx +15 -2
- package/src/components/DataTable/components/DataTableBody.tsx +55 -31
- package/src/components/DataTable/components/DataTableCore.tsx +186 -13
- package/src/components/DataTable/components/DataTableLayout.tsx +30 -5
- package/src/components/DataTable/components/EditFields.tsx +23 -3
- package/src/components/DataTable/components/EditableRow.tsx +7 -2
- package/src/components/DataTable/components/ImportModal.tsx +4 -6
- package/src/components/DataTable/components/RowComponent.tsx +12 -0
- package/src/components/DataTable/components/ViewRowModal.tsx +4 -4
- package/src/components/DataTable/components/__tests__/ImportModal.test.tsx +455 -96
- package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +122 -58
- package/src/components/DataTable/components/hooks/usePermissionTracking.ts +0 -4
- package/src/components/DataTable/core/DataTableContext.tsx +1 -1
- package/src/components/DataTable/hooks/__tests__/useDataTableState.test.ts +51 -47
- package/src/components/DataTable/hooks/useDataTablePermissions.ts +24 -21
- package/src/components/DataTable/hooks/useDataTableState.ts +125 -9
- package/src/components/DataTable/hooks/useTableColumns.ts +40 -2
- package/src/components/DataTable/hooks/useTableHandlers.ts +11 -0
- package/src/components/DataTable/types.ts +5 -0
- package/src/components/DateTimeField/DateTimeField.tsx +20 -20
- package/src/components/DateTimeField/README.md +5 -2
- package/src/components/Dialog/Dialog.test.tsx +361 -318
- package/src/components/Dialog/Dialog.tsx +1154 -323
- package/src/components/Dialog/index.ts +3 -3
- package/src/components/FileDisplay/FileDisplay.test.tsx +45 -2
- package/src/components/FileDisplay/FileDisplay.tsx +28 -22
- package/src/components/Form/Form.test.tsx +9 -10
- package/src/components/Form/Form.tsx +369 -9
- package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +28 -28
- package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +40 -54
- package/src/components/LoginForm/LoginForm.tsx +2 -2
- package/src/components/NavigationMenu/NavigationMenu.test.tsx +14 -13
- package/src/components/NavigationMenu/NavigationMenu.tsx +2 -2
- package/src/components/NavigationMenu/useNavigationFiltering.ts +11 -21
- package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +6 -4
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +30 -41
- package/src/components/PaceAppLayout/README.md +10 -9
- package/src/components/PaceAppLayout/test-setup.tsx +40 -31
- package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +108 -61
- package/src/components/PaceLoginPage/PaceLoginPage.tsx +27 -3
- package/src/components/PasswordChange/PasswordChangeForm.test.tsx +61 -0
- package/src/components/PasswordChange/PasswordChangeForm.tsx +20 -13
- package/src/components/PublicLayout/PublicLayout.test.tsx +7 -3
- package/src/components/PublicLayout/PublicPageLayout.tsx +5 -8
- package/src/components/Select/Select.tsx +23 -21
- package/src/components/Select/types.ts +1 -1
- package/src/components/UserMenu/UserMenu.test.tsx +38 -6
- package/src/components/UserMenu/UserMenu.tsx +39 -34
- package/src/components/index.ts +3 -4
- package/src/eslint-rules/index.cjs +22 -0
- package/src/eslint-rules/rules/compliance.cjs +348 -0
- package/src/eslint-rules/rules/components.cjs +113 -0
- package/src/eslint-rules/rules/imports.cjs +102 -0
- package/src/eslint-rules/rules/rbac.cjs +790 -0
- package/src/eslint-rules/utils/helpers.cjs +42 -0
- package/src/eslint-rules/utils/manifest-loader.cjs +75 -0
- package/src/hooks/__tests__/hooks.integration.test.tsx +6 -8
- package/src/hooks/__tests__/useAppConfig.unit.test.ts +129 -67
- package/src/hooks/__tests__/usePublicEvent.simple.test.ts +149 -67
- package/src/hooks/__tests__/usePublicEvent.test.ts +149 -79
- package/src/hooks/__tests__/usePublicEvent.unit.test.ts +158 -109
- package/src/hooks/__tests__/useSessionDraft.test.ts +163 -0
- package/src/hooks/__tests__/useSessionRestoration.unit.test.tsx +10 -5
- package/src/hooks/public/usePublicEvent.ts +62 -190
- package/src/hooks/public/usePublicEventLogo.test.ts +70 -17
- package/src/hooks/public/usePublicEventLogo.ts +19 -9
- package/src/hooks/useAppConfig.ts +26 -24
- package/src/hooks/useEventTheme.test.ts +211 -233
- package/src/hooks/useEventTheme.ts +19 -28
- package/src/hooks/useEvents.ts +11 -7
- package/src/hooks/useKeyboardShortcuts.ts +1 -1
- package/src/hooks/useOrganisationPermissions.ts +9 -11
- package/src/hooks/useOrganisations.ts +13 -7
- package/src/hooks/useQueryCache.ts +0 -1
- package/src/hooks/useSessionDraft.ts +380 -0
- package/src/hooks/useSessionRestoration.ts +3 -1
- package/src/icons/index.ts +27 -0
- package/src/index.ts +16 -1
- package/src/providers/OrganisationProvider.tsx +23 -14
- package/src/providers/services/EventServiceProvider.tsx +1 -24
- package/src/providers/services/UnifiedAuthProvider.tsx +5 -48
- package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +3 -0
- package/src/rbac/README.md +20 -20
- package/src/rbac/__tests__/adapters.comprehensive.test.tsx +7 -457
- package/src/rbac/__tests__/auth-rbac.e2e.test.tsx +33 -7
- package/src/rbac/adapters.tsx +7 -295
- package/src/rbac/api.test.ts +44 -56
- package/src/rbac/api.ts +10 -17
- package/src/rbac/cache-invalidation.ts +0 -1
- package/src/rbac/compliance/index.ts +10 -0
- package/src/rbac/compliance/pattern-detector.ts +553 -0
- package/src/rbac/compliance/runtime-compliance.ts +22 -0
- package/src/rbac/components/AccessDenied.tsx +150 -0
- package/src/rbac/components/NavigationGuard.tsx +12 -20
- package/src/rbac/components/PagePermissionGuard.tsx +4 -24
- package/src/rbac/components/__tests__/NavigationGuard.test.tsx +21 -8
- package/src/rbac/components/index.ts +3 -41
- package/src/rbac/eslint-rules.js +1 -1
- package/src/rbac/hooks/index.ts +0 -3
- package/src/rbac/hooks/permissions/index.ts +0 -3
- package/src/rbac/hooks/permissions/useAccessLevel.ts +4 -8
- package/src/rbac/hooks/usePermissions.ts +0 -3
- package/src/rbac/hooks/useRBAC.test.ts +21 -3
- package/src/rbac/hooks/useRBAC.ts +4 -3
- package/src/rbac/hooks/useResolvedScope.test.ts +57 -47
- package/src/rbac/hooks/useResolvedScope.ts +58 -140
- package/src/rbac/hooks/useResourcePermissions.test.ts +241 -60
- package/src/rbac/hooks/useResourcePermissions.ts +182 -63
- package/src/rbac/hooks/useRoleManagement.test.ts +65 -22
- package/src/rbac/hooks/useRoleManagement.ts +147 -19
- package/src/rbac/hooks/useSecureSupabase.ts +4 -8
- package/src/rbac/index.ts +7 -9
- package/src/rbac/permissions.ts +17 -17
- package/src/rbac/utils/contextValidator.ts +45 -7
- package/src/services/AuthService.ts +132 -23
- package/src/services/EventService.ts +4 -97
- package/src/services/InactivityService.ts +155 -58
- package/src/services/OrganisationService.ts +7 -44
- package/src/services/__tests__/OrganisationService.test.ts +26 -8
- package/src/services/base/BaseService.ts +0 -3
- package/src/styles/core.css +4 -0
- package/src/types/database.generated.ts +4733 -3809
- package/src/utils/__tests__/organisationContext.unit.test.ts +9 -10
- package/src/utils/context/organisationContext.test.ts +13 -28
- package/src/utils/context/organisationContext.ts +21 -52
- package/src/utils/dynamic/dynamicUtils.ts +1 -1
- package/src/utils/file-reference/index.ts +39 -15
- package/src/utils/formatting/formatDateTime.test.ts +3 -2
- package/src/utils/formatting/formatTime.test.ts +3 -2
- package/src/utils/google-places/loadGoogleMapsScript.ts +29 -4
- package/src/utils/index.ts +4 -1
- package/src/utils/persistence/__tests__/keyDerivation.test.ts +135 -0
- package/src/utils/persistence/__tests__/sensitiveFieldDetection.test.ts +123 -0
- package/src/utils/persistence/keyDerivation.ts +304 -0
- package/src/utils/persistence/sensitiveFieldDetection.ts +212 -0
- package/src/utils/security/secureStorage.ts +5 -5
- package/src/utils/storage/helpers.ts +3 -3
- package/src/utils/supabase/createBaseClient.ts +147 -0
- package/src/utils/timezone/timezone.test.ts +1 -2
- package/src/utils/timezone/timezone.ts +1 -1
- package/src/utils/validation/csrf.ts +4 -4
- package/cursor-rules/CHANGELOG.md +0 -119
- package/cursor-rules/README.md +0 -192
- package/dist/DataTable-E7YQZD7D.js +0 -175
- package/dist/DataTable-E7YQZD7D.js.map +0 -1
- package/dist/UnifiedAuthProvider-QPXO24B4.js +0 -18
- package/dist/UnifiedAuthProvider-QPXO24B4.js.map +0 -1
- package/dist/api-6LVZTHDS.js +0 -52
- package/dist/api-6LVZTHDS.js.map +0 -1
- package/dist/audit-V53FV5AG.js +0 -17
- package/dist/audit-V53FV5AG.js.map +0 -1
- package/dist/chunk-36LVWXB2.js +0 -227
- package/dist/chunk-36LVWXB2.js.map +0 -1
- package/dist/chunk-3LPHPB62.js.map +0 -1
- package/dist/chunk-5DRSZLL2.js.map +0 -1
- package/dist/chunk-5EC5MEWX.js.map +0 -1
- package/dist/chunk-63FOKYGO.js.map +0 -1
- package/dist/chunk-6SOIHG6Z.js.map +0 -1
- package/dist/chunk-7JPAB3T5.js.map +0 -1
- package/dist/chunk-ATKZM7RX.js +0 -2053
- package/dist/chunk-ATKZM7RX.js.map +0 -1
- package/dist/chunk-AVMLPIM7.js.map +0 -1
- package/dist/chunk-DGUM43GV.js.map +0 -1
- package/dist/chunk-E66EQZE6.js.map +0 -1
- package/dist/chunk-FFQEQTNW.js.map +0 -1
- package/dist/chunk-FMUCXFII.js.map +0 -1
- package/dist/chunk-G37KK66H.js.map +0 -1
- package/dist/chunk-I6DAQMWX.js.map +0 -1
- package/dist/chunk-J36DSWQK.js.map +0 -1
- package/dist/chunk-KQCRWDSA.js +0 -1
- package/dist/chunk-KQCRWDSA.js.map +0 -1
- package/dist/chunk-L4OXEN46.js.map +0 -1
- package/dist/chunk-LMC26NLJ.js +0 -84
- package/dist/chunk-LMC26NLJ.js.map +0 -1
- package/dist/chunk-M43Y4SSO.js.map +0 -1
- package/dist/chunk-M7MPQISP.js.map +0 -1
- package/dist/chunk-NN6WWZ5U.js.map +0 -1
- package/dist/chunk-OEWDTMG7.js.map +0 -1
- package/dist/chunk-PWLANIRT.js.map +0 -1
- package/dist/chunk-QXHPKYJV.js.map +0 -1
- package/dist/chunk-VBXEHIUJ.js.map +0 -1
- package/dist/chunk-YKRAFF5K.js.map +0 -1
- package/dist/chunk-ZSAAAMVR.js.map +0 -1
- package/dist/components.js.map +0 -1
- package/dist/contextValidator-OOPCLPZW.js +0 -9
- package/dist/contextValidator-OOPCLPZW.js.map +0 -1
- package/dist/eslint-rules/pace-core-compliance.cjs +0 -510
- package/dist/hooks.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/providers.js.map +0 -1
- package/dist/rbac/eslint-rules.js.map +0 -1
- package/dist/rbac/index.js.map +0 -1
- package/dist/styles/index.js.map +0 -1
- package/dist/theming/runtime.js.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/utils.js.map +0 -1
- package/docs/standards/01-architecture-standard.md +0 -44
- package/docs/standards/02-api-and-rpc-standard.md +0 -39
- package/docs/standards/03-component-standard.md +0 -32
- package/docs/standards/05-security-standard.md +0 -44
- package/docs/standards/06-testing-and-docs-standard.md +0 -29
- package/docs/standards/pace-core-compliance.md +0 -432
- package/scripts/audit/core/checks/accessibility.cjs +0 -197
- package/scripts/audit/core/checks/api-usage.cjs +0 -191
- package/scripts/audit/core/checks/bundle.cjs +0 -142
- package/scripts/audit/core/checks/compliance.cjs +0 -2706
- package/scripts/audit/core/checks/config.cjs +0 -54
- package/scripts/audit/core/checks/coverage.cjs +0 -84
- package/scripts/audit/core/checks/dependencies.cjs +0 -994
- package/scripts/audit/core/checks/documentation.cjs +0 -268
- package/scripts/audit/core/checks/environment.cjs +0 -116
- package/scripts/audit/core/checks/error-handling.cjs +0 -340
- package/scripts/audit/core/checks/forms.cjs +0 -172
- package/scripts/audit/core/checks/heuristics.cjs +0 -68
- package/scripts/audit/core/checks/hooks.cjs +0 -334
- package/scripts/audit/core/checks/imports.cjs +0 -244
- package/scripts/audit/core/checks/performance.cjs +0 -325
- package/scripts/audit/core/checks/routes.cjs +0 -117
- package/scripts/audit/core/checks/state.cjs +0 -130
- package/scripts/audit/core/checks/structure.cjs +0 -65
- package/scripts/audit/core/checks/style.cjs +0 -584
- package/scripts/audit/core/checks/testing.cjs +0 -122
- package/scripts/audit/core/checks/typescript.cjs +0 -61
- package/scripts/audit/core/scanner.cjs +0 -199
- package/scripts/audit/core/utils.cjs +0 -137
- package/scripts/audit/reporters/console.cjs +0 -151
- package/scripts/audit/reporters/json.cjs +0 -54
- package/scripts/audit/reporters/markdown.cjs +0 -124
- package/scripts/audit-consuming-app.cjs +0 -86
- package/src/eslint-rules/pace-core-compliance.cjs +0 -510
- package/src/eslint-rules/pace-core-compliance.js +0 -638
- package/src/rbac/components/EnhancedNavigationMenu.test.tsx +0 -555
- package/src/rbac/components/EnhancedNavigationMenu.tsx +0 -293
- package/src/rbac/components/NavigationProvider.test.tsx +0 -481
- package/src/rbac/components/NavigationProvider.tsx +0 -345
- package/src/rbac/components/PagePermissionProvider.test.tsx +0 -476
- package/src/rbac/components/PagePermissionProvider.tsx +0 -279
- package/src/rbac/components/PermissionEnforcer.tsx +0 -312
- package/src/rbac/components/RoleBasedRouter.tsx +0 -440
- package/src/rbac/components/SecureDataProvider.test.tsx +0 -543
- package/src/rbac/components/SecureDataProvider.tsx +0 -339
- package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +0 -620
- package/src/rbac/components/__tests__/NavigationProvider.test.tsx +0 -726
- package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +0 -661
- package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +0 -881
- package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +0 -783
- package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +0 -645
- package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +0 -659
- package/src/rbac/hooks/permissions/useCachedPermissions.ts +0 -79
- package/src/rbac/hooks/permissions/useHasAllPermissions.ts +0 -90
- package/src/rbac/hooks/permissions/useHasAnyPermission.ts +0 -90
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared helper functions for ESLint rules
|
|
3
|
+
* @package @jmruthers/pace-core
|
|
4
|
+
* @module ESLintRules/utils/helpers
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
// Helper function to get pace-core alternative for restricted imports
|
|
8
|
+
function getPaceCoreAlternative(importSource) {
|
|
9
|
+
const alternatives = {
|
|
10
|
+
'@radix-ui/react-avatar': '/components',
|
|
11
|
+
'@radix-ui/react-checkbox': '/components',
|
|
12
|
+
'@radix-ui/react-dialog': '/components',
|
|
13
|
+
'@radix-ui/react-label': '/components',
|
|
14
|
+
'@radix-ui/react-switch': '/components',
|
|
15
|
+
'@radix-ui/react-tabs': '/components',
|
|
16
|
+
'@radix-ui/react-toast': '/components',
|
|
17
|
+
'@radix-ui/react-tooltip': '/components',
|
|
18
|
+
'react-day-picker': '/components',
|
|
19
|
+
'@tanstack/react-table': '/components',
|
|
20
|
+
'react-hook-form': '/components',
|
|
21
|
+
'zod': '/utils',
|
|
22
|
+
'lucide-react': '/icons'
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
return alternatives[importSource] || '';
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Check if a file is in the pace-core source directory
|
|
30
|
+
* @param {string} filename - The file path to check
|
|
31
|
+
* @returns {boolean} - True if the file is in packages/core/src
|
|
32
|
+
*/
|
|
33
|
+
function isPaceCoreSourceFile(filename) {
|
|
34
|
+
// Check for both Unix and Windows path separators
|
|
35
|
+
return filename.includes('packages/core/src') || filename.includes('packages\\core\\src');
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
module.exports = {
|
|
39
|
+
getPaceCoreAlternative,
|
|
40
|
+
isPaceCoreSourceFile,
|
|
41
|
+
};
|
|
42
|
+
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared utility for loading core-usage-manifest.json
|
|
3
|
+
* @package @jmruthers/pace-core
|
|
4
|
+
* @module ESLintRules/utils/manifest-loader
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const fs = require('fs');
|
|
8
|
+
const path = require('path');
|
|
9
|
+
|
|
10
|
+
// Load manifest data
|
|
11
|
+
let manifestData = null;
|
|
12
|
+
try {
|
|
13
|
+
const manifestPath = path.join(__dirname, '../../../core-usage-manifest.json');
|
|
14
|
+
if (fs.existsSync(manifestPath)) {
|
|
15
|
+
manifestData = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));
|
|
16
|
+
}
|
|
17
|
+
} catch (error) {
|
|
18
|
+
// If manifest can't be loaded, rules will use hardcoded defaults
|
|
19
|
+
console.warn('Warning: Could not load core-usage-manifest.json, using defaults');
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// Get restricted imports from manifest or use defaults
|
|
23
|
+
const getRestrictedImports = () => {
|
|
24
|
+
if (manifestData && manifestData.restrictedImports) {
|
|
25
|
+
return manifestData.restrictedImports;
|
|
26
|
+
}
|
|
27
|
+
// Fallback defaults
|
|
28
|
+
return [
|
|
29
|
+
{ module: '@radix-ui/react-avatar', reason: 'Use Avatar component from pace-core instead' },
|
|
30
|
+
{ module: '@radix-ui/react-checkbox', reason: 'Use Checkbox component from pace-core instead' },
|
|
31
|
+
{ module: '@radix-ui/react-dialog', reason: 'Use Dialog component from pace-core instead' },
|
|
32
|
+
{ module: '@radix-ui/react-label', reason: 'Use Label component from pace-core instead' },
|
|
33
|
+
{ module: '@radix-ui/react-slot', reason: 'Use Button component from pace-core which handles slot composition' },
|
|
34
|
+
{ module: '@radix-ui/react-switch', reason: 'Use Switch component from pace-core instead' },
|
|
35
|
+
{ module: '@radix-ui/react-tabs', reason: 'Use Tabs component from pace-core instead' },
|
|
36
|
+
{ module: '@radix-ui/react-toast', reason: 'Use Toast component and useToast hook from pace-core instead' },
|
|
37
|
+
{ module: '@radix-ui/react-tooltip', reason: 'Use Tooltip component from pace-core instead' },
|
|
38
|
+
{ module: 'react-day-picker', reason: 'Use Calendar component from pace-core instead' },
|
|
39
|
+
{ module: '@tanstack/react-table', reason: 'Use DataTable component and related hooks from pace-core instead. DataTable wraps and standardizes table functionality' },
|
|
40
|
+
{ module: 'react-hook-form', reason: 'Use Form component and useZodForm hook from pace-core instead' },
|
|
41
|
+
{ module: 'zod', reason: 'Use validation utilities and schemas from pace-core instead. pace-core provides standardized validation helpers' }
|
|
42
|
+
];
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
// Get pace-core components from manifest or use defaults
|
|
46
|
+
const getPaceCoreComponents = () => {
|
|
47
|
+
if (manifestData && manifestData.components) {
|
|
48
|
+
return manifestData.components;
|
|
49
|
+
}
|
|
50
|
+
return ['Button', 'Card', 'Dialog', 'Input', 'Form', 'Select', 'Alert', 'Badge', 'Checkbox', 'Switch', 'Textarea', 'Label', 'Table', 'DataTable', 'Toast', 'Tooltip', 'Tabs', 'Calendar', 'Avatar', 'Progress'];
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
// Get pace-core hooks from manifest or use defaults
|
|
54
|
+
const getPaceCoreHooks = () => {
|
|
55
|
+
if (manifestData && manifestData.hooks) {
|
|
56
|
+
return manifestData.hooks;
|
|
57
|
+
}
|
|
58
|
+
return ['useToast', 'useDebounce', 'useUnifiedAuth', 'useEvents', 'useOrganisations', 'useFileReference', 'useStorage', 'useZodForm', 'useRBAC', 'usePermissions'];
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
// Get pace-core utils from manifest or use defaults
|
|
62
|
+
const getPaceCoreUtils = () => {
|
|
63
|
+
if (manifestData && manifestData.utils) {
|
|
64
|
+
return manifestData.utils;
|
|
65
|
+
}
|
|
66
|
+
return ['formatDate', 'formatCurrency', 'formatNumber', 'formatTime', 'formatDateTime', 'cn', 'validateUserInput', 'sanitizeUserInput', 'hasPermission', 'getAppConfig'];
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
module.exports = {
|
|
70
|
+
getRestrictedImports,
|
|
71
|
+
getPaceCoreComponents,
|
|
72
|
+
getPaceCoreHooks,
|
|
73
|
+
getPaceCoreUtils,
|
|
74
|
+
};
|
|
75
|
+
|
package/dist/hooks.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
export { u as useToast } from './useToast-AyaT-x7p.js';
|
|
2
|
-
import { S as StorageUploadOptions, a as StorageUploadResult, b as StorageListOptions, c as StorageListResult, d as StorageFileInfo } from './usePublicRouteParams-
|
|
3
|
-
export { O as OrganisationSecurityHook, l as UseAppConfigReturn, i as UseFormDialogOptions, j as UseFormDialogReturn, U as UseOrganisationPermissionsReturn, F as UsePublicEventLogoOptions, E as UsePublicEventLogoReturn, B as UsePublicEventOptions, A as UsePublicEventReturn, D as UsePublicFileDisplayOptions, C as UsePublicFileDisplayReturn, G as UsePublicRouteParamsReturn, n as clearPublicEventCache, q as clearPublicFileDisplayCache, t as clearPublicLogoCache, z as extractEventCodeFromPath, y as generatePublicRoutePath, o as getPublicEventCacheStats, r as getPublicFileDisplayCacheStats, v as getPublicLogoCacheStats, k as useAppConfig, u as useEventTheme, h as useFormDialog, e as useOrganisationPermissions, f as useOrganisationSecurity, m as usePublicEvent, x as usePublicEventCode, s as usePublicEventLogo, p as usePublicFileDisplay, w as usePublicRouteParams, g as useZodForm } from './usePublicRouteParams-
|
|
2
|
+
import { S as StorageUploadOptions, a as StorageUploadResult, b as StorageListOptions, c as StorageListResult, d as StorageFileInfo } from './usePublicRouteParams-COZ28Mvq.js';
|
|
3
|
+
export { O as OrganisationSecurityHook, l as UseAppConfigReturn, i as UseFormDialogOptions, j as UseFormDialogReturn, U as UseOrganisationPermissionsReturn, F as UsePublicEventLogoOptions, E as UsePublicEventLogoReturn, B as UsePublicEventOptions, A as UsePublicEventReturn, D as UsePublicFileDisplayOptions, C as UsePublicFileDisplayReturn, G as UsePublicRouteParamsReturn, n as clearPublicEventCache, q as clearPublicFileDisplayCache, t as clearPublicLogoCache, z as extractEventCodeFromPath, y as generatePublicRoutePath, o as getPublicEventCacheStats, r as getPublicFileDisplayCacheStats, v as getPublicLogoCacheStats, k as useAppConfig, u as useEventTheme, h as useFormDialog, e as useOrganisationPermissions, f as useOrganisationSecurity, m as usePublicEvent, x as usePublicEventCode, s as usePublicEventLogo, p as usePublicFileDisplay, w as usePublicRouteParams, g as useZodForm } from './usePublicRouteParams-COZ28Mvq.js';
|
|
4
4
|
import * as React$1 from 'react';
|
|
5
5
|
import { SortingState, ColumnFiltersState, ExpandedState } from '@tanstack/react-table';
|
|
6
|
-
import { d as DataRecord, g as PerformanceConfig, S as ServerSideConfig, C as ChunkingConfig, i as SearchIndexConfig, h as PaginationMode, k as ServerSideParams, l as ServerSideResponse, A as AutocompleteOptions, m as GooglePlaceAutocompletePrediction, P as ParsedAddress } from './types-
|
|
6
|
+
import { d as DataRecord, g as PerformanceConfig, S as ServerSideConfig, C as ChunkingConfig, i as SearchIndexConfig, h as PaginationMode, k as ServerSideParams, l as ServerSideResponse, A as AutocompleteOptions, m as GooglePlaceAutocompletePrediction, P as ParsedAddress } from './types-B-K_5VnO.js';
|
|
7
7
|
export { u as useComponentPerformance } from './useComponentPerformance-DE9l5RkL.js';
|
|
8
8
|
import { SupabaseClient } from '@supabase/supabase-js';
|
|
9
|
-
import { D as Database } from './database.generated-
|
|
9
|
+
import { D as Database } from './database.generated-CcnC_DRc.js';
|
|
10
10
|
import { F as FileCategory, a as FileReference } from './file-reference-BavO2eQj.js';
|
|
11
11
|
import 'react-hook-form';
|
|
12
12
|
import 'zod';
|
|
@@ -198,7 +198,7 @@ interface KeyboardShortcutsOptions {
|
|
|
198
198
|
*
|
|
199
199
|
* useKeyboardShortcuts(shortcuts);
|
|
200
200
|
*
|
|
201
|
-
* return <
|
|
201
|
+
* return <main>Content</main>;
|
|
202
202
|
* }
|
|
203
203
|
* ```
|
|
204
204
|
*/
|
package/dist/hooks.js
CHANGED
|
@@ -1,72 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
} from
|
|
16
|
-
import
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
clearPublicFileDisplayCache,
|
|
21
|
-
deleteFile,
|
|
22
|
-
getFileDisplayCacheStats,
|
|
23
|
-
getPublicFileDisplayCacheStats,
|
|
24
|
-
getPublicUrl,
|
|
25
|
-
getSignedUrl,
|
|
26
|
-
invalidateFileDisplayCache,
|
|
27
|
-
listFiles,
|
|
28
|
-
queryCacheHelpers,
|
|
29
|
-
uploadFile,
|
|
30
|
-
useAddressAutocomplete,
|
|
31
|
-
useDebounce,
|
|
32
|
-
useEventTheme,
|
|
33
|
-
useFileDisplay,
|
|
34
|
-
usePreventTabReload,
|
|
35
|
-
usePublicFileDisplay,
|
|
36
|
-
useQueryCache
|
|
37
|
-
} from "./chunk-YKRAFF5K.js";
|
|
38
|
-
import {
|
|
39
|
-
useDataTablePerformance,
|
|
40
|
-
useToast
|
|
41
|
-
} from "./chunk-6SOIHG6Z.js";
|
|
42
|
-
import {
|
|
43
|
-
useAppConfig,
|
|
44
|
-
useOrganisationSecurity
|
|
45
|
-
} from "./chunk-OEWDTMG7.js";
|
|
46
|
-
import "./chunk-KQCRWDSA.js";
|
|
47
|
-
import "./chunk-AVMLPIM7.js";
|
|
48
|
-
import "./chunk-3LPHPB62.js";
|
|
49
|
-
import "./chunk-63FOKYGO.js";
|
|
50
|
-
import "./chunk-36LVWXB2.js";
|
|
51
|
-
import "./chunk-ZSAAAMVR.js";
|
|
52
|
-
import "./chunk-QXHPKYJV.js";
|
|
53
|
-
import {
|
|
54
|
-
useComponentPerformance
|
|
55
|
-
} from "./chunk-E66EQZE6.js";
|
|
56
|
-
import "./chunk-G37KK66H.js";
|
|
57
|
-
import {
|
|
58
|
-
PERFORMANCE_BUDGETS,
|
|
59
|
-
performanceBudgetMonitor
|
|
60
|
-
} from "./chunk-FMUCXFII.js";
|
|
61
|
-
import "./chunk-VBXEHIUJ.js";
|
|
62
|
-
import "./chunk-L4OXEN46.js";
|
|
63
|
-
import {
|
|
64
|
-
createLogger
|
|
65
|
-
} from "./chunk-PWLANIRT.js";
|
|
66
|
-
import "./chunk-DGUM43GV.js";
|
|
1
|
+
export { clearPublicEventCache, clearPublicLogoCache, extractEventCodeFromPath, generatePublicRoutePath, getPublicEventCacheStats, getPublicLogoCacheStats, useFormDialog, useOrganisationPermissions, usePublicEvent, usePublicEventCode, usePublicEventLogo, usePublicRouteParams, useZodForm } from './chunk-MAGBIDNS.js';
|
|
2
|
+
import { getPublicUrl, getSignedUrl, uploadFile, deleteFile, archiveFile, listFiles } from './chunk-FENMYN2U.js';
|
|
3
|
+
export { cleanupQueryCache, clearFileDisplayCache, clearPublicFileDisplayCache, getFileDisplayCacheStats, getPublicFileDisplayCacheStats, invalidateFileDisplayCache, queryCacheHelpers, useAddressAutocomplete, useDebounce, useEventTheme, useFileDisplay, usePreventTabReload, usePublicFileDisplay, useQueryCache } from './chunk-FENMYN2U.js';
|
|
4
|
+
import './chunk-BVP2BCJF.js';
|
|
5
|
+
export { useDataTablePerformance, useFocusTrap, useToast } from './chunk-S7DKJPLT.js';
|
|
6
|
+
export { useAppConfig, useOrganisationSecurity } from './chunk-3O3WHILE.js';
|
|
7
|
+
import './chunk-C7NSAPTL.js';
|
|
8
|
+
import './chunk-FTCRZOG2.js';
|
|
9
|
+
import './chunk-ZFYPMX46.js';
|
|
10
|
+
import './chunk-AHU7G2R5.js';
|
|
11
|
+
import './chunk-6QYDGKQY.js';
|
|
12
|
+
import './chunk-4SXLQIZO.js';
|
|
13
|
+
export { useComponentPerformance } from './chunk-6GLLNA6U.js';
|
|
14
|
+
import './chunk-FYHN4DD5.js';
|
|
15
|
+
import { performanceBudgetMonitor, PERFORMANCE_BUDGETS } from './chunk-SD6WQY43.js';
|
|
16
|
+
import './chunk-HF6O3O37.js';
|
|
17
|
+
import { createLogger } from './chunk-TTRFSOKR.js';
|
|
18
|
+
import './chunk-3RG5ZIWI.js';
|
|
19
|
+
import { useRef, useCallback, useEffect, useState } from 'react';
|
|
67
20
|
|
|
68
|
-
// src/hooks/useFocusManagement.ts
|
|
69
|
-
import { useRef, useCallback, useEffect } from "react";
|
|
70
21
|
function useFocusManagement(options = {}) {
|
|
71
22
|
const {
|
|
72
23
|
trapFocus = false,
|
|
@@ -179,108 +130,6 @@ function useFocusManagement(options = {}) {
|
|
|
179
130
|
handleEscape
|
|
180
131
|
};
|
|
181
132
|
}
|
|
182
|
-
|
|
183
|
-
// src/hooks/useFocusTrap.ts
|
|
184
|
-
import { useRef as useRef2, useEffect as useEffect2, useCallback as useCallback2 } from "react";
|
|
185
|
-
var DEFAULT_FOCUSABLE_SELECTOR = [
|
|
186
|
-
"button:not([disabled])",
|
|
187
|
-
"[href]",
|
|
188
|
-
"input:not([disabled])",
|
|
189
|
-
"select:not([disabled])",
|
|
190
|
-
"textarea:not([disabled])",
|
|
191
|
-
'[tabindex]:not([tabindex="-1"])',
|
|
192
|
-
'[contenteditable="true"]'
|
|
193
|
-
].join(", ");
|
|
194
|
-
function useFocusTrap(options = {}) {
|
|
195
|
-
const {
|
|
196
|
-
isActive = false,
|
|
197
|
-
autoFocus = false,
|
|
198
|
-
restoreFocus = false,
|
|
199
|
-
onEscape,
|
|
200
|
-
focusableSelector = DEFAULT_FOCUSABLE_SELECTOR
|
|
201
|
-
} = options;
|
|
202
|
-
const containerRef = useRef2(null);
|
|
203
|
-
const previouslyFocusedElement = useRef2(null);
|
|
204
|
-
const getFocusableElements = useCallback2(() => {
|
|
205
|
-
if (!containerRef.current) return [];
|
|
206
|
-
return Array.from(
|
|
207
|
-
containerRef.current.querySelectorAll(focusableSelector)
|
|
208
|
-
).filter((element) => {
|
|
209
|
-
return (
|
|
210
|
-
// visible check
|
|
211
|
-
!element.hasAttribute("disabled") && !element.hasAttribute("hidden") && element.offsetParent !== null
|
|
212
|
-
);
|
|
213
|
-
});
|
|
214
|
-
}, [focusableSelector]);
|
|
215
|
-
const focusFirst = useCallback2(() => {
|
|
216
|
-
const elements = getFocusableElements();
|
|
217
|
-
if (elements.length > 0) {
|
|
218
|
-
elements[0].focus();
|
|
219
|
-
}
|
|
220
|
-
}, [getFocusableElements]);
|
|
221
|
-
const focusLast = useCallback2(() => {
|
|
222
|
-
const elements = getFocusableElements();
|
|
223
|
-
if (elements.length > 0) {
|
|
224
|
-
elements[elements.length - 1].focus();
|
|
225
|
-
}
|
|
226
|
-
}, [getFocusableElements]);
|
|
227
|
-
useEffect2(() => {
|
|
228
|
-
if (!isActive || !containerRef.current) return;
|
|
229
|
-
const handleKeyDown = (event) => {
|
|
230
|
-
if (event.key === "Escape" && onEscape) {
|
|
231
|
-
onEscape();
|
|
232
|
-
return;
|
|
233
|
-
}
|
|
234
|
-
if (event.key === "Tab") {
|
|
235
|
-
const focusableElements = getFocusableElements();
|
|
236
|
-
if (focusableElements.length === 0) return;
|
|
237
|
-
const firstElement = focusableElements[0];
|
|
238
|
-
const lastElement = focusableElements[focusableElements.length - 1];
|
|
239
|
-
if (event.shiftKey) {
|
|
240
|
-
if (document.activeElement === firstElement) {
|
|
241
|
-
event.preventDefault();
|
|
242
|
-
lastElement.focus();
|
|
243
|
-
}
|
|
244
|
-
} else {
|
|
245
|
-
if (document.activeElement === lastElement) {
|
|
246
|
-
event.preventDefault();
|
|
247
|
-
firstElement.focus();
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
};
|
|
252
|
-
const container = containerRef.current;
|
|
253
|
-
container.addEventListener("keydown", handleKeyDown);
|
|
254
|
-
return () => {
|
|
255
|
-
container.removeEventListener("keydown", handleKeyDown);
|
|
256
|
-
};
|
|
257
|
-
}, [isActive, onEscape, getFocusableElements]);
|
|
258
|
-
useEffect2(() => {
|
|
259
|
-
if (!isActive) return;
|
|
260
|
-
if (restoreFocus) {
|
|
261
|
-
previouslyFocusedElement.current = document.activeElement;
|
|
262
|
-
}
|
|
263
|
-
if (autoFocus) {
|
|
264
|
-
const timer = setTimeout(focusFirst, 0);
|
|
265
|
-
return () => clearTimeout(timer);
|
|
266
|
-
}
|
|
267
|
-
return () => {
|
|
268
|
-
if (restoreFocus && previouslyFocusedElement.current) {
|
|
269
|
-
previouslyFocusedElement.current.focus();
|
|
270
|
-
previouslyFocusedElement.current = null;
|
|
271
|
-
}
|
|
272
|
-
};
|
|
273
|
-
}, [isActive, autoFocus, restoreFocus, focusFirst]);
|
|
274
|
-
return {
|
|
275
|
-
containerRef,
|
|
276
|
-
focusFirst,
|
|
277
|
-
focusLast,
|
|
278
|
-
getFocusableElements
|
|
279
|
-
};
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
// src/hooks/useKeyboardShortcuts.ts
|
|
283
|
-
import { useEffect as useEffect3, useCallback as useCallback3 } from "react";
|
|
284
133
|
function parseKeyCombo(combo) {
|
|
285
134
|
const parts = combo.toLowerCase().split("+");
|
|
286
135
|
const key = parts.pop();
|
|
@@ -303,7 +152,7 @@ function matchesKeyCombo(event, combo) {
|
|
|
303
152
|
}
|
|
304
153
|
function useKeyboardShortcuts(shortcuts, options = {}) {
|
|
305
154
|
const { element = document, enabled = true } = options;
|
|
306
|
-
const handleKeyDown =
|
|
155
|
+
const handleKeyDown = useCallback((event) => {
|
|
307
156
|
if (!enabled) return;
|
|
308
157
|
for (const shortcut of shortcuts) {
|
|
309
158
|
if (shortcut.enabled === false) continue;
|
|
@@ -319,19 +168,16 @@ function useKeyboardShortcuts(shortcuts, options = {}) {
|
|
|
319
168
|
}
|
|
320
169
|
}
|
|
321
170
|
}, [shortcuts, enabled]);
|
|
322
|
-
|
|
171
|
+
useEffect(() => {
|
|
323
172
|
if (!enabled) return;
|
|
324
173
|
element.addEventListener("keydown", handleKeyDown);
|
|
325
174
|
return () => element.removeEventListener("keydown", handleKeyDown);
|
|
326
175
|
}, [element, enabled, handleKeyDown]);
|
|
327
176
|
}
|
|
328
|
-
|
|
329
|
-
// src/hooks/useIsMobile.ts
|
|
330
|
-
import { useState, useEffect as useEffect4 } from "react";
|
|
331
177
|
var MOBILE_BREAKPOINT = 768;
|
|
332
178
|
function useIsMobile() {
|
|
333
179
|
const [isMobile, setIsMobile] = useState(void 0);
|
|
334
|
-
|
|
180
|
+
useEffect(() => {
|
|
335
181
|
if (typeof window === "undefined") {
|
|
336
182
|
setIsMobile(false);
|
|
337
183
|
return;
|
|
@@ -346,18 +192,15 @@ function useIsMobile() {
|
|
|
346
192
|
}, []);
|
|
347
193
|
return !!isMobile;
|
|
348
194
|
}
|
|
349
|
-
|
|
350
|
-
// src/hooks/useDataTableState.ts
|
|
351
|
-
import { useState as useState2, useCallback as useCallback4 } from "react";
|
|
352
195
|
function useDataTableState(options) {
|
|
353
196
|
const { initialPageSize = 10, data } = options;
|
|
354
|
-
const [sorting, setSorting] =
|
|
355
|
-
const [columnFilters, setColumnFilters] =
|
|
356
|
-
const [expanded, setExpanded] =
|
|
357
|
-
const [pageSize, setPageSize] =
|
|
358
|
-
const [pageIndex, setPageIndex] =
|
|
359
|
-
const [selectedRows, setSelectedRows] =
|
|
360
|
-
const resetState =
|
|
197
|
+
const [sorting, setSorting] = useState([]);
|
|
198
|
+
const [columnFilters, setColumnFilters] = useState([]);
|
|
199
|
+
const [expanded, setExpanded] = useState({});
|
|
200
|
+
const [pageSize, setPageSize] = useState(initialPageSize);
|
|
201
|
+
const [pageIndex, setPageIndex] = useState(0);
|
|
202
|
+
const [selectedRows, setSelectedRows] = useState([]);
|
|
203
|
+
const resetState = useCallback(() => {
|
|
361
204
|
setSorting([]);
|
|
362
205
|
setColumnFilters([]);
|
|
363
206
|
setExpanded({});
|
|
@@ -397,18 +240,15 @@ function useDataTableState(options) {
|
|
|
397
240
|
}
|
|
398
241
|
};
|
|
399
242
|
}
|
|
400
|
-
|
|
401
|
-
// src/hooks/usePerformanceMonitor.ts
|
|
402
|
-
import { useEffect as useEffect5, useRef as useRef3, useCallback as useCallback5 } from "react";
|
|
403
243
|
var log = createLogger("usePerformanceMonitor");
|
|
404
244
|
function usePerformanceMonitor(componentName, enabled = import.meta.env.MODE === "development", budgetName = "COMPONENT_RENDER") {
|
|
405
|
-
const renderStartTime =
|
|
406
|
-
const metrics =
|
|
407
|
-
const startMeasurement =
|
|
245
|
+
const renderStartTime = useRef(0);
|
|
246
|
+
const metrics = useRef([]);
|
|
247
|
+
const startMeasurement = useCallback(() => {
|
|
408
248
|
if (!enabled) return;
|
|
409
249
|
renderStartTime.current = performance.now();
|
|
410
250
|
}, [enabled]);
|
|
411
|
-
const endMeasurement =
|
|
251
|
+
const endMeasurement = useCallback(() => {
|
|
412
252
|
if (!enabled || renderStartTime.current === 0) return;
|
|
413
253
|
const renderTime = performance.now() - renderStartTime.current;
|
|
414
254
|
const metric = {
|
|
@@ -431,15 +271,15 @@ function usePerformanceMonitor(componentName, enabled = import.meta.env.MODE ===
|
|
|
431
271
|
}
|
|
432
272
|
renderStartTime.current = 0;
|
|
433
273
|
}, [enabled, componentName, budgetName]);
|
|
434
|
-
const getMetrics =
|
|
274
|
+
const getMetrics = useCallback(() => {
|
|
435
275
|
return metrics.current.slice();
|
|
436
276
|
}, []);
|
|
437
|
-
const getAverageRenderTime =
|
|
277
|
+
const getAverageRenderTime = useCallback(() => {
|
|
438
278
|
if (metrics.current.length === 0) return 0;
|
|
439
279
|
const total = metrics.current.reduce((sum, metric) => sum + metric.renderTime, 0);
|
|
440
280
|
return total / metrics.current.length;
|
|
441
281
|
}, []);
|
|
442
|
-
const getBudgetStatus =
|
|
282
|
+
const getBudgetStatus = useCallback(() => {
|
|
443
283
|
const budget = PERFORMANCE_BUDGETS[budgetName];
|
|
444
284
|
if (!budget) return null;
|
|
445
285
|
const averageTime = getAverageRenderTime();
|
|
@@ -450,7 +290,7 @@ function usePerformanceMonitor(componentName, enabled = import.meta.env.MODE ===
|
|
|
450
290
|
efficiency: budget.threshold > 0 ? (budget.threshold - averageTime) / budget.threshold : 0
|
|
451
291
|
};
|
|
452
292
|
}, [budgetName, getAverageRenderTime]);
|
|
453
|
-
|
|
293
|
+
useEffect(() => {
|
|
454
294
|
startMeasurement();
|
|
455
295
|
return endMeasurement;
|
|
456
296
|
});
|
|
@@ -462,9 +302,6 @@ function usePerformanceMonitor(componentName, enabled = import.meta.env.MODE ===
|
|
|
462
302
|
endMeasurement
|
|
463
303
|
};
|
|
464
304
|
}
|
|
465
|
-
|
|
466
|
-
// src/hooks/useFileUrlCache.ts
|
|
467
|
-
import { useRef as useRef4, useCallback as useCallback6 } from "react";
|
|
468
305
|
var globalUrlCache = /* @__PURE__ */ new Map();
|
|
469
306
|
var MAX_CACHE_SIZE = 500;
|
|
470
307
|
var DEFAULT_TTL_MS = 3600 * 1e3;
|
|
@@ -488,13 +325,13 @@ function cleanupCache() {
|
|
|
488
325
|
}
|
|
489
326
|
}
|
|
490
327
|
function useFileUrlCache() {
|
|
491
|
-
const cleanupIntervalRef =
|
|
328
|
+
const cleanupIntervalRef = useRef(null);
|
|
492
329
|
if (cleanupIntervalRef.current === null && typeof window !== "undefined") {
|
|
493
330
|
cleanupIntervalRef.current = window.setInterval(() => {
|
|
494
331
|
cleanupCache();
|
|
495
332
|
}, 5 * 60 * 1e3);
|
|
496
333
|
}
|
|
497
|
-
const getUrl =
|
|
334
|
+
const getUrl = useCallback(async (fileReference, supabase, organisationId, ttl = DEFAULT_TTL_MS) => {
|
|
498
335
|
const cacheKey = getCacheKey(fileReference);
|
|
499
336
|
const cached = globalUrlCache.get(cacheKey);
|
|
500
337
|
const now = Date.now();
|
|
@@ -527,7 +364,7 @@ function useFileUrlCache() {
|
|
|
527
364
|
return null;
|
|
528
365
|
}
|
|
529
366
|
}, []);
|
|
530
|
-
const setUrl =
|
|
367
|
+
const setUrl = useCallback((fileReference, url, ttl = DEFAULT_TTL_MS) => {
|
|
531
368
|
const cacheKey = getCacheKey(fileReference);
|
|
532
369
|
globalUrlCache.set(cacheKey, {
|
|
533
370
|
url,
|
|
@@ -535,7 +372,7 @@ function useFileUrlCache() {
|
|
|
535
372
|
});
|
|
536
373
|
cleanupCache();
|
|
537
374
|
}, []);
|
|
538
|
-
const getCachedUrl =
|
|
375
|
+
const getCachedUrl = useCallback((fileReference) => {
|
|
539
376
|
const cacheKey = getCacheKey(fileReference);
|
|
540
377
|
const cached = globalUrlCache.get(cacheKey);
|
|
541
378
|
const now = Date.now();
|
|
@@ -544,14 +381,14 @@ function useFileUrlCache() {
|
|
|
544
381
|
}
|
|
545
382
|
return null;
|
|
546
383
|
}, []);
|
|
547
|
-
const clearFile =
|
|
384
|
+
const clearFile = useCallback((fileReference) => {
|
|
548
385
|
const cacheKey = getCacheKey(fileReference);
|
|
549
386
|
globalUrlCache.delete(cacheKey);
|
|
550
387
|
}, []);
|
|
551
|
-
const clearCache =
|
|
388
|
+
const clearCache = useCallback(() => {
|
|
552
389
|
globalUrlCache.clear();
|
|
553
390
|
}, []);
|
|
554
|
-
const getCacheStats =
|
|
391
|
+
const getCacheStats = useCallback(() => {
|
|
555
392
|
return {
|
|
556
393
|
size: globalUrlCache.size,
|
|
557
394
|
maxSize: MAX_CACHE_SIZE
|
|
@@ -566,17 +403,14 @@ function useFileUrlCache() {
|
|
|
566
403
|
getCacheStats
|
|
567
404
|
};
|
|
568
405
|
}
|
|
569
|
-
|
|
570
|
-
// src/hooks/useStorage.ts
|
|
571
|
-
import { useState as useState3, useCallback as useCallback7 } from "react";
|
|
572
406
|
var log2 = createLogger("useStorage");
|
|
573
407
|
function useStorage({ supabase, appName, orgId }) {
|
|
574
|
-
const [isUploading, setIsUploading] =
|
|
575
|
-
const [uploadError, setUploadError] =
|
|
576
|
-
const [isListing, setIsListing] =
|
|
577
|
-
const [listError, setListError] =
|
|
578
|
-
const [files, setFiles] =
|
|
579
|
-
const handleUploadFile =
|
|
408
|
+
const [isUploading, setIsUploading] = useState(false);
|
|
409
|
+
const [uploadError, setUploadError] = useState(null);
|
|
410
|
+
const [isListing, setIsListing] = useState(false);
|
|
411
|
+
const [listError, setListError] = useState(null);
|
|
412
|
+
const [files, setFiles] = useState([]);
|
|
413
|
+
const handleUploadFile = useCallback(async (file, options = {}) => {
|
|
580
414
|
setIsUploading(true);
|
|
581
415
|
setUploadError(null);
|
|
582
416
|
try {
|
|
@@ -604,10 +438,10 @@ function useStorage({ supabase, appName, orgId }) {
|
|
|
604
438
|
setIsUploading(false);
|
|
605
439
|
}
|
|
606
440
|
}, [supabase, appName, orgId]);
|
|
607
|
-
const handleGetPublicUrl =
|
|
441
|
+
const handleGetPublicUrl = useCallback((path) => {
|
|
608
442
|
return getPublicUrl(supabase, path);
|
|
609
443
|
}, [supabase]);
|
|
610
|
-
const handleGetSignedUrl =
|
|
444
|
+
const handleGetSignedUrl = useCallback(async (path, expiresIn) => {
|
|
611
445
|
try {
|
|
612
446
|
const result = await getSignedUrl(supabase, path, {
|
|
613
447
|
appName,
|
|
@@ -620,7 +454,7 @@ function useStorage({ supabase, appName, orgId }) {
|
|
|
620
454
|
return null;
|
|
621
455
|
}
|
|
622
456
|
}, [supabase, appName, orgId]);
|
|
623
|
-
const handleDeleteFile =
|
|
457
|
+
const handleDeleteFile = useCallback(async (path) => {
|
|
624
458
|
try {
|
|
625
459
|
const result = await deleteFile(supabase, path);
|
|
626
460
|
if (result.success) {
|
|
@@ -634,7 +468,7 @@ function useStorage({ supabase, appName, orgId }) {
|
|
|
634
468
|
};
|
|
635
469
|
}
|
|
636
470
|
}, [supabase]);
|
|
637
|
-
const handleArchiveFile =
|
|
471
|
+
const handleArchiveFile = useCallback(async (path) => {
|
|
638
472
|
try {
|
|
639
473
|
const result = await archiveFile(supabase, path, { appName, orgId });
|
|
640
474
|
if (result.success) {
|
|
@@ -648,7 +482,7 @@ function useStorage({ supabase, appName, orgId }) {
|
|
|
648
482
|
};
|
|
649
483
|
}
|
|
650
484
|
}, [supabase, appName, orgId]);
|
|
651
|
-
const handleListFiles =
|
|
485
|
+
const handleListFiles = useCallback(async (options = {}) => {
|
|
652
486
|
setIsListing(true);
|
|
653
487
|
setListError(null);
|
|
654
488
|
try {
|
|
@@ -668,7 +502,7 @@ function useStorage({ supabase, appName, orgId }) {
|
|
|
668
502
|
setIsListing(false);
|
|
669
503
|
}
|
|
670
504
|
}, [supabase, appName, orgId]);
|
|
671
|
-
const refreshFiles =
|
|
505
|
+
const refreshFiles = useCallback(async () => {
|
|
672
506
|
await handleListFiles();
|
|
673
507
|
}, [handleListFiles]);
|
|
674
508
|
return {
|
|
@@ -698,10 +532,10 @@ function useStorage({ supabase, appName, orgId }) {
|
|
|
698
532
|
};
|
|
699
533
|
}
|
|
700
534
|
function useFileUpload({ supabase, appName, orgId }) {
|
|
701
|
-
const [uploadProgress, setUploadProgress] =
|
|
702
|
-
const [isUploading, setIsUploading] =
|
|
703
|
-
const [uploadError, setUploadError] =
|
|
704
|
-
const uploadWithProgress =
|
|
535
|
+
const [uploadProgress, setUploadProgress] = useState(0);
|
|
536
|
+
const [isUploading, setIsUploading] = useState(false);
|
|
537
|
+
const [uploadError, setUploadError] = useState(null);
|
|
538
|
+
const uploadWithProgress = useCallback(async (file, options = {}) => {
|
|
705
539
|
setIsUploading(true);
|
|
706
540
|
setUploadProgress(0);
|
|
707
541
|
setUploadError(null);
|
|
@@ -741,47 +575,5 @@ function useFileUpload({ supabase, appName, orgId }) {
|
|
|
741
575
|
uploadError
|
|
742
576
|
};
|
|
743
577
|
}
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
clearFileDisplayCache,
|
|
747
|
-
clearPublicEventCache,
|
|
748
|
-
clearPublicFileDisplayCache,
|
|
749
|
-
clearPublicLogoCache,
|
|
750
|
-
extractEventCodeFromPath,
|
|
751
|
-
generatePublicRoutePath,
|
|
752
|
-
getFileDisplayCacheStats,
|
|
753
|
-
getPublicEventCacheStats,
|
|
754
|
-
getPublicFileDisplayCacheStats,
|
|
755
|
-
getPublicLogoCacheStats,
|
|
756
|
-
invalidateFileDisplayCache,
|
|
757
|
-
queryCacheHelpers,
|
|
758
|
-
useAddressAutocomplete,
|
|
759
|
-
useAppConfig,
|
|
760
|
-
useComponentPerformance,
|
|
761
|
-
useDataTablePerformance,
|
|
762
|
-
useDataTableState,
|
|
763
|
-
useDebounce,
|
|
764
|
-
useEventTheme,
|
|
765
|
-
useFileDisplay,
|
|
766
|
-
useFileUpload,
|
|
767
|
-
useFileUrlCache,
|
|
768
|
-
useFocusManagement,
|
|
769
|
-
useFocusTrap,
|
|
770
|
-
useFormDialog,
|
|
771
|
-
useIsMobile,
|
|
772
|
-
useKeyboardShortcuts,
|
|
773
|
-
useOrganisationPermissions,
|
|
774
|
-
useOrganisationSecurity,
|
|
775
|
-
usePerformanceMonitor,
|
|
776
|
-
usePreventTabReload,
|
|
777
|
-
usePublicEvent,
|
|
778
|
-
usePublicEventCode,
|
|
779
|
-
usePublicEventLogo,
|
|
780
|
-
usePublicFileDisplay,
|
|
781
|
-
usePublicRouteParams,
|
|
782
|
-
useQueryCache,
|
|
783
|
-
useStorage,
|
|
784
|
-
useToast,
|
|
785
|
-
useZodForm
|
|
786
|
-
};
|
|
787
|
-
//# sourceMappingURL=hooks.js.map
|
|
578
|
+
|
|
579
|
+
export { useDataTableState, useFileUpload, useFileUrlCache, useFocusManagement, useIsMobile, useKeyboardShortcuts, usePerformanceMonitor, useStorage };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from 'lucide-react';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from 'lucide-react';
|