@jmruthers/pace-core 0.6.5 → 0.6.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +104 -0
- package/README.md +5 -403
- package/audit-tool/00-dependencies.cjs +394 -0
- package/audit-tool/audits/01-pace-core-compliance.cjs +556 -0
- package/audit-tool/audits/02-project-structure.cjs +255 -0
- package/audit-tool/audits/03-architecture.cjs +196 -0
- package/audit-tool/audits/04-code-quality.cjs +149 -0
- package/audit-tool/audits/05-styling.cjs +224 -0
- package/audit-tool/audits/06-security-rbac.cjs +544 -0
- package/audit-tool/audits/07-api-tech-stack.cjs +301 -0
- package/audit-tool/audits/08-testing-documentation.cjs +202 -0
- package/audit-tool/audits/09-operations.cjs +208 -0
- package/audit-tool/index.cjs +291 -0
- package/audit-tool/utils/code-utils.cjs +218 -0
- package/audit-tool/utils/file-utils.cjs +230 -0
- package/audit-tool/utils/report-utils.cjs +241 -0
- package/core-usage-manifest.json +93 -0
- package/cursor-rules/00-standards-overview.mdc +156 -0
- package/cursor-rules/01-pace-core-compliance.mdc +586 -0
- package/cursor-rules/02-project-structure.mdc +42 -4
- package/cursor-rules/{03-solid-principles.mdc → 03-architecture.mdc} +126 -10
- package/cursor-rules/04-code-quality.mdc +419 -0
- package/cursor-rules/{08-markup-quality.mdc → 05-styling.mdc} +104 -34
- package/cursor-rules/06-security-rbac.mdc +518 -0
- package/cursor-rules/07-api-tech-stack.mdc +377 -0
- package/cursor-rules/08-testing-documentation.mdc +324 -0
- package/cursor-rules/09-operations.mdc +365 -0
- package/dist/{AuthService-Cb34EQs3.d.ts → AuthService-DmfO5rGS.d.ts} +10 -0
- package/dist/DataTable-7PMH7XN7.js +15 -0
- package/dist/{DataTable-BMRU8a1j.d.ts → DataTable-DRUIgtUH.d.ts} +1 -1
- package/dist/{PublicPageProvider-QTFVrL-Z.d.ts → PublicPageProvider-DlsCaR5v.d.ts} +33 -72
- package/dist/UnifiedAuthProvider-ZT6TIGM7.js +7 -0
- package/dist/api-Y4MQWOFW.js +4 -0
- package/dist/audit-MYQXYZFU.js +3 -0
- package/dist/{chunk-DGUM43GV.js → chunk-3RG5ZIWI.js} +1 -4
- package/dist/{chunk-QXHPKYJV.js → chunk-4SXLQIZO.js} +1 -26
- package/dist/{chunk-UPPMRMYG.js → chunk-5X4QLXRG.js} +73 -151
- package/dist/chunk-6F3IILHI.js +62 -0
- package/dist/{chunk-E66EQZE6.js → chunk-6GLLNA6U.js} +3 -9
- package/dist/{chunk-ZSAAAMVR.js → chunk-6QYDGKQY.js} +1 -4
- package/dist/{chunk-FMUCXFII.js → chunk-7ILTDCL2.js} +9 -5
- package/dist/{chunk-M43Y4SSO.js → chunk-A3W6LW53.js} +15 -13
- package/dist/{chunk-63FOKYGO.js → chunk-AHU7G2R5.js} +2 -11
- package/dist/{chunk-HU2C6SSC.js → chunk-BM4CQ5P3.js} +606 -559
- package/dist/chunk-C7NSAPTL.js +1 -0
- package/dist/{chunk-J36DSWQK.js → chunk-FEJLJNWA.js} +7 -41
- package/dist/{chunk-IHB5DR3H.js → chunk-FTCRZOG2.js} +188 -387
- package/dist/{chunk-G37KK66H.js → chunk-FYHN4DD5.js} +60 -19
- package/dist/chunk-GHYHJTYV.js +994 -0
- package/dist/{chunk-VBXEHIUJ.js → chunk-HF6O3O37.js} +6 -88
- package/dist/{chunk-FFQEQTNW.js → chunk-IUBRCBSY.js} +134 -45
- package/dist/{chunk-6COVEUS7.js → chunk-JGWDVX64.js} +983 -1034
- package/dist/{chunk-RGAWHO7N.js → chunk-L4XMVJKY.js} +77 -222
- package/dist/chunk-MBADTM7L.js +64 -0
- package/dist/{chunk-M7MPQISP.js → chunk-OJ4SKRSV.js} +3 -16
- package/dist/{chunk-IVOFDYWT.js → chunk-Q7Q7V5NV.js} +2109 -1604
- package/dist/{chunk-JGRYX5UX.js → chunk-S7DKJPLT.js} +29 -58
- package/dist/{chunk-PWLANIRT.js → chunk-TTRFSOKR.js} +1 -7
- package/dist/{chunk-5DRSZLL2.js → chunk-UH3NTO3F.js} +1 -6
- package/dist/{chunk-NTM7ZSB6.js → chunk-VBCS3DUA.js} +261 -168
- package/dist/{chunk-EFN2EIMK.js → chunk-ZFYPMX46.js} +271 -87
- package/dist/{chunk-L4OXEN46.js → chunk-ZKAWKYT4.js} +10 -24
- package/dist/components.d.ts +7 -5
- package/dist/components.js +46 -257
- package/dist/{database.generated-CzIvgcPu.d.ts → database.generated-CcnC_DRc.d.ts} +4795 -3691
- package/dist/eslint-rules/index.cjs +35 -0
- package/{src/eslint-rules/pace-core-compliance.cjs → dist/eslint-rules/rules/01-pace-core-compliance.cjs} +234 -235
- package/dist/eslint-rules/rules/04-code-quality.cjs +290 -0
- package/dist/eslint-rules/rules/05-styling.cjs +61 -0
- package/dist/eslint-rules/rules/06-security-rbac.cjs +806 -0
- package/dist/eslint-rules/rules/07-api-tech-stack.cjs +263 -0
- package/dist/eslint-rules/rules/08-testing.cjs +94 -0
- package/dist/eslint-rules/utils/helpers.cjs +42 -0
- package/dist/eslint-rules/utils/manifest-loader.cjs +75 -0
- package/dist/hooks.d.ts +6 -6
- package/dist/hooks.js +62 -172
- package/dist/icons/index.d.ts +1 -0
- package/dist/icons/index.js +1 -0
- package/dist/index.d.ts +12 -11
- package/dist/index.js +67 -660
- package/dist/providers.d.ts +2 -2
- package/dist/providers.js +8 -35
- package/dist/rbac/eslint-rules.d.ts +46 -44
- package/dist/rbac/eslint-rules.js +7 -4
- package/dist/rbac/index.d.ts +109 -586
- package/dist/rbac/index.js +14 -207
- package/dist/styles/index.js +2 -12
- package/dist/theming/runtime.d.ts +14 -1
- package/dist/theming/runtime.js +3 -19
- package/dist/{timezone-CHhWg6b4.d.ts → timezone-BZe_eUxx.d.ts} +175 -1
- package/dist/{types-CkbwOr4Y.d.ts → types-DXstZpNI.d.ts} +4 -17
- package/dist/types-t9H8qKRw.d.ts +55 -0
- package/dist/types.d.ts +1 -1
- package/dist/types.js +7 -94
- package/dist/{usePublicRouteParams-ClnV4tnv.d.ts → usePublicRouteParams-MamNgwqe.d.ts} +20 -20
- package/dist/utils.d.ts +24 -117
- package/dist/utils.js +54 -392
- package/docs/README.md +17 -7
- package/docs/api/README.md +4 -402
- package/docs/api/modules.md +301 -871
- package/docs/api-reference/components.md +21 -21
- package/docs/api-reference/deprecated.md +31 -6
- package/docs/api-reference/hooks.md +80 -80
- package/docs/api-reference/rpc-functions.md +78 -3
- package/docs/api-reference/types.md +1 -1
- package/docs/api-reference/utilities.md +1 -1
- package/docs/architecture/README.md +1 -1
- package/docs/core-concepts/events.md +3 -3
- package/docs/core-concepts/organisations.md +6 -6
- package/docs/core-concepts/permissions.md +6 -6
- package/docs/documentation-index.md +12 -18
- package/docs/getting-started/cursor-rules.md +3 -23
- package/docs/getting-started/dependencies.md +650 -0
- package/docs/getting-started/documentation-index.md +1 -1
- package/docs/getting-started/examples/README.md +4 -4
- package/docs/getting-started/examples/full-featured-app.md +1 -1
- package/docs/getting-started/faq.md +2 -2
- package/docs/getting-started/installation-guide.md +20 -7
- package/docs/getting-started/quick-reference.md +4 -4
- package/docs/getting-started/quick-start.md +23 -12
- package/docs/implementation-guides/authentication.md +15 -15
- package/docs/implementation-guides/component-styling.md +1 -1
- package/docs/implementation-guides/data-tables.md +126 -33
- package/docs/implementation-guides/datatable-rbac-usage.md +1 -1
- package/docs/implementation-guides/dynamic-colors.md +3 -3
- package/docs/implementation-guides/file-upload-storage.md +2 -2
- package/docs/implementation-guides/hierarchical-datatable.md +40 -60
- package/docs/implementation-guides/inactivity-tracking.md +3 -3
- package/docs/implementation-guides/large-datasets.md +3 -2
- package/docs/implementation-guides/organisation-security.md +2 -2
- package/docs/implementation-guides/performance.md +2 -2
- package/docs/implementation-guides/permission-enforcement.md +5 -1
- package/docs/migration/V0.3.44_organisation-context-timing-fix.md +1 -1
- package/docs/migration/V0.4.0_rbac-migration.md +6 -6
- package/docs/rbac/MIGRATION_GUIDE.md +819 -0
- package/docs/rbac/RBAC_CONTRACT.md +724 -0
- package/docs/rbac/README.md +17 -8
- package/docs/rbac/advanced-patterns.md +6 -6
- package/docs/rbac/api-reference.md +20 -20
- package/docs/rbac/edge-functions-guide.md +376 -0
- package/docs/rbac/event-based-apps.md +3 -3
- package/docs/rbac/examples.md +41 -41
- package/docs/rbac/getting-started.md +37 -37
- package/docs/rbac/performance.md +1 -1
- package/docs/rbac/quick-start.md +52 -52
- package/docs/rbac/secure-client-protection.md +1 -35
- package/docs/rbac/troubleshooting.md +1 -1
- package/docs/security/README.md +5 -5
- package/docs/standards/0-standards-overview.md +220 -0
- package/docs/standards/1-pace-core-compliance-standards.md +986 -0
- package/docs/standards/2-project-structure-standards.md +949 -0
- package/docs/standards/3-architecture-standards.md +606 -0
- package/docs/standards/4-code-quality-standards.md +728 -0
- package/docs/standards/5-styling-standards.md +348 -0
- package/docs/standards/{07-rbac-and-rls-standard.md → 6-security-rbac-standards.md} +269 -66
- package/docs/standards/7-api-tech-stack-standards.md +662 -0
- package/docs/standards/8-testing-documentation-standards.md +401 -0
- package/docs/standards/9-operations-standards.md +1102 -0
- package/docs/standards/README.md +185 -57
- package/docs/troubleshooting/README.md +4 -4
- package/docs/troubleshooting/common-issues.md +2 -2
- package/docs/troubleshooting/debugging.md +9 -9
- package/docs/troubleshooting/migration.md +4 -4
- package/docs/troubleshooting/organisation-context-setup.md +42 -19
- package/eslint-config-pace-core.cjs +33 -6
- package/package.json +35 -23
- package/scripts/install-cursor-rules.cjs +25 -6
- package/scripts/install-eslint-config.cjs +284 -0
- package/src/__tests__/fixtures/supabase.ts +1 -1
- package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +3 -3
- package/src/__tests__/helpers/__tests__/optimized-test-setup.test.ts +1 -1
- package/src/__tests__/helpers/__tests__/supabaseMock.test.ts +1 -1
- package/src/__tests__/helpers/__tests__/test-providers.test.tsx +2 -2
- package/src/__tests__/helpers/__tests__/test-utils.test.tsx +13 -13
- package/src/__tests__/helpers/component-test-utils.tsx +1 -1
- package/src/__tests__/helpers/supabaseMock.ts +2 -2
- package/src/__tests__/integration/UserProfile.test.tsx +14 -14
- package/src/__tests__/public-recipe-view.test.ts +38 -9
- package/src/__tests__/rbac/PagePermissionGuard.test.tsx +6 -6
- package/src/__tests__/templates/accessibility.test.template.tsx +9 -9
- package/src/__tests__/templates/component.test.template.tsx +18 -15
- package/src/components/Button/Button.tsx +5 -1
- package/src/components/Calendar/Calendar.tsx +201 -47
- package/src/components/ContextSelector/ContextSelector.tsx +106 -119
- package/src/components/DataTable/AUDIT_REPORT.md +293 -0
- package/src/components/DataTable/__tests__/DataTableCore.test.tsx +10 -2
- package/src/components/DataTable/__tests__/a11y.basic.test.tsx +10 -4
- package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +9 -9
- package/src/components/DataTable/components/ColumnFilter.tsx +63 -74
- package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +43 -41
- package/src/components/DataTable/components/DataTableCore.tsx +186 -13
- package/src/components/DataTable/components/DataTableErrorBoundary.tsx +9 -11
- package/src/components/DataTable/components/DataTableLayout.tsx +35 -21
- package/src/components/DataTable/components/EditFields.tsx +23 -3
- package/src/components/DataTable/components/EditableRow.tsx +12 -9
- package/src/components/DataTable/components/EmptyState.tsx +10 -9
- package/src/components/DataTable/components/FilterRow.tsx +2 -4
- package/src/components/DataTable/components/ImportModal.tsx +124 -126
- package/src/components/DataTable/components/LoadingState.tsx +5 -6
- package/src/components/DataTable/components/RowComponent.tsx +12 -0
- package/src/components/DataTable/components/SortIndicator.tsx +50 -0
- package/src/components/DataTable/components/__tests__/COVERAGE_NOTE.md +4 -4
- package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +23 -82
- package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +37 -9
- package/src/components/DataTable/components/__tests__/EmptyState.test.tsx +7 -4
- package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +12 -4
- package/src/components/DataTable/components/__tests__/LoadingState.test.tsx +41 -27
- package/src/components/DataTable/components/hooks/usePermissionTracking.ts +0 -4
- package/src/components/DataTable/components/index.ts +2 -1
- package/src/components/DataTable/hooks/__tests__/useDataTableState.test.ts +51 -47
- package/src/components/DataTable/hooks/useDataTablePermissions.ts +24 -21
- package/src/components/DataTable/hooks/useDataTableState.ts +125 -9
- package/src/components/DataTable/hooks/useTableColumns.ts +40 -2
- package/src/components/DataTable/hooks/useTableHandlers.ts +11 -0
- package/src/components/DataTable/types.ts +5 -18
- package/src/components/DataTable/utils/a11yUtils.ts +17 -0
- package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +2 -1
- package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.tsx +11 -15
- package/src/components/DateTimeField/DateTimeField.tsx +10 -9
- package/src/components/Dialog/Dialog.test.tsx +128 -104
- package/src/components/Dialog/Dialog.tsx +742 -24
- package/src/components/ErrorBoundary/ErrorBoundary.tsx +77 -79
- package/src/components/FileDisplay/FileDisplay.test.tsx +4 -2
- package/src/components/FileDisplay/FileDisplay.tsx +23 -17
- package/src/components/FileUpload/FileUpload.test.tsx +52 -14
- package/src/components/FileUpload/FileUpload.tsx +112 -130
- package/src/components/Form/Form.test.tsx +6 -8
- package/src/components/Form/Form.tsx +365 -4
- package/src/components/NavigationMenu/NavigationMenu.test.tsx +14 -13
- package/src/components/NavigationMenu/useNavigationFiltering.ts +11 -21
- package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +6 -4
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +11 -15
- package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +108 -61
- package/src/components/PaceLoginPage/PaceLoginPage.tsx +27 -3
- package/src/components/Progress/Progress.tsx +2 -4
- package/src/components/ProtectedRoute/ProtectedRoute.tsx +8 -8
- package/src/components/Select/Select.tsx +109 -98
- package/src/components/Select/types.ts +4 -1
- package/src/components/UserMenu/UserMenu.tsx +9 -6
- package/src/hooks/__tests__/ServiceHooks.test.tsx +16 -16
- package/src/hooks/__tests__/hooks.integration.test.tsx +55 -57
- package/src/hooks/__tests__/useAppConfig.unit.test.ts +129 -67
- package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +97 -97
- package/src/hooks/__tests__/usePublicEvent.simple.test.ts +149 -67
- package/src/hooks/__tests__/usePublicEvent.test.ts +149 -79
- package/src/hooks/__tests__/usePublicEvent.unit.test.ts +158 -109
- package/src/hooks/__tests__/useSessionDraft.test.ts +163 -0
- package/src/hooks/__tests__/useSessionRestoration.unit.test.tsx +10 -5
- package/src/hooks/public/usePublicEvent.ts +67 -195
- package/src/hooks/public/usePublicEventLogo.test.ts +70 -17
- package/src/hooks/public/usePublicEventLogo.ts +24 -14
- package/src/hooks/public/usePublicFileDisplay.ts +2 -2
- package/src/hooks/public/usePublicRouteParams.ts +5 -5
- package/src/hooks/useAppConfig.ts +28 -26
- package/src/hooks/useEventTheme.test.ts +217 -239
- package/src/hooks/useEventTheme.ts +16 -28
- package/src/hooks/useFileDisplay.ts +2 -2
- package/src/hooks/useOrganisationPermissions.ts +5 -7
- package/src/hooks/useQueryCache.ts +0 -1
- package/src/hooks/useSessionDraft.ts +380 -0
- package/src/hooks/useSessionRestoration.ts +3 -1
- package/src/icons/index.ts +27 -0
- package/src/index.ts +5 -0
- package/src/providers/OrganisationProvider.tsx +23 -14
- package/src/providers/UnifiedAuthProvider.smoke.test.tsx +21 -21
- package/src/providers/__tests__/AuthProvider.test.tsx +21 -21
- package/src/providers/__tests__/EventProvider.test.tsx +61 -61
- package/src/providers/__tests__/InactivityProvider.test.tsx +56 -56
- package/src/providers/__tests__/OrganisationProvider.test.tsx +75 -75
- package/src/providers/__tests__/ProviderLifecycle.test.tsx +37 -37
- package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +103 -103
- package/src/providers/services/EventServiceProvider.tsx +1 -24
- package/src/providers/services/UnifiedAuthProvider.tsx +5 -48
- package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +7 -7
- package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +13 -10
- package/src/rbac/__tests__/adapters.comprehensive.test.tsx +7 -457
- package/src/rbac/__tests__/auth-rbac.e2e.test.tsx +33 -7
- package/src/rbac/adapters.tsx +7 -295
- package/src/rbac/api.test.ts +44 -56
- package/src/rbac/api.ts +10 -17
- package/src/rbac/cache-invalidation.ts +0 -1
- package/src/rbac/compliance/index.ts +10 -0
- package/src/rbac/compliance/pattern-detector.ts +553 -0
- package/src/rbac/compliance/runtime-compliance.ts +22 -0
- package/src/rbac/components/AccessDenied.tsx +150 -0
- package/src/rbac/components/NavigationGuard.tsx +12 -20
- package/src/rbac/components/PagePermissionGuard.tsx +4 -24
- package/src/rbac/components/__tests__/NavigationGuard.test.tsx +21 -8
- package/src/rbac/components/index.ts +3 -41
- package/src/rbac/eslint-rules.js +1 -1
- package/src/rbac/hooks/index.ts +0 -3
- package/src/rbac/hooks/permissions/index.ts +0 -3
- package/src/rbac/hooks/permissions/useAccessLevel.ts +4 -8
- package/src/rbac/hooks/usePermissions.ts +0 -3
- package/src/rbac/hooks/useResolvedScope.test.ts +57 -47
- package/src/rbac/hooks/useResolvedScope.ts +58 -140
- package/src/rbac/hooks/useResourcePermissions.test.ts +124 -38
- package/src/rbac/hooks/useResourcePermissions.ts +139 -48
- package/src/rbac/hooks/useRoleManagement.test.ts +65 -22
- package/src/rbac/hooks/useRoleManagement.ts +147 -19
- package/src/rbac/hooks/useSecureSupabase.ts +4 -8
- package/src/rbac/index.ts +7 -9
- package/src/rbac/utils/contextValidator.ts +9 -7
- package/src/services/AuthService.ts +130 -18
- package/src/services/EventService.ts +4 -97
- package/src/services/InactivityService.ts +16 -0
- package/src/services/OrganisationService.ts +7 -44
- package/src/services/__tests__/OrganisationService.test.ts +26 -8
- package/src/services/base/BaseService.ts +0 -3
- package/src/styles/core.css +7 -0
- package/src/theming/__tests__/parseEventColours.test.ts +9 -3
- package/src/theming/parseEventColours.ts +22 -10
- package/src/types/database.generated.ts +4733 -3809
- package/src/utils/__tests__/lazyLoad.unit.test.tsx +42 -39
- package/src/utils/__tests__/organisationContext.unit.test.ts +9 -10
- package/src/utils/context/organisationContext.test.ts +13 -28
- package/src/utils/context/organisationContext.ts +21 -52
- package/src/utils/dynamic/dynamicUtils.ts +1 -1
- package/src/utils/file-reference/index.ts +39 -15
- package/src/utils/formatting/formatDateTime.test.ts +3 -2
- package/src/utils/google-places/loadGoogleMapsScript.ts +29 -4
- package/src/utils/index.ts +4 -1
- package/src/utils/persistence/__tests__/keyDerivation.test.ts +135 -0
- package/src/utils/persistence/__tests__/sensitiveFieldDetection.test.ts +123 -0
- package/src/utils/persistence/keyDerivation.ts +304 -0
- package/src/utils/persistence/sensitiveFieldDetection.ts +212 -0
- package/src/utils/security/secureStorage.ts +5 -5
- package/src/utils/storage/README.md +1 -1
- package/src/utils/storage/helpers.ts +3 -3
- package/src/utils/supabase/createBaseClient.ts +147 -0
- package/src/utils/timezone/timezone.test.ts +1 -2
- package/src/utils/timezone/timezone.ts +1 -1
- package/src/utils/validation/csrf.ts +4 -4
- package/cursor-rules/00-pace-core-compliance.mdc +0 -331
- package/cursor-rules/01-standards-compliance.mdc +0 -244
- package/cursor-rules/04-testing-standards.mdc +0 -268
- package/cursor-rules/05-bug-reports-and-features.mdc +0 -246
- package/cursor-rules/06-code-quality.mdc +0 -309
- package/cursor-rules/07-tech-stack-compliance.mdc +0 -214
- package/cursor-rules/CHANGELOG.md +0 -119
- package/cursor-rules/README.md +0 -192
- package/dist/DataTable-AOVNCPTX.js +0 -175
- package/dist/DataTable-AOVNCPTX.js.map +0 -1
- package/dist/UnifiedAuthProvider-4SBX4LU5.js +0 -18
- package/dist/UnifiedAuthProvider-4SBX4LU5.js.map +0 -1
- package/dist/api-O6HTBX5Y.js +0 -52
- package/dist/api-O6HTBX5Y.js.map +0 -1
- package/dist/audit-V53FV5AG.js +0 -17
- package/dist/audit-V53FV5AG.js.map +0 -1
- package/dist/chunk-5DRSZLL2.js.map +0 -1
- package/dist/chunk-63FOKYGO.js.map +0 -1
- package/dist/chunk-6COVEUS7.js.map +0 -1
- package/dist/chunk-AFVQODI2.js +0 -263
- package/dist/chunk-AFVQODI2.js.map +0 -1
- package/dist/chunk-DGUM43GV.js.map +0 -1
- package/dist/chunk-E66EQZE6.js.map +0 -1
- package/dist/chunk-EFN2EIMK.js.map +0 -1
- package/dist/chunk-FFQEQTNW.js.map +0 -1
- package/dist/chunk-FMUCXFII.js.map +0 -1
- package/dist/chunk-G37KK66H.js.map +0 -1
- package/dist/chunk-G7QEZTYQ.js +0 -2053
- package/dist/chunk-G7QEZTYQ.js.map +0 -1
- package/dist/chunk-HU2C6SSC.js.map +0 -1
- package/dist/chunk-IHB5DR3H.js.map +0 -1
- package/dist/chunk-IVOFDYWT.js.map +0 -1
- package/dist/chunk-J36DSWQK.js.map +0 -1
- package/dist/chunk-JGRYX5UX.js.map +0 -1
- package/dist/chunk-KQCRWDSA.js +0 -1
- package/dist/chunk-KQCRWDSA.js.map +0 -1
- package/dist/chunk-L4OXEN46.js.map +0 -1
- package/dist/chunk-LMC26NLJ.js +0 -84
- package/dist/chunk-LMC26NLJ.js.map +0 -1
- package/dist/chunk-M43Y4SSO.js.map +0 -1
- package/dist/chunk-M7MPQISP.js.map +0 -1
- package/dist/chunk-NTM7ZSB6.js.map +0 -1
- package/dist/chunk-PWLANIRT.js.map +0 -1
- package/dist/chunk-QXHPKYJV.js.map +0 -1
- package/dist/chunk-RGAWHO7N.js.map +0 -1
- package/dist/chunk-UPPMRMYG.js.map +0 -1
- package/dist/chunk-VBXEHIUJ.js.map +0 -1
- package/dist/chunk-ZSAAAMVR.js.map +0 -1
- package/dist/components.js.map +0 -1
- package/dist/contextValidator-5OGXSPKS.js +0 -9
- package/dist/contextValidator-5OGXSPKS.js.map +0 -1
- package/dist/eslint-rules/pace-core-compliance.cjs +0 -510
- package/dist/hooks.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/providers.js.map +0 -1
- package/dist/rbac/eslint-rules.js.map +0 -1
- package/dist/rbac/index.js.map +0 -1
- package/dist/styles/index.js.map +0 -1
- package/dist/theming/runtime.js.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/utils.js.map +0 -1
- package/docs/best-practices/README.md +0 -472
- package/docs/best-practices/accessibility.md +0 -601
- package/docs/best-practices/common-patterns.md +0 -516
- package/docs/best-practices/deployment.md +0 -1103
- package/docs/best-practices/performance.md +0 -1328
- package/docs/best-practices/security.md +0 -940
- package/docs/best-practices/testing.md +0 -1034
- package/docs/rbac/compliance/compliance-guide.md +0 -544
- package/docs/standards/01-architecture-standard.md +0 -44
- package/docs/standards/02-api-and-rpc-standard.md +0 -39
- package/docs/standards/03-component-standard.md +0 -32
- package/docs/standards/04-code-style-standard.md +0 -32
- package/docs/standards/05-security-standard.md +0 -44
- package/docs/standards/06-testing-and-docs-standard.md +0 -29
- package/docs/standards/pace-core-compliance.md +0 -432
- package/scripts/audit/core/checks/accessibility.cjs +0 -197
- package/scripts/audit/core/checks/api-usage.cjs +0 -191
- package/scripts/audit/core/checks/bundle.cjs +0 -142
- package/scripts/audit/core/checks/compliance.cjs +0 -2706
- package/scripts/audit/core/checks/config.cjs +0 -54
- package/scripts/audit/core/checks/coverage.cjs +0 -84
- package/scripts/audit/core/checks/dependencies.cjs +0 -994
- package/scripts/audit/core/checks/documentation.cjs +0 -268
- package/scripts/audit/core/checks/environment.cjs +0 -116
- package/scripts/audit/core/checks/error-handling.cjs +0 -340
- package/scripts/audit/core/checks/forms.cjs +0 -172
- package/scripts/audit/core/checks/heuristics.cjs +0 -68
- package/scripts/audit/core/checks/hooks.cjs +0 -334
- package/scripts/audit/core/checks/imports.cjs +0 -244
- package/scripts/audit/core/checks/performance.cjs +0 -325
- package/scripts/audit/core/checks/routes.cjs +0 -117
- package/scripts/audit/core/checks/state.cjs +0 -130
- package/scripts/audit/core/checks/structure.cjs +0 -65
- package/scripts/audit/core/checks/style.cjs +0 -584
- package/scripts/audit/core/checks/testing.cjs +0 -122
- package/scripts/audit/core/checks/typescript.cjs +0 -61
- package/scripts/audit/core/scanner.cjs +0 -199
- package/scripts/audit/core/utils.cjs +0 -137
- package/scripts/audit/index.cjs +0 -223
- package/scripts/audit/reporters/console.cjs +0 -151
- package/scripts/audit/reporters/json.cjs +0 -54
- package/scripts/audit/reporters/markdown.cjs +0 -124
- package/scripts/audit-consuming-app.cjs +0 -86
- package/src/components/DataTable/components/DataTableBody.tsx +0 -454
- package/src/components/DataTable/components/DraggableColumnHeader.tsx +0 -156
- package/src/components/DataTable/components/ExpandButton.tsx +0 -113
- package/src/components/DataTable/components/GroupHeader.tsx +0 -54
- package/src/components/DataTable/components/ViewRowModal.tsx +0 -68
- package/src/components/DataTable/components/VirtualizedDataTable.tsx +0 -525
- package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +0 -462
- package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +0 -393
- package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +0 -476
- package/src/components/DataTable/components/__tests__/VirtualizedDataTable.test.tsx +0 -128
- package/src/components/DataTable/core/DataTableContext.tsx +0 -216
- package/src/components/DataTable/core/__tests__/DataTableContext.test.tsx +0 -136
- package/src/components/DataTable/hooks/__tests__/useColumnReordering.test.ts +0 -570
- package/src/components/DataTable/hooks/useColumnReordering.ts +0 -123
- package/src/components/DataTable/utils/debugTools.ts +0 -514
- package/src/eslint-rules/pace-core-compliance.js +0 -638
- package/src/rbac/components/EnhancedNavigationMenu.test.tsx +0 -555
- package/src/rbac/components/EnhancedNavigationMenu.tsx +0 -293
- package/src/rbac/components/NavigationProvider.test.tsx +0 -481
- package/src/rbac/components/NavigationProvider.tsx +0 -345
- package/src/rbac/components/PagePermissionProvider.test.tsx +0 -476
- package/src/rbac/components/PagePermissionProvider.tsx +0 -279
- package/src/rbac/components/PermissionEnforcer.tsx +0 -312
- package/src/rbac/components/RoleBasedRouter.tsx +0 -440
- package/src/rbac/components/SecureDataProvider.test.tsx +0 -543
- package/src/rbac/components/SecureDataProvider.tsx +0 -339
- package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +0 -620
- package/src/rbac/components/__tests__/NavigationProvider.test.tsx +0 -726
- package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +0 -661
- package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +0 -881
- package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +0 -783
- package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +0 -645
- package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +0 -659
- package/src/rbac/hooks/permissions/useCachedPermissions.ts +0 -79
- package/src/rbac/hooks/permissions/useHasAllPermissions.ts +0 -90
- package/src/rbac/hooks/permissions/useHasAnyPermission.ts +0 -90
package/dist/utils.js
CHANGED
|
@@ -1,103 +1,20 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
getCurrentAppId,
|
|
19
|
-
nameSchema,
|
|
20
|
-
passwordSchema,
|
|
21
|
-
phoneSchema,
|
|
22
|
-
setAppConfig,
|
|
23
|
-
urlSchema,
|
|
24
|
-
useSessionTracking
|
|
25
|
-
} from "./chunk-FFQEQTNW.js";
|
|
26
|
-
import {
|
|
27
|
-
CachedAppIdResolver,
|
|
28
|
-
LoadingSpinner,
|
|
29
|
-
cachedAppIdResolver,
|
|
30
|
-
formatInTimeZone,
|
|
31
|
-
formatTimeInTimeZone,
|
|
32
|
-
fromZonedTime,
|
|
33
|
-
getAppId,
|
|
34
|
-
getAppIds,
|
|
35
|
-
getTimeZoneDifference,
|
|
36
|
-
getTimezoneAbbreviation,
|
|
37
|
-
getUserTimeZone,
|
|
38
|
-
roundToNearestMinutes,
|
|
39
|
-
toZonedTime
|
|
40
|
-
} from "./chunk-J36DSWQK.js";
|
|
41
|
-
import {
|
|
42
|
-
cn,
|
|
43
|
-
renderSafeHtml,
|
|
44
|
-
sanitizeHtml,
|
|
45
|
-
validateHtml
|
|
46
|
-
} from "./chunk-M43Y4SSO.js";
|
|
47
|
-
import {
|
|
48
|
-
getAppNameFromBuildTime,
|
|
49
|
-
getAppNameFromEnvironment,
|
|
50
|
-
getAppNameFromGlobal,
|
|
51
|
-
getAppNameFromPackageJson,
|
|
52
|
-
getCurrentAppName,
|
|
53
|
-
getCurrentAppNameWithFallback,
|
|
54
|
-
setRBACAppName
|
|
55
|
-
} from "./chunk-M7MPQISP.js";
|
|
56
|
-
import {
|
|
57
|
-
useComponentPerformance
|
|
58
|
-
} from "./chunk-E66EQZE6.js";
|
|
59
|
-
import {
|
|
60
|
-
clearInFlightRequests,
|
|
61
|
-
createAddressFromPlaceResult,
|
|
62
|
-
deduplicatedQuery,
|
|
63
|
-
fetchPlaceAutocomplete,
|
|
64
|
-
fetchPlaceDetails,
|
|
65
|
-
generateRequestKey,
|
|
66
|
-
getAddressByPlaceId,
|
|
67
|
-
getInFlightRequestStats,
|
|
68
|
-
getOrCreateRequest,
|
|
69
|
-
parseAddressComponents
|
|
70
|
-
} from "./chunk-G37KK66H.js";
|
|
71
|
-
import {
|
|
72
|
-
PERFORMANCE_BUDGETS,
|
|
73
|
-
performanceBudgetMonitor
|
|
74
|
-
} from "./chunk-FMUCXFII.js";
|
|
75
|
-
import {
|
|
76
|
-
clearOrganisationContext,
|
|
77
|
-
getOrganisationContext,
|
|
78
|
-
isOrganisationContextAvailable,
|
|
79
|
-
secureStorage,
|
|
80
|
-
setOrganisationContext
|
|
81
|
-
} from "./chunk-VBXEHIUJ.js";
|
|
82
|
-
import {
|
|
83
|
-
changePasswordSchema,
|
|
84
|
-
combineSchemas,
|
|
85
|
-
contactFormSchema,
|
|
86
|
-
loginSchema,
|
|
87
|
-
passwordResetSchema,
|
|
88
|
-
pickSchema,
|
|
89
|
-
registrationSchema,
|
|
90
|
-
secureLoginSchema,
|
|
91
|
-
securePasswordSchema,
|
|
92
|
-
userProfileSchema
|
|
93
|
-
} from "./chunk-LMC26NLJ.js";
|
|
94
|
-
import {
|
|
95
|
-
LogLevel,
|
|
96
|
-
Logger,
|
|
97
|
-
createLogger,
|
|
98
|
-
logger
|
|
99
|
-
} from "./chunk-PWLANIRT.js";
|
|
100
|
-
import "./chunk-DGUM43GV.js";
|
|
1
|
+
import { sanitizeUserInput, emailSchema, nameSchema, sanitizeFormData } from './chunk-IUBRCBSY.js';
|
|
2
|
+
export { calculatePasswordStrength, createBaseClient, dateSchema, emailSchema, formatCompactNumber, formatCurrency, formatDate, formatDateOnlyForDisplay, formatDateTime, formatDateTimeForDisplay, formatDateTimeForMap, formatDateTimeForTable, formatFileSize, formatNumber, formatPercent, formatTime, getAppConfig, getCurrentAppId, nameSchema, passwordSchema, phoneSchema, sanitizeFormData, sanitizeUserInput, setAppConfig, urlSchema, useSessionTracking } from './chunk-IUBRCBSY.js';
|
|
3
|
+
export { CachedAppIdResolver, cachedAppIdResolver, formatInTimeZone, formatTimeInTimeZone, fromZonedTime, getAppId, getAppIds, getTimeZoneDifference, getTimezoneAbbreviation, getUserTimeZone, roundToNearestMinutes, toZonedTime } from './chunk-FEJLJNWA.js';
|
|
4
|
+
import { LoadingSpinner } from './chunk-A3W6LW53.js';
|
|
5
|
+
export { renderSafeHtml, sanitizeHtml, validateHtml } from './chunk-A3W6LW53.js';
|
|
6
|
+
export { getAppNameFromBuildTime, getAppNameFromEnvironment, getAppNameFromGlobal, getAppNameFromPackageJson, getCurrentAppName, getCurrentAppNameWithFallback, setRBACAppName } from './chunk-OJ4SKRSV.js';
|
|
7
|
+
export { useComponentPerformance } from './chunk-6GLLNA6U.js';
|
|
8
|
+
export { clearInFlightRequests, clearOrganisationContext, createAddressFromPlaceResult, deduplicatedQuery, fetchPlaceAutocomplete, fetchPlaceDetails, generateRequestKey, getAddressByPlaceId, getInFlightRequestStats, getOrCreateRequest, getOrganisationContext, isOrganisationContextAvailable, parseAddressComponents, setOrganisationContext } from './chunk-FYHN4DD5.js';
|
|
9
|
+
export { PERFORMANCE_BUDGETS, cn, performanceBudgetMonitor } from './chunk-7ILTDCL2.js';
|
|
10
|
+
import { secureStorage } from './chunk-HF6O3O37.js';
|
|
11
|
+
import { createLogger } from './chunk-TTRFSOKR.js';
|
|
12
|
+
export { LogLevel, Logger, createLogger, logger } from './chunk-TTRFSOKR.js';
|
|
13
|
+
export { changePasswordSchema, combineSchemas, contactFormSchema, loginSchema, passwordResetSchema, pickSchema, registrationSchema, secureLoginSchema, securePasswordSchema, userProfileSchema } from './chunk-MBADTM7L.js';
|
|
14
|
+
import './chunk-3RG5ZIWI.js';
|
|
15
|
+
import { z } from 'zod';
|
|
16
|
+
import { lazy, Suspense } from 'react';
|
|
17
|
+
import { jsx } from 'react/jsx-runtime';
|
|
101
18
|
|
|
102
19
|
// src/utils/core/debugLogger.ts
|
|
103
20
|
var DebugLogger = class {
|
|
@@ -206,104 +123,13 @@ function deepMerge(target, source) {
|
|
|
206
123
|
function isObject(item) {
|
|
207
124
|
return item !== null && typeof item === "object" && !Array.isArray(item);
|
|
208
125
|
}
|
|
209
|
-
|
|
210
|
-
// src/utils/validation/validationUtils.ts
|
|
211
|
-
import { z as z2 } from "zod";
|
|
212
|
-
|
|
213
|
-
// src/utils/validation/sanitization.ts
|
|
214
|
-
import { z } from "zod";
|
|
215
|
-
var DEFAULT_OPTIONS = {
|
|
216
|
-
allowHtml: false,
|
|
217
|
-
allowedTags: [],
|
|
218
|
-
maxLength: 1e3,
|
|
219
|
-
trim: true,
|
|
220
|
-
removeScripts: true,
|
|
221
|
-
removeEvents: true
|
|
222
|
-
};
|
|
223
|
-
function sanitizeUserInput(input, options = {}) {
|
|
224
|
-
if (typeof input !== "string") {
|
|
225
|
-
return "";
|
|
226
|
-
}
|
|
227
|
-
const opts = { ...DEFAULT_OPTIONS, ...options };
|
|
228
|
-
let sanitized = input;
|
|
229
|
-
if (opts.trim) {
|
|
230
|
-
sanitized = sanitized.trim();
|
|
231
|
-
}
|
|
232
|
-
if (opts.maxLength && sanitized.length > opts.maxLength) {
|
|
233
|
-
sanitized = sanitized.substring(0, opts.maxLength);
|
|
234
|
-
}
|
|
235
|
-
if (!opts.allowHtml) {
|
|
236
|
-
sanitized = sanitized.replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'").replace(/\//g, "/");
|
|
237
|
-
} else if (opts.allowedTags && opts.allowedTags.length > 0) {
|
|
238
|
-
const allowedTagsRegex = new RegExp(`<(?!/?(?:${opts.allowedTags.join("|")})s*/?>)[^>]+>`, "gi");
|
|
239
|
-
sanitized = sanitized.replace(allowedTagsRegex, "");
|
|
240
|
-
}
|
|
241
|
-
if (opts.removeScripts) {
|
|
242
|
-
sanitized = sanitized.replace(/<script[^>]*>.*?<\/script>/gi, "").replace(/javascript:/gi, "").replace(/vbscript:/gi, "").replace(/data:/gi, "");
|
|
243
|
-
}
|
|
244
|
-
if (opts.removeEvents) {
|
|
245
|
-
sanitized = sanitized.replace(/on\w+\s*=/gi, "");
|
|
246
|
-
}
|
|
247
|
-
return sanitized;
|
|
248
|
-
}
|
|
249
|
-
function sanitizeEmail(email) {
|
|
250
|
-
if (typeof email !== "string") {
|
|
251
|
-
return "";
|
|
252
|
-
}
|
|
253
|
-
return email.trim().toLowerCase().replace(/[^\w@.-]/g, "");
|
|
254
|
-
}
|
|
255
|
-
function sanitizeFormData(data, schema, sanitizationRules) {
|
|
256
|
-
try {
|
|
257
|
-
if (sanitizationRules && typeof data === "object" && data !== null) {
|
|
258
|
-
const sanitizedData = { ...data };
|
|
259
|
-
Object.entries(sanitizationRules).forEach(([field, options]) => {
|
|
260
|
-
if (typeof sanitizedData[field] === "string") {
|
|
261
|
-
sanitizedData[field] = sanitizeUserInput(sanitizedData[field], options);
|
|
262
|
-
}
|
|
263
|
-
});
|
|
264
|
-
data = sanitizedData;
|
|
265
|
-
}
|
|
266
|
-
const result = schema.parse(data);
|
|
267
|
-
return { success: true, data: result };
|
|
268
|
-
} catch (error) {
|
|
269
|
-
if (error instanceof z.ZodError) {
|
|
270
|
-
return {
|
|
271
|
-
success: false,
|
|
272
|
-
error: error.errors.map((e) => e.message).join(", ")
|
|
273
|
-
};
|
|
274
|
-
}
|
|
275
|
-
return {
|
|
276
|
-
success: false,
|
|
277
|
-
error: "Validation failed"
|
|
278
|
-
};
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
var secureEmailSchema = z.string().min(1, "Email is required").email("Invalid email format").max(254, "Email too long").refine(
|
|
282
|
-
(email) => {
|
|
283
|
-
if (!email || typeof email !== "string") return false;
|
|
284
|
-
const domain = email.split("@")[1];
|
|
285
|
-
return domain && domain.includes(".") && domain.length > 3;
|
|
286
|
-
},
|
|
287
|
-
"Invalid email domain"
|
|
288
|
-
).transform((email) => sanitizeEmail(email));
|
|
289
|
-
var emailSchema2 = z.string().min(1, "Email is required").email("Invalid email format");
|
|
290
|
-
var nameSchema2 = z.string().min(1, "Name is required").max(100, "Name too long").regex(/^[a-zA-Z\s'-]+$/, "Name contains invalid characters");
|
|
291
|
-
var phoneSchema2 = z.string().regex(/^[\+]?[1-9][\d]{0,15}$/, "Invalid phone number format");
|
|
292
|
-
var urlSchema2 = z.string().url("Invalid URL format");
|
|
293
|
-
var dateSchema2 = z.string().regex(/^\d{4}-\d{2}-\d{2}$/, "Invalid date format (YYYY-MM-DD)");
|
|
294
|
-
var secureLoginSchema2 = z.object({
|
|
295
|
-
email: secureEmailSchema,
|
|
296
|
-
password: z.string().min(1, "Password is required")
|
|
297
|
-
});
|
|
298
|
-
|
|
299
|
-
// src/utils/validation/validationUtils.ts
|
|
300
126
|
function validateUserInput(schema, data, sanitizationRules) {
|
|
301
127
|
return sanitizeFormData(data, schema, sanitizationRules);
|
|
302
128
|
}
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
var usernameSchema =
|
|
306
|
-
|
|
129
|
+
z.string().transform((email) => email.toLowerCase().trim()).pipe(z.string().min(1, "Email is required").email("Invalid email format").max(254, "Email too long"));
|
|
130
|
+
z.string().min(8, "Password must be at least 8 characters").max(128, "Password too long").regex(/[A-Z]/, "Password must contain at least one uppercase letter").regex(/[a-z]/, "Password must contain at least one lowercase letter").regex(/[0-9]/, "Password must contain at least one number").regex(/[^A-Za-z0-9]/, "Password must contain at least one special character");
|
|
131
|
+
var usernameSchema = z.string().transform((username) => username.toLowerCase().trim()).pipe(z.string().min(3, "Username must be at least 3 characters").max(30, "Username too long").regex(/^[a-zA-Z0-9_-]+$/, "Username can only contain letters, numbers, hyphens, and underscores"));
|
|
132
|
+
z.string().min(1, "Name is required").max(100, "Name too long").refine((name) => {
|
|
307
133
|
const dangerousPatterns = [
|
|
308
134
|
/<script/i,
|
|
309
135
|
/<img/i,
|
|
@@ -318,11 +144,11 @@ var nameSchema3 = z2.string().min(1, "Name is required").max(100, "Name too long
|
|
|
318
144
|
maxLength: 100,
|
|
319
145
|
trim: true
|
|
320
146
|
}));
|
|
321
|
-
|
|
147
|
+
z.string().min(10, "Phone number must be at least 10 digits").max(20, "Phone number too long").regex(/^[\+]?[0-9\s\-\(\)\.]+$/, "Invalid phone number format").refine((phone) => {
|
|
322
148
|
const digitsOnly = phone.replace(/\D/g, "");
|
|
323
149
|
return digitsOnly.length >= 10 && digitsOnly.length <= 15;
|
|
324
150
|
}, "Phone number must be between 10 and 15 digits");
|
|
325
|
-
|
|
151
|
+
z.string().min(1, "URL is required").max(2048, "URL too long").refine((url) => {
|
|
326
152
|
try {
|
|
327
153
|
const parsed = new URL(url);
|
|
328
154
|
return ["http:", "https:"].includes(parsed.protocol);
|
|
@@ -374,7 +200,7 @@ var CSRFManager = class {
|
|
|
374
200
|
this.tokenCache.set(token, tokenData);
|
|
375
201
|
await this.persistTokens();
|
|
376
202
|
return token;
|
|
377
|
-
} catch (
|
|
203
|
+
} catch (_error) {
|
|
378
204
|
throw new Error("CSRF token generation failed");
|
|
379
205
|
}
|
|
380
206
|
}
|
|
@@ -405,7 +231,7 @@ var CSRFManager = class {
|
|
|
405
231
|
this.tokenCache.set(token, tokenData);
|
|
406
232
|
await this.persistTokens();
|
|
407
233
|
return true;
|
|
408
|
-
} catch (
|
|
234
|
+
} catch (_error) {
|
|
409
235
|
return false;
|
|
410
236
|
}
|
|
411
237
|
}
|
|
@@ -450,7 +276,7 @@ var CSRFManager = class {
|
|
|
450
276
|
JSON.stringify(tokensArray),
|
|
451
277
|
{ encrypt: true, expiry: this.TOKEN_EXPIRY }
|
|
452
278
|
);
|
|
453
|
-
} catch (
|
|
279
|
+
} catch (_error) {
|
|
454
280
|
}
|
|
455
281
|
}
|
|
456
282
|
/**
|
|
@@ -464,7 +290,7 @@ var CSRFManager = class {
|
|
|
464
290
|
this.tokenCache = new Map(tokensArray);
|
|
465
291
|
await this.cleanupExpiredTokens();
|
|
466
292
|
}
|
|
467
|
-
} catch (
|
|
293
|
+
} catch (_error) {
|
|
468
294
|
this.tokenCache.clear();
|
|
469
295
|
}
|
|
470
296
|
}
|
|
@@ -492,9 +318,6 @@ async function validateCSRFToken(token, sessionId) {
|
|
|
492
318
|
async function getCSRFToken(sessionId) {
|
|
493
319
|
return csrfManager.getCurrentToken(sessionId);
|
|
494
320
|
}
|
|
495
|
-
|
|
496
|
-
// src/utils/validation/sqlInjectionProtection.ts
|
|
497
|
-
import { z as z3 } from "zod";
|
|
498
321
|
var SQL_INJECTION_PATTERNS = [
|
|
499
322
|
/(\b(SELECT|INSERT|UPDATE|DELETE|DROP|CREATE|ALTER|EXEC|EXECUTE|UNION|SCRIPT|JAVASCRIPT)\b)/i,
|
|
500
323
|
/(\'|(\\\')|(\'\')|(\"|(\\\")|(\\")))|(\\x)|(\\u)/i,
|
|
@@ -516,13 +339,13 @@ var SQL_INJECTION_PATTERNS = [
|
|
|
516
339
|
/(%3B|;).+?(%44|%64|d)(%52|%72|r)(%4F|%6F|o)(%50|%70|p)/i
|
|
517
340
|
];
|
|
518
341
|
var DANGEROUS_CHARS = /[';\"\\%]/g;
|
|
519
|
-
var searchQuerySchema =
|
|
342
|
+
var searchQuerySchema = z.string().max(500, "Search query too long").refine(
|
|
520
343
|
(query) => {
|
|
521
344
|
return !SQL_INJECTION_PATTERNS.some((pattern) => pattern.test(query));
|
|
522
345
|
},
|
|
523
346
|
"Invalid characters detected in search query"
|
|
524
347
|
).transform((query) => sanitizeSearchQuery(query));
|
|
525
|
-
var sqlIdentifierSchema =
|
|
348
|
+
var sqlIdentifierSchema = z.string().min(1, "Identifier cannot be empty").max(63, "Identifier too long").regex(/^[a-zA-Z_][a-zA-Z0-9_]*$/, "Invalid identifier format").refine(
|
|
526
349
|
(identifier) => {
|
|
527
350
|
const reservedWords = [
|
|
528
351
|
"SELECT",
|
|
@@ -544,8 +367,8 @@ var sqlIdentifierSchema = z3.string().min(1, "Identifier cannot be empty").max(6
|
|
|
544
367
|
},
|
|
545
368
|
"Identifier cannot be a reserved SQL keyword"
|
|
546
369
|
);
|
|
547
|
-
var orderBySchema =
|
|
548
|
-
var limitOffsetSchema =
|
|
370
|
+
var orderBySchema = z.string().regex(/^[a-zA-Z_][a-zA-Z0-9_]*(\s+(ASC|DESC|asc|desc))?$/, "Invalid order by format");
|
|
371
|
+
var limitOffsetSchema = z.number().int("Must be an integer").min(0, "Must be non-negative").max(1e3, "Limit too large");
|
|
549
372
|
function sanitizeSearchQuery(query) {
|
|
550
373
|
return query.replace(DANGEROUS_CHARS, "").replace(/\s+/g, " ").trim().slice(0, 500);
|
|
551
374
|
}
|
|
@@ -641,28 +464,25 @@ function detectSQLInjection(input) {
|
|
|
641
464
|
riskLevel: maxRisk
|
|
642
465
|
};
|
|
643
466
|
}
|
|
644
|
-
|
|
645
|
-
// src/utils/validation/user.ts
|
|
646
|
-
import { z as z4 } from "zod";
|
|
647
|
-
var userProfileSchema2 = z4.object({
|
|
467
|
+
z.object({
|
|
648
468
|
name: nameSchema,
|
|
649
469
|
email: emailSchema,
|
|
650
|
-
phone:
|
|
651
|
-
website:
|
|
652
|
-
bio:
|
|
470
|
+
phone: z.string().optional(),
|
|
471
|
+
website: z.string().url().optional(),
|
|
472
|
+
bio: z.string().max(500).optional()
|
|
653
473
|
});
|
|
654
|
-
var userSettingsSchema =
|
|
655
|
-
notifications:
|
|
656
|
-
email:
|
|
657
|
-
push:
|
|
474
|
+
var userSettingsSchema = z.object({
|
|
475
|
+
notifications: z.object({
|
|
476
|
+
email: z.boolean(),
|
|
477
|
+
push: z.boolean()
|
|
658
478
|
}),
|
|
659
|
-
language:
|
|
479
|
+
language: z.string()
|
|
660
480
|
});
|
|
661
|
-
var userPreferencesSchema =
|
|
481
|
+
var userPreferencesSchema = z.object({
|
|
662
482
|
displayName: nameSchema,
|
|
663
|
-
timezone:
|
|
664
|
-
dateFormat:
|
|
665
|
-
currency:
|
|
483
|
+
timezone: z.string(),
|
|
484
|
+
dateFormat: z.string(),
|
|
485
|
+
currency: z.string()
|
|
666
486
|
});
|
|
667
487
|
|
|
668
488
|
// src/utils/security/security.ts
|
|
@@ -754,10 +574,6 @@ function createPerformanceBenchmark(name) {
|
|
|
754
574
|
bundleSize: 0
|
|
755
575
|
// Would be measured at build time
|
|
756
576
|
};
|
|
757
|
-
const _unused = {
|
|
758
|
-
benchmark: `Performance Benchmark [${name}]`,
|
|
759
|
-
metrics
|
|
760
|
-
};
|
|
761
577
|
return metrics;
|
|
762
578
|
}
|
|
763
579
|
};
|
|
@@ -774,10 +590,6 @@ function measureRenderPerformance(componentName, renderFn) {
|
|
|
774
590
|
memoryUsage: endMemory - startMemory,
|
|
775
591
|
bundleSize: 0
|
|
776
592
|
};
|
|
777
|
-
const _unused = {
|
|
778
|
-
benchmark: `Render Performance [${componentName}]`,
|
|
779
|
-
metrics
|
|
780
|
-
};
|
|
781
593
|
return metrics;
|
|
782
594
|
}
|
|
783
595
|
|
|
@@ -881,25 +693,25 @@ function trackDynamicImport(moduleName) {
|
|
|
881
693
|
|
|
882
694
|
// src/utils/dynamic/dynamicUtils.ts
|
|
883
695
|
var loadLodash = async () => {
|
|
884
|
-
const debounceModule = await import(
|
|
885
|
-
const throttleModule = await import(
|
|
696
|
+
const debounceModule = await import('lodash.debounce');
|
|
697
|
+
const throttleModule = await import('lodash.throttle');
|
|
886
698
|
return {
|
|
887
699
|
debounce: debounceModule.default || debounceModule,
|
|
888
700
|
throttle: throttleModule.default || throttleModule
|
|
889
701
|
};
|
|
890
702
|
};
|
|
891
703
|
var loadDateUtils = async () => {
|
|
892
|
-
const dateFns = await import(
|
|
704
|
+
const dateFns = await import('date-fns');
|
|
893
705
|
return dateFns;
|
|
894
706
|
};
|
|
895
707
|
var loadChartUtils = async () => {
|
|
896
|
-
const recharts = await import(
|
|
708
|
+
const recharts = await import('recharts');
|
|
897
709
|
return recharts;
|
|
898
710
|
};
|
|
899
711
|
var loadFormUtils = async () => {
|
|
900
712
|
const [reactHookForm, zodResolvers] = await Promise.all([
|
|
901
|
-
import(
|
|
902
|
-
import(
|
|
713
|
+
import('react-hook-form'),
|
|
714
|
+
import('@hookform/resolvers/zod')
|
|
903
715
|
]);
|
|
904
716
|
return {
|
|
905
717
|
...reactHookForm,
|
|
@@ -907,7 +719,7 @@ var loadFormUtils = async () => {
|
|
|
907
719
|
};
|
|
908
720
|
};
|
|
909
721
|
var loadCSVUtils = async () => {
|
|
910
|
-
const papaparse = await import(
|
|
722
|
+
const papaparse = await import('papaparse');
|
|
911
723
|
return papaparse.default;
|
|
912
724
|
};
|
|
913
725
|
function createLazyUtility(loader) {
|
|
@@ -933,10 +745,6 @@ var lazyDateUtils = createLazyUtility(loadDateUtils);
|
|
|
933
745
|
var lazyChartUtils = createLazyUtility(loadChartUtils);
|
|
934
746
|
var lazyFormUtils = createLazyUtility(loadFormUtils);
|
|
935
747
|
var lazyCSVUtils = createLazyUtility(loadCSVUtils);
|
|
936
|
-
|
|
937
|
-
// src/utils/dynamic/lazyLoad.tsx
|
|
938
|
-
import { Suspense, lazy } from "react";
|
|
939
|
-
import { jsx } from "react/jsx-runtime";
|
|
940
748
|
function createLazyComponent(importFn, componentName, options = {}) {
|
|
941
749
|
const LazyComponent = lazy(importFn);
|
|
942
750
|
const WrappedComponent = (props) => {
|
|
@@ -951,7 +759,7 @@ function createLazyComponent(importFn, componentName, options = {}) {
|
|
|
951
759
|
return WrappedComponent;
|
|
952
760
|
}
|
|
953
761
|
var LazyDataTable = createLazyComponent(
|
|
954
|
-
() => import(
|
|
762
|
+
() => import('./DataTable-7PMH7XN7.js').then((module) => ({ default: module.DataTable })),
|
|
955
763
|
"DataTable"
|
|
956
764
|
);
|
|
957
765
|
|
|
@@ -1263,151 +1071,5 @@ function getGoogleMapsUrl(coords) {
|
|
|
1263
1071
|
}
|
|
1264
1072
|
return `https://www.google.com/maps/search/?api=1&query=${coords.lat},${coords.lng}`;
|
|
1265
1073
|
}
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
DebugLogger,
|
|
1269
|
-
LazyDataTable,
|
|
1270
|
-
LogLevel,
|
|
1271
|
-
Logger,
|
|
1272
|
-
PERFORMANCE_BUDGETS,
|
|
1273
|
-
PERFORMANCE_THRESHOLDS,
|
|
1274
|
-
PermissionType,
|
|
1275
|
-
areCoordinatesEqual,
|
|
1276
|
-
auditLogger,
|
|
1277
|
-
buildSafeQueryParams,
|
|
1278
|
-
bundleAnalyzer,
|
|
1279
|
-
cachedAppIdResolver,
|
|
1280
|
-
calculatePasswordStrength,
|
|
1281
|
-
changePasswordSchema,
|
|
1282
|
-
clearInFlightRequests,
|
|
1283
|
-
clearOrganisationContext,
|
|
1284
|
-
cn,
|
|
1285
|
-
combineSchemas,
|
|
1286
|
-
contactFormSchema,
|
|
1287
|
-
createAddressFromPlaceResult,
|
|
1288
|
-
createLazyComponent,
|
|
1289
|
-
createLazyUtility,
|
|
1290
|
-
createLogger,
|
|
1291
|
-
createPerformanceBenchmark,
|
|
1292
|
-
csrfManager,
|
|
1293
|
-
dateSchema,
|
|
1294
|
-
deduplicatedQuery,
|
|
1295
|
-
deepMerge,
|
|
1296
|
-
detectSQLInjection,
|
|
1297
|
-
emailSchema,
|
|
1298
|
-
escapeLikeQuery,
|
|
1299
|
-
fetchPlaceAutocomplete,
|
|
1300
|
-
fetchPlaceDetails,
|
|
1301
|
-
formatCompactNumber,
|
|
1302
|
-
formatCoordinates,
|
|
1303
|
-
formatCurrency,
|
|
1304
|
-
formatDate,
|
|
1305
|
-
formatDateOnlyForDisplay,
|
|
1306
|
-
formatDateTime,
|
|
1307
|
-
formatDateTimeForDisplay,
|
|
1308
|
-
formatDateTimeForMap,
|
|
1309
|
-
formatDateTimeForTable,
|
|
1310
|
-
formatFileSize,
|
|
1311
|
-
formatInTimeZone,
|
|
1312
|
-
formatNumber,
|
|
1313
|
-
formatPercent,
|
|
1314
|
-
formatTime,
|
|
1315
|
-
formatTimeInTimeZone,
|
|
1316
|
-
fromZonedTime,
|
|
1317
|
-
generateCSRFToken,
|
|
1318
|
-
generateDeviceFingerprint,
|
|
1319
|
-
generateRequestKey,
|
|
1320
|
-
getAddressByPlaceId,
|
|
1321
|
-
getAppConfig,
|
|
1322
|
-
getAppId,
|
|
1323
|
-
getAppIds,
|
|
1324
|
-
getAppNameFromBuildTime,
|
|
1325
|
-
getAppNameFromEnvironment,
|
|
1326
|
-
getAppNameFromGlobal,
|
|
1327
|
-
getAppNameFromPackageJson,
|
|
1328
|
-
getCSRFToken,
|
|
1329
|
-
getCurrentAppId,
|
|
1330
|
-
getCurrentAppName,
|
|
1331
|
-
getCurrentAppNameWithFallback,
|
|
1332
|
-
getGoogleMapsUrl,
|
|
1333
|
-
getInFlightRequestStats,
|
|
1334
|
-
getOrCreateRequest,
|
|
1335
|
-
getOrganisationContext,
|
|
1336
|
-
getSecurityHeaders,
|
|
1337
|
-
getTimeZoneDifference,
|
|
1338
|
-
getTimezoneAbbreviation,
|
|
1339
|
-
getUserTimeZone,
|
|
1340
|
-
hasAllPermissions,
|
|
1341
|
-
hasAnyPermission,
|
|
1342
|
-
hasPermission,
|
|
1343
|
-
hasValidCoordinates,
|
|
1344
|
-
isEmpty,
|
|
1345
|
-
isObject,
|
|
1346
|
-
isOrganisationContextAvailable,
|
|
1347
|
-
isStrongPassword,
|
|
1348
|
-
isValidDate,
|
|
1349
|
-
isValidEmail,
|
|
1350
|
-
isValidUrl,
|
|
1351
|
-
isWithinRange,
|
|
1352
|
-
lazyCSVUtils,
|
|
1353
|
-
lazyChartUtils,
|
|
1354
|
-
lazyDateUtils,
|
|
1355
|
-
lazyFormUtils,
|
|
1356
|
-
lazyLodash,
|
|
1357
|
-
limitOffsetSchema,
|
|
1358
|
-
loadCSVUtils,
|
|
1359
|
-
loadChartUtils,
|
|
1360
|
-
loadDateUtils,
|
|
1361
|
-
loadFormUtils,
|
|
1362
|
-
loadLodash,
|
|
1363
|
-
logAuditEvent,
|
|
1364
|
-
logAuthEvent,
|
|
1365
|
-
logPermissionEvent,
|
|
1366
|
-
logSecurityEvent2 as logSecurityEvent,
|
|
1367
|
-
logger,
|
|
1368
|
-
loginSchema,
|
|
1369
|
-
matchesPattern,
|
|
1370
|
-
measureRenderPerformance,
|
|
1371
|
-
nameSchema,
|
|
1372
|
-
orderBySchema,
|
|
1373
|
-
parseAddressComponents,
|
|
1374
|
-
parsePermission,
|
|
1375
|
-
passwordResetSchema,
|
|
1376
|
-
passwordSchema,
|
|
1377
|
-
performanceBudgetMonitor,
|
|
1378
|
-
phoneSchema,
|
|
1379
|
-
pickSchema,
|
|
1380
|
-
registrationSchema,
|
|
1381
|
-
renderSafeHtml,
|
|
1382
|
-
roundToNearestMinutes,
|
|
1383
|
-
sanitizeFilters,
|
|
1384
|
-
sanitizeFormData,
|
|
1385
|
-
sanitizeHtml,
|
|
1386
|
-
sanitizeSearchQuery,
|
|
1387
|
-
sanitizeUserInput,
|
|
1388
|
-
searchQuerySchema,
|
|
1389
|
-
secureLoginSchema,
|
|
1390
|
-
securePasswordSchema,
|
|
1391
|
-
securityMonitor,
|
|
1392
|
-
setAppConfig,
|
|
1393
|
-
setOrganisationContext,
|
|
1394
|
-
setRBACAppName,
|
|
1395
|
-
sqlIdentifierSchema,
|
|
1396
|
-
toZonedTime,
|
|
1397
|
-
trackDynamicImport,
|
|
1398
|
-
transformPermissionMapToBoolean,
|
|
1399
|
-
urlSchema,
|
|
1400
|
-
useComponentPerformance,
|
|
1401
|
-
useSessionTracking,
|
|
1402
|
-
userPreferencesSchema,
|
|
1403
|
-
userProfileSchema,
|
|
1404
|
-
userSettingsSchema,
|
|
1405
|
-
usernameSchema,
|
|
1406
|
-
validateCSRFToken,
|
|
1407
|
-
validateDeviceFingerprint,
|
|
1408
|
-
validateHtml,
|
|
1409
|
-
validateImportPattern,
|
|
1410
|
-
validateSecurityHeaders,
|
|
1411
|
-
validateUserInput
|
|
1412
|
-
};
|
|
1413
|
-
//# sourceMappingURL=utils.js.map
|
|
1074
|
+
|
|
1075
|
+
export { DebugLogger, LazyDataTable, PERFORMANCE_THRESHOLDS, PermissionType, areCoordinatesEqual, auditLogger, buildSafeQueryParams, bundleAnalyzer, createLazyComponent, createLazyUtility, createPerformanceBenchmark, csrfManager, deepMerge, detectSQLInjection, escapeLikeQuery, formatCoordinates, generateCSRFToken, generateDeviceFingerprint, getCSRFToken, getGoogleMapsUrl, getSecurityHeaders, hasAllPermissions, hasAnyPermission, hasPermission, hasValidCoordinates, isEmpty, isObject, isStrongPassword, isValidDate, isValidEmail, isValidUrl, isWithinRange, lazyCSVUtils, lazyChartUtils, lazyDateUtils, lazyFormUtils, lazyLodash, limitOffsetSchema, loadCSVUtils, loadChartUtils, loadDateUtils, loadFormUtils, loadLodash, logAuditEvent, logAuthEvent, logPermissionEvent, logSecurityEvent2 as logSecurityEvent, matchesPattern, measureRenderPerformance, orderBySchema, parsePermission, sanitizeFilters, sanitizeSearchQuery, searchQuerySchema, securityMonitor, sqlIdentifierSchema, trackDynamicImport, transformPermissionMapToBoolean, userPreferencesSchema, userSettingsSchema, usernameSchema, validateCSRFToken, validateDeviceFingerprint, validateImportPattern, validateSecurityHeaders, validateUserInput };
|
package/docs/README.md
CHANGED
|
@@ -18,17 +18,27 @@ Use this page as the launchpad for the rest of the documentation set.
|
|
|
18
18
|
npm install @jmruthers/pace-core \
|
|
19
19
|
react react-dom \
|
|
20
20
|
@tanstack/react-table \
|
|
21
|
-
@radix-ui/react-
|
|
22
|
-
@radix-ui/react-label @radix-ui/react-slot \
|
|
21
|
+
@radix-ui/react-checkbox @radix-ui/react-label @radix-ui/react-slot \
|
|
23
22
|
@radix-ui/react-switch @radix-ui/react-tabs @radix-ui/react-toast @radix-ui/react-tooltip \
|
|
24
|
-
clsx lucide-react react-day-picker react-hook-form react-router-dom tailwind-merge zod
|
|
23
|
+
clsx lucide-react react-day-picker react-hook-form react-router-dom tailwind-merge tailwindcss zod
|
|
25
24
|
|
|
26
|
-
npm install -D
|
|
25
|
+
npm install -D @tailwindcss/vite tailwindcss@^4.0.0
|
|
27
26
|
```
|
|
28
27
|
|
|
29
|
-
|
|
28
|
+
> **📦 Dependencies Guide**: See [Dependencies Guide](./getting-started/dependencies.md) for complete details on which packages to install and which are already included.
|
|
29
|
+
>
|
|
30
|
+
> **🔍 Auditing your dependencies?** Start with [AUDIT-YOUR-DEPENDENCIES.md](./getting-started/AUDIT-YOUR-DEPENDENCIES.md) for a quick overview.
|
|
30
31
|
|
|
31
|
-
|
|
32
|
+
**Important**:
|
|
33
|
+
- ❌ **DO NOT install** `@supabase/supabase-js`, `@radix-ui/*`, or `lucide-react` - they're included in pace-core. Use pace-core exports instead:
|
|
34
|
+
- `createBaseClient()` from `@jmruthers/pace-core` (instead of `createClient` from `@supabase/supabase-js`)
|
|
35
|
+
- pace-core components (instead of `@radix-ui/*` primitives)
|
|
36
|
+
- `@jmruthers/pace-core/icons` (instead of `lucide-react`)
|
|
37
|
+
- ⚠️ `@tanstack/react-query` is a **peer dependency** - you MUST install it (required for QueryClient configuration)
|
|
38
|
+
- ⚠️ All listed packages above are **required peer dependencies** - you must install them
|
|
39
|
+
- ❌ Installing included dependencies will create duplicates and cause conflicts
|
|
40
|
+
|
|
41
|
+
The peer dependencies list is derived from [`package.json`](../package.json). See [Dependencies Guide](./getting-started/dependencies.md) for the complete breakdown.
|
|
32
42
|
|
|
33
43
|
### 2. Enable Tailwind v4 in Vite
|
|
34
44
|
|
|
@@ -138,7 +148,7 @@ The table props and supporting types live beside the implementation in [`src/com
|
|
|
138
148
|
2. **Wire authentication** – configure Supabase keys, inactivity handling, and RBAC using the [Authentication concept](./core-concepts/authentication.md) and [RBAC quick start](./rbac/quick-start.md).
|
|
139
149
|
3. **Adopt layout and navigation** – reference the [App layout guide](./implementation-guides/app-layout.md) and [Navigation patterns](./implementation-guides/navigation.md).
|
|
140
150
|
4. **Integrate domain features** – use [Organisation security](./implementation-guides/organisation-security.md), [Inactivity tracking](./implementation-guides/inactivity-tracking.md), and [Data tables](./implementation-guides/data-tables.md) as needed.
|
|
141
|
-
5. **Validate & ship** – confirm best practices with [Testing](./testing/README.md), [
|
|
151
|
+
5. **Validate & ship** – confirm best practices with [Testing](./testing/README.md), [Operations Standards](./standards/9-operations-standards.md#cicd-integration) (deployment), and [Security Standards](./standards/6-security-rbac-standards.md).
|
|
142
152
|
|
|
143
153
|
---
|
|
144
154
|
|