@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
|
@@ -1,9 +1,103 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
} from
|
|
1
|
+
import { logger } from './chunk-TTRFSOKR.js';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { useRef, useCallback, useEffect, useState, useMemo } from 'react';
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
var DEFAULT_FOCUSABLE_SELECTOR = [
|
|
6
|
+
"button:not([disabled])",
|
|
7
|
+
"[href]",
|
|
8
|
+
"input:not([disabled])",
|
|
9
|
+
"select:not([disabled])",
|
|
10
|
+
"textarea:not([disabled])",
|
|
11
|
+
'[tabindex]:not([tabindex="-1"])',
|
|
12
|
+
'[contenteditable="true"]'
|
|
13
|
+
].join(", ");
|
|
14
|
+
function useFocusTrap(options = {}) {
|
|
15
|
+
const {
|
|
16
|
+
isActive = false,
|
|
17
|
+
autoFocus = false,
|
|
18
|
+
restoreFocus = false,
|
|
19
|
+
onEscape,
|
|
20
|
+
focusableSelector = DEFAULT_FOCUSABLE_SELECTOR
|
|
21
|
+
} = options;
|
|
22
|
+
const containerRef = useRef(null);
|
|
23
|
+
const previouslyFocusedElement = useRef(null);
|
|
24
|
+
const getFocusableElements = useCallback(() => {
|
|
25
|
+
if (!containerRef.current) return [];
|
|
26
|
+
return Array.from(
|
|
27
|
+
containerRef.current.querySelectorAll(focusableSelector)
|
|
28
|
+
).filter((element) => {
|
|
29
|
+
return (
|
|
30
|
+
// visible check
|
|
31
|
+
!element.hasAttribute("disabled") && !element.hasAttribute("hidden") && element.offsetParent !== null
|
|
32
|
+
);
|
|
33
|
+
});
|
|
34
|
+
}, [focusableSelector]);
|
|
35
|
+
const focusFirst = useCallback(() => {
|
|
36
|
+
const elements = getFocusableElements();
|
|
37
|
+
if (elements.length > 0) {
|
|
38
|
+
elements[0].focus();
|
|
39
|
+
}
|
|
40
|
+
}, [getFocusableElements]);
|
|
41
|
+
const focusLast = useCallback(() => {
|
|
42
|
+
const elements = getFocusableElements();
|
|
43
|
+
if (elements.length > 0) {
|
|
44
|
+
elements[elements.length - 1].focus();
|
|
45
|
+
}
|
|
46
|
+
}, [getFocusableElements]);
|
|
47
|
+
useEffect(() => {
|
|
48
|
+
if (!isActive || !containerRef.current) return;
|
|
49
|
+
const handleKeyDown = (event) => {
|
|
50
|
+
if (event.key === "Escape" && onEscape) {
|
|
51
|
+
onEscape();
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
if (event.key === "Tab") {
|
|
55
|
+
const focusableElements = getFocusableElements();
|
|
56
|
+
if (focusableElements.length === 0) return;
|
|
57
|
+
const firstElement = focusableElements[0];
|
|
58
|
+
const lastElement = focusableElements[focusableElements.length - 1];
|
|
59
|
+
if (event.shiftKey) {
|
|
60
|
+
if (document.activeElement === firstElement) {
|
|
61
|
+
event.preventDefault();
|
|
62
|
+
lastElement.focus();
|
|
63
|
+
}
|
|
64
|
+
} else {
|
|
65
|
+
if (document.activeElement === lastElement) {
|
|
66
|
+
event.preventDefault();
|
|
67
|
+
firstElement.focus();
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
const container = containerRef.current;
|
|
73
|
+
container.addEventListener("keydown", handleKeyDown);
|
|
74
|
+
return () => {
|
|
75
|
+
container.removeEventListener("keydown", handleKeyDown);
|
|
76
|
+
};
|
|
77
|
+
}, [isActive, onEscape, getFocusableElements]);
|
|
78
|
+
useEffect(() => {
|
|
79
|
+
if (!isActive) return;
|
|
80
|
+
if (restoreFocus) {
|
|
81
|
+
previouslyFocusedElement.current = document.activeElement;
|
|
82
|
+
}
|
|
83
|
+
if (autoFocus) {
|
|
84
|
+
const timer = setTimeout(focusFirst, 0);
|
|
85
|
+
return () => clearTimeout(timer);
|
|
86
|
+
}
|
|
87
|
+
return () => {
|
|
88
|
+
if (restoreFocus && previouslyFocusedElement.current) {
|
|
89
|
+
previouslyFocusedElement.current.focus();
|
|
90
|
+
previouslyFocusedElement.current = null;
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
}, [isActive, autoFocus, restoreFocus, focusFirst]);
|
|
94
|
+
return {
|
|
95
|
+
containerRef,
|
|
96
|
+
focusFirst,
|
|
97
|
+
focusLast,
|
|
98
|
+
getFocusableElements
|
|
99
|
+
};
|
|
100
|
+
}
|
|
7
101
|
var TOAST_LIMIT = 5;
|
|
8
102
|
var TOAST_REMOVE_DELAY = 1e3;
|
|
9
103
|
var DEFAULT_TOAST_DURATION = 5e3;
|
|
@@ -407,9 +501,6 @@ function safeExecute(fn, fallback) {
|
|
|
407
501
|
return fallback;
|
|
408
502
|
}
|
|
409
503
|
}
|
|
410
|
-
|
|
411
|
-
// src/hooks/useDataTablePerformance.ts
|
|
412
|
-
import { useState as useState2, useEffect as useEffect2, useCallback, useMemo, useRef } from "react";
|
|
413
504
|
function useDataTablePerformance({
|
|
414
505
|
data,
|
|
415
506
|
performance = {},
|
|
@@ -420,24 +511,24 @@ function useDataTablePerformance({
|
|
|
420
511
|
onError,
|
|
421
512
|
enableErrorRecovery = true
|
|
422
513
|
}) {
|
|
423
|
-
const [isLoading, setIsLoading] =
|
|
424
|
-
const [searchQuery, setSearchQuery] =
|
|
425
|
-
const [searchResults, setSearchResults] =
|
|
426
|
-
const [serverData, setServerData] =
|
|
427
|
-
const [memoryUsage, setMemoryUsage] =
|
|
428
|
-
const [errorState, setErrorState] =
|
|
514
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
515
|
+
const [searchQuery, setSearchQuery] = useState("");
|
|
516
|
+
const [searchResults, setSearchResults] = useState([]);
|
|
517
|
+
const [serverData, setServerData] = useState(null);
|
|
518
|
+
const [memoryUsage, setMemoryUsage] = useState(0);
|
|
519
|
+
const [errorState, setErrorState] = useState({
|
|
429
520
|
hasErrors: false,
|
|
430
521
|
errorCount: 0,
|
|
431
522
|
lastError: null,
|
|
432
523
|
fallbacksActive: []
|
|
433
524
|
});
|
|
434
|
-
const [lastFailedOperation, setLastFailedOperation] =
|
|
525
|
+
const [lastFailedOperation, setLastFailedOperation] = useState(null);
|
|
435
526
|
const chunkManagerRef = useRef(null);
|
|
436
527
|
const searchIndexRef = useRef(null);
|
|
437
528
|
const visibilityTrackerRef = useRef(null);
|
|
438
529
|
const errorRecoveryManagerRef = useRef(new ErrorRecoveryManager(fallbackConfig));
|
|
439
530
|
const memoryMonitorRef = useRef(null);
|
|
440
|
-
|
|
531
|
+
useRef(new CircuitBreaker());
|
|
441
532
|
const paginationMode = useMemo(() => {
|
|
442
533
|
if (serverSide) return "server";
|
|
443
534
|
return determinePaginationMode(data?.length || 0, performance.serverSideThreshold);
|
|
@@ -462,12 +553,12 @@ function useDataTablePerformance({
|
|
|
462
553
|
}
|
|
463
554
|
return processedData?.length || 0;
|
|
464
555
|
}, [serverData, processedData?.length, serverSide]);
|
|
465
|
-
|
|
556
|
+
useEffect(() => {
|
|
466
557
|
if (chunking && !chunkManagerRef.current) {
|
|
467
558
|
chunkManagerRef.current = new DataChunkManager(chunking);
|
|
468
559
|
}
|
|
469
560
|
}, [chunking]);
|
|
470
|
-
|
|
561
|
+
useEffect(() => {
|
|
471
562
|
if (searchIndex && !searchIndexRef.current) {
|
|
472
563
|
searchIndexRef.current = new SearchIndex(searchIndex);
|
|
473
564
|
}
|
|
@@ -487,7 +578,7 @@ function useDataTablePerformance({
|
|
|
487
578
|
}), performance.debounceSearch ?? 300),
|
|
488
579
|
[performance.debounceSearch]
|
|
489
580
|
);
|
|
490
|
-
|
|
581
|
+
useEffect(() => {
|
|
491
582
|
debouncedSearch(searchQuery);
|
|
492
583
|
}, [searchQuery, debouncedSearch]);
|
|
493
584
|
const fetchServerData = useCallback(async (params) => {
|
|
@@ -502,7 +593,7 @@ function useDataTablePerformance({
|
|
|
502
593
|
setIsLoading(false);
|
|
503
594
|
}
|
|
504
595
|
}, [serverSide]);
|
|
505
|
-
|
|
596
|
+
useEffect(() => {
|
|
506
597
|
if (!visibilityTrackerRef.current) {
|
|
507
598
|
visibilityTrackerRef.current = new VisibilityTracker();
|
|
508
599
|
}
|
|
@@ -511,7 +602,7 @@ function useDataTablePerformance({
|
|
|
511
602
|
});
|
|
512
603
|
return unsubscribe;
|
|
513
604
|
}, [totalCount, isVirtualized, paginationMode]);
|
|
514
|
-
|
|
605
|
+
useEffect(() => {
|
|
515
606
|
const updateMemoryUsage = () => {
|
|
516
607
|
let usage = 0;
|
|
517
608
|
if (chunkManagerRef.current) {
|
|
@@ -528,7 +619,7 @@ function useDataTablePerformance({
|
|
|
528
619
|
}
|
|
529
620
|
};
|
|
530
621
|
}, [processedData]);
|
|
531
|
-
|
|
622
|
+
useCallback(async (error, operation) => {
|
|
532
623
|
if (enableErrorRecovery) {
|
|
533
624
|
try {
|
|
534
625
|
const recovery = await errorRecoveryManagerRef.current.handleError(error);
|
|
@@ -575,7 +666,7 @@ function useDataTablePerformance({
|
|
|
575
666
|
visibilityTrackerRef.current?.destroy();
|
|
576
667
|
memoryMonitorRef.current?.stopMonitoring();
|
|
577
668
|
}, []);
|
|
578
|
-
|
|
669
|
+
useEffect(() => {
|
|
579
670
|
return cleanup;
|
|
580
671
|
}, [cleanup]);
|
|
581
672
|
return {
|
|
@@ -605,24 +696,4 @@ function useDataTablePerformance({
|
|
|
605
696
|
};
|
|
606
697
|
}
|
|
607
698
|
|
|
608
|
-
export {
|
|
609
|
-
toast,
|
|
610
|
-
useToast,
|
|
611
|
-
determinePaginationMode,
|
|
612
|
-
getOptimalPageSizeOptions,
|
|
613
|
-
chunkData,
|
|
614
|
-
DataChunkManager,
|
|
615
|
-
SearchIndex,
|
|
616
|
-
debounce,
|
|
617
|
-
throttle,
|
|
618
|
-
VisibilityTracker,
|
|
619
|
-
DEFAULT_FALLBACK_CONFIG,
|
|
620
|
-
DataTableErrorType,
|
|
621
|
-
DataTableError,
|
|
622
|
-
ErrorRecoveryManager,
|
|
623
|
-
MemoryMonitor,
|
|
624
|
-
CircuitBreaker,
|
|
625
|
-
safeExecute,
|
|
626
|
-
useDataTablePerformance
|
|
627
|
-
};
|
|
628
|
-
//# sourceMappingURL=chunk-6SOIHG6Z.js.map
|
|
699
|
+
export { CircuitBreaker, DEFAULT_FALLBACK_CONFIG, DataChunkManager, DataTableError, DataTableErrorType, ErrorRecoveryManager, MemoryMonitor, SearchIndex, VisibilityTracker, chunkData, debounce, determinePaginationMode, getOptimalPageSizeOptions, safeExecute, throttle, toast, useDataTablePerformance, useFocusTrap, useToast };
|
|
@@ -69,8 +69,4 @@ performanceBudgetMonitor.setBudget("CHUNK_COUNT", 10, "warning");
|
|
|
69
69
|
performanceBudgetMonitor.setBudget("TREESHAKING_SCORE", 70, "warning");
|
|
70
70
|
performanceBudgetMonitor.setBudget("ERROR_BOUNDARY_TRIGGER", 5, "error");
|
|
71
71
|
|
|
72
|
-
export {
|
|
73
|
-
PERFORMANCE_BUDGETS,
|
|
74
|
-
performanceBudgetMonitor
|
|
75
|
-
};
|
|
76
|
-
//# sourceMappingURL=chunk-FMUCXFII.js.map
|
|
72
|
+
export { PERFORMANCE_BUDGETS, performanceBudgetMonitor };
|
|
@@ -118,10 +118,4 @@ function createLogger(component) {
|
|
|
118
118
|
return Logger.createScopedLogger(component);
|
|
119
119
|
}
|
|
120
120
|
|
|
121
|
-
export {
|
|
122
|
-
LogLevel,
|
|
123
|
-
Logger,
|
|
124
|
-
logger,
|
|
125
|
-
createLogger
|
|
126
|
-
};
|
|
127
|
-
//# sourceMappingURL=chunk-PWLANIRT.js.map
|
|
121
|
+
export { LogLevel, Logger, createLogger, logger };
|
|
@@ -12,9 +12,4 @@ function getAllStylePaths() {
|
|
|
12
12
|
return Object.values(styleConfig).map((config) => config.path);
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
export {
|
|
16
|
-
styleConfig,
|
|
17
|
-
getStylePath,
|
|
18
|
-
getAllStylePaths
|
|
19
|
-
};
|
|
20
|
-
//# sourceMappingURL=chunk-5DRSZLL2.js.map
|
|
15
|
+
export { getAllStylePaths, getStylePath, styleConfig };
|
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
} from
|
|
5
|
-
import {
|
|
6
|
-
createLogger
|
|
7
|
-
} from "./chunk-PWLANIRT.js";
|
|
1
|
+
import { formatInTimeZone, getTimezoneAbbreviation } from './chunk-2HGJFNAH.js';
|
|
2
|
+
import { createLogger } from './chunk-TTRFSOKR.js';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { createClient } from '@supabase/supabase-js';
|
|
5
|
+
import { parseISO, isValid } from 'date-fns';
|
|
8
6
|
|
|
9
7
|
// src/utils/context/sessionTracking.ts
|
|
10
8
|
var log = createLogger("SessionTracking");
|
|
@@ -83,9 +81,6 @@ function useSessionTracking(supabaseClient, appName) {
|
|
|
83
81
|
trackSessionExpired
|
|
84
82
|
};
|
|
85
83
|
}
|
|
86
|
-
|
|
87
|
-
// src/utils/validation/common.ts
|
|
88
|
-
import { z } from "zod";
|
|
89
84
|
var emailSchema = z.string().min(1, "Email is required").email("Invalid email format").max(254, "Email too long");
|
|
90
85
|
var nameSchema = z.string().min(1, "Name is required").max(100, "Name too long").regex(/^[a-zA-Z\s'-]+$/, "Name contains invalid characters");
|
|
91
86
|
var phoneSchema = z.string().regex(/^\+?[\d\s\-\(\)]+$/, "Invalid phone number format").min(10, "Phone number too short").max(20, "Phone number too long");
|
|
@@ -94,9 +89,6 @@ var dateSchema = z.string().regex(/^\d{4}-\d{2}-\d{2}$/, "Date must be in YYYY-M
|
|
|
94
89
|
const parsed = new Date(date);
|
|
95
90
|
return !isNaN(parsed.getTime());
|
|
96
91
|
}, "Invalid date");
|
|
97
|
-
|
|
98
|
-
// src/utils/validation/passwordSchema.ts
|
|
99
|
-
import { z as z2 } from "zod";
|
|
100
92
|
var COMMON_PASSWORDS = /* @__PURE__ */ new Set([
|
|
101
93
|
"password",
|
|
102
94
|
"123456",
|
|
@@ -119,7 +111,7 @@ var WEAK_PATTERNS = [
|
|
|
119
111
|
/^(abc|bcd|cde|def|efg|fgh|ghi|hij|ijk|jkl|klm|lmn|mno|nop|opq|pqr|qrs|rst|stu|tuv|uvw|vwx|wxy|xyz)+/i
|
|
120
112
|
// Sequential letters
|
|
121
113
|
];
|
|
122
|
-
|
|
114
|
+
z.string().min(8, "Password must be at least 8 characters long").max(128, "Password must not exceed 128 characters").refine(
|
|
123
115
|
(password) => /[a-z]/.test(password),
|
|
124
116
|
"Password must contain at least one lowercase letter"
|
|
125
117
|
).refine(
|
|
@@ -146,7 +138,7 @@ var securePasswordSchema = z2.string().min(8, "Password must be at least 8 chara
|
|
|
146
138
|
},
|
|
147
139
|
"Password contains keyboard patterns. Please choose a more secure password"
|
|
148
140
|
);
|
|
149
|
-
var passwordSchema =
|
|
141
|
+
var passwordSchema = z.string().min(6, "Password must be at least 6 characters long").max(128, "Password must not exceed 128 characters");
|
|
150
142
|
function calculatePasswordStrength(password) {
|
|
151
143
|
let score = 0;
|
|
152
144
|
const feedback = [];
|
|
@@ -179,6 +171,89 @@ function calculatePasswordStrength(password) {
|
|
|
179
171
|
else level = "strong";
|
|
180
172
|
return { score: Math.max(0, Math.min(100, score)), feedback, level };
|
|
181
173
|
}
|
|
174
|
+
var DEFAULT_OPTIONS = {
|
|
175
|
+
allowHtml: false,
|
|
176
|
+
allowedTags: [],
|
|
177
|
+
maxLength: 1e3,
|
|
178
|
+
trim: true,
|
|
179
|
+
removeScripts: true,
|
|
180
|
+
removeEvents: true
|
|
181
|
+
};
|
|
182
|
+
function sanitizeUserInput(input, options = {}) {
|
|
183
|
+
if (typeof input !== "string") {
|
|
184
|
+
return "";
|
|
185
|
+
}
|
|
186
|
+
const opts = { ...DEFAULT_OPTIONS, ...options };
|
|
187
|
+
let sanitized = input;
|
|
188
|
+
if (opts.trim) {
|
|
189
|
+
sanitized = sanitized.trim();
|
|
190
|
+
}
|
|
191
|
+
if (opts.maxLength && sanitized.length > opts.maxLength) {
|
|
192
|
+
sanitized = sanitized.substring(0, opts.maxLength);
|
|
193
|
+
}
|
|
194
|
+
if (!opts.allowHtml) {
|
|
195
|
+
sanitized = sanitized.replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'").replace(/\//g, "/");
|
|
196
|
+
} else if (opts.allowedTags && opts.allowedTags.length > 0) {
|
|
197
|
+
const allowedTagsRegex = new RegExp(`<(?!/?(?:${opts.allowedTags.join("|")})s*/?>)[^>]+>`, "gi");
|
|
198
|
+
sanitized = sanitized.replace(allowedTagsRegex, "");
|
|
199
|
+
}
|
|
200
|
+
if (opts.removeScripts) {
|
|
201
|
+
sanitized = sanitized.replace(/<script[^>]*>.*?<\/script>/gi, "").replace(/javascript:/gi, "").replace(/vbscript:/gi, "").replace(/data:/gi, "");
|
|
202
|
+
}
|
|
203
|
+
if (opts.removeEvents) {
|
|
204
|
+
sanitized = sanitized.replace(/on\w+\s*=/gi, "");
|
|
205
|
+
}
|
|
206
|
+
return sanitized;
|
|
207
|
+
}
|
|
208
|
+
function sanitizeEmail(email) {
|
|
209
|
+
if (typeof email !== "string") {
|
|
210
|
+
return "";
|
|
211
|
+
}
|
|
212
|
+
return email.trim().toLowerCase().replace(/[^\w@.-]/g, "");
|
|
213
|
+
}
|
|
214
|
+
function sanitizeFormData(data, schema, sanitizationRules) {
|
|
215
|
+
try {
|
|
216
|
+
if (sanitizationRules && typeof data === "object" && data !== null) {
|
|
217
|
+
const sanitizedData = { ...data };
|
|
218
|
+
Object.entries(sanitizationRules).forEach(([field, options]) => {
|
|
219
|
+
if (typeof sanitizedData[field] === "string") {
|
|
220
|
+
sanitizedData[field] = sanitizeUserInput(sanitizedData[field], options);
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
data = sanitizedData;
|
|
224
|
+
}
|
|
225
|
+
const result = schema.parse(data);
|
|
226
|
+
return { success: true, data: result };
|
|
227
|
+
} catch (error) {
|
|
228
|
+
if (error instanceof z.ZodError) {
|
|
229
|
+
return {
|
|
230
|
+
success: false,
|
|
231
|
+
error: error.errors.map((e) => e.message).join(", ")
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
return {
|
|
235
|
+
success: false,
|
|
236
|
+
error: "Validation failed"
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
var secureEmailSchema = z.string().min(1, "Email is required").email("Invalid email format").max(254, "Email too long").refine(
|
|
241
|
+
(email) => {
|
|
242
|
+
if (!email || typeof email !== "string") return false;
|
|
243
|
+
const domain = email.split("@")[1];
|
|
244
|
+
return domain && domain.includes(".") && domain.length > 3;
|
|
245
|
+
},
|
|
246
|
+
"Invalid email domain"
|
|
247
|
+
).transform((email) => sanitizeEmail(email));
|
|
248
|
+
z.string().min(1, "Email is required").email("Invalid email format");
|
|
249
|
+
z.string().min(1, "Name is required").max(100, "Name too long").regex(/^[a-zA-Z\s'-]+$/, "Name contains invalid characters");
|
|
250
|
+
z.string().regex(/^[\+]?[1-9][\d]{0,15}$/, "Invalid phone number format");
|
|
251
|
+
z.string().url("Invalid URL format");
|
|
252
|
+
z.string().regex(/^\d{4}-\d{2}-\d{2}$/, "Invalid date format (YYYY-MM-DD)");
|
|
253
|
+
z.object({
|
|
254
|
+
email: secureEmailSchema,
|
|
255
|
+
password: z.string().min(1, "Password is required")
|
|
256
|
+
});
|
|
182
257
|
|
|
183
258
|
// src/utils/app/appConfig.ts
|
|
184
259
|
var currentAppConfig = null;
|
|
@@ -201,9 +276,49 @@ function getCurrentAppName() {
|
|
|
201
276
|
function getCurrentAppId() {
|
|
202
277
|
return getAppConfig().appId;
|
|
203
278
|
}
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
279
|
+
var ALLOWED_FILE_PATTERNS = [
|
|
280
|
+
/[\/\\]main\.(tsx?|jsx?)(\?|:|\s|$)/i,
|
|
281
|
+
/[\/\\]App\.(tsx?|jsx?)(\?|:|\s|$)/i,
|
|
282
|
+
/[\/\\]lib[\/\\]supabase\.(tsx?|jsx?)(\?|:|\s|$)/i,
|
|
283
|
+
/[\/\\]src[\/\\]supabase\.(tsx?|jsx?)(\?|:|\s|$)/i
|
|
284
|
+
];
|
|
285
|
+
function isAllowedContext() {
|
|
286
|
+
if (typeof process !== "undefined" && true) {
|
|
287
|
+
return true;
|
|
288
|
+
}
|
|
289
|
+
try {
|
|
290
|
+
const stack = new Error().stack;
|
|
291
|
+
if (!stack) return false;
|
|
292
|
+
const stackLines = stack.split("\n");
|
|
293
|
+
for (const line of stackLines) {
|
|
294
|
+
for (const pattern of ALLOWED_FILE_PATTERNS) {
|
|
295
|
+
if (pattern.test(line)) {
|
|
296
|
+
return true;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
return false;
|
|
301
|
+
} catch {
|
|
302
|
+
return true;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
function createBaseClient(supabaseUrl, supabaseKey) {
|
|
306
|
+
if (!isAllowedContext()) {
|
|
307
|
+
const error = new Error(
|
|
308
|
+
"createBaseClient() can only be called from main.tsx, App.tsx, or lib/supabase.ts.\nThis is a security requirement to ensure the base client is only created once and passed to UnifiedAuthProvider.\nSee: https://github.com/jmruthers/pace-core/blob/main/packages/core/docs/standards/00-pace-core-compliance.md"
|
|
309
|
+
);
|
|
310
|
+
console.error("[pace-core Security Error]", error);
|
|
311
|
+
throw error;
|
|
312
|
+
}
|
|
313
|
+
return createClient(supabaseUrl, supabaseKey, {
|
|
314
|
+
auth: {
|
|
315
|
+
autoRefreshToken: true,
|
|
316
|
+
persistSession: true,
|
|
317
|
+
detectSessionInUrl: true,
|
|
318
|
+
flowType: "pkce"
|
|
319
|
+
}
|
|
320
|
+
});
|
|
321
|
+
}
|
|
207
322
|
function formatDate(date) {
|
|
208
323
|
const dateObj = typeof date === "string" || typeof date === "number" ? new Date(date) : date;
|
|
209
324
|
return dateObj.toLocaleDateString("en-GB", {
|
|
@@ -357,30 +472,4 @@ function formatDateTimeForMap(utcDate, timezone) {
|
|
|
357
472
|
}
|
|
358
473
|
}
|
|
359
474
|
|
|
360
|
-
export {
|
|
361
|
-
useSessionTracking,
|
|
362
|
-
emailSchema,
|
|
363
|
-
nameSchema,
|
|
364
|
-
phoneSchema,
|
|
365
|
-
urlSchema,
|
|
366
|
-
dateSchema,
|
|
367
|
-
passwordSchema,
|
|
368
|
-
calculatePasswordStrength,
|
|
369
|
-
setAppConfig,
|
|
370
|
-
getAppConfig,
|
|
371
|
-
getCurrentAppName,
|
|
372
|
-
getCurrentAppId,
|
|
373
|
-
formatDate,
|
|
374
|
-
formatTime,
|
|
375
|
-
formatDateTime,
|
|
376
|
-
formatCurrency,
|
|
377
|
-
formatNumber,
|
|
378
|
-
formatPercent,
|
|
379
|
-
formatCompactNumber,
|
|
380
|
-
formatFileSize,
|
|
381
|
-
formatDateTimeForDisplay,
|
|
382
|
-
formatDateOnlyForDisplay,
|
|
383
|
-
formatDateTimeForTable,
|
|
384
|
-
formatDateTimeForMap
|
|
385
|
-
};
|
|
386
|
-
//# sourceMappingURL=chunk-FFQEQTNW.js.map
|
|
475
|
+
export { calculatePasswordStrength, createBaseClient, dateSchema, emailSchema, formatCompactNumber, formatCurrency, formatDate, formatDateOnlyForDisplay, formatDateTime, formatDateTimeForDisplay, formatDateTimeForMap, formatDateTimeForTable, formatFileSize, formatNumber, formatPercent, formatTime, getAppConfig, getCurrentAppId, getCurrentAppName, nameSchema, passwordSchema, phoneSchema, sanitizeFormData, sanitizeUserInput, setAppConfig, urlSchema, useSessionTracking };
|