@jmruthers/pace-core 0.6.4 → 0.6.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +104 -0
- package/README.md +5 -403
- package/core-usage-manifest.json +93 -0
- package/cursor-rules/00-pace-core-compliance.mdc +128 -26
- package/cursor-rules/01-standards-compliance.mdc +49 -8
- package/cursor-rules/02-project-structure.mdc +6 -0
- package/cursor-rules/03-solid-principles.mdc +2 -0
- package/cursor-rules/04-testing-standards.mdc +2 -0
- package/cursor-rules/05-bug-reports-and-features.mdc +2 -0
- package/cursor-rules/06-code-quality.mdc +2 -0
- package/cursor-rules/07-tech-stack-compliance.mdc +2 -0
- package/cursor-rules/08-markup-quality.mdc +52 -27
- package/cursor-rules/09-rbac-compliance.mdc +462 -0
- package/cursor-rules/10-error-handling-patterns.mdc +179 -0
- package/cursor-rules/11-performance-optimization.mdc +169 -0
- package/cursor-rules/12-ci-cd-integration.mdc +150 -0
- package/dist/{AuthService-Cb34EQs3.d.ts → AuthService-DmfO5rGS.d.ts} +10 -0
- package/dist/{DataTable-BMRU8a1j.d.ts → DataTable-2N_tqbfq.d.ts} +1 -1
- package/dist/DataTable-LRJL4IRV.js +15 -0
- package/dist/{PublicPageProvider-DEMpysFR.d.ts → PublicPageProvider-BBH6Vqg7.d.ts} +72 -139
- package/dist/UnifiedAuthProvider-ZT6TIGM7.js +7 -0
- package/dist/api-Y4MQWOFW.js +4 -0
- package/dist/audit-MYQXYZFU.js +3 -0
- package/dist/{chunk-J36DSWQK.js → chunk-2HGJFNAH.js} +8 -28
- package/dist/{chunk-OEWDTMG7.js → chunk-3O3WHILE.js} +38 -121
- package/dist/{chunk-M43Y4SSO.js → chunk-3QC3KRHK.js} +1 -14
- package/dist/{chunk-DGUM43GV.js → chunk-3RG5ZIWI.js} +1 -4
- package/dist/{chunk-QXHPKYJV.js → chunk-4SXLQIZO.js} +1 -26
- package/dist/chunk-4T7OBVTU.js +62 -0
- package/dist/{chunk-E66EQZE6.js → chunk-6GLLNA6U.js} +3 -9
- package/dist/{chunk-ZSAAAMVR.js → chunk-6QYDGKQY.js} +1 -4
- package/dist/{chunk-NN6WWZ5U.js → chunk-7TYHROIV.js} +579 -563
- package/dist/{chunk-M7MPQISP.js → chunk-A55DK444.js} +9 -16
- package/dist/{chunk-63FOKYGO.js → chunk-AHU7G2R5.js} +2 -11
- package/dist/{chunk-L4OXEN46.js → chunk-BVP2BCJF.js} +2 -16
- package/dist/chunk-C7NSAPTL.js +1 -0
- package/dist/{chunk-YKRAFF5K.js → chunk-FENMYN2U.js} +73 -149
- package/dist/{chunk-AVMLPIM7.js → chunk-FTCRZOG2.js} +284 -432
- package/dist/{chunk-G37KK66H.js → chunk-FYHN4DD5.js} +60 -19
- package/dist/{chunk-VBXEHIUJ.js → chunk-HF6O3O37.js} +6 -88
- package/dist/{chunk-I6DAQMWX.js → chunk-LAZMKTTF.js} +930 -891
- package/dist/{chunk-5EC5MEWX.js → chunk-MAGBIDNS.js} +77 -222
- package/dist/chunk-MBADTM7L.js +64 -0
- package/dist/chunk-OHIK3MIO.js +994 -0
- package/dist/{chunk-6SOIHG6Z.js → chunk-S7DKJPLT.js} +115 -44
- package/dist/{chunk-FMUCXFII.js → chunk-SD6WQY43.js} +1 -5
- package/dist/{chunk-PWLANIRT.js → chunk-TTRFSOKR.js} +1 -7
- package/dist/{chunk-5DRSZLL2.js → chunk-UH3NTO3F.js} +1 -6
- package/dist/{chunk-FFQEQTNW.js → chunk-UIYSCEV7.js} +134 -45
- package/dist/{chunk-3LPHPB62.js → chunk-ZFYPMX46.js} +271 -87
- package/dist/{chunk-7JPAB3T5.js → chunk-ZS5VO5JB.js} +1989 -1283
- package/dist/components.d.ts +6 -6
- package/dist/components.js +57 -267
- package/dist/{database.generated-CzIvgcPu.d.ts → database.generated-CcnC_DRc.d.ts} +4795 -3691
- package/dist/eslint-rules/index.cjs +22 -0
- package/dist/eslint-rules/rules/compliance.cjs +348 -0
- package/dist/eslint-rules/rules/components.cjs +113 -0
- package/dist/eslint-rules/rules/imports.cjs +102 -0
- package/dist/eslint-rules/rules/rbac.cjs +790 -0
- package/dist/eslint-rules/utils/helpers.cjs +42 -0
- package/dist/eslint-rules/utils/manifest-loader.cjs +75 -0
- package/dist/hooks.d.ts +5 -5
- package/dist/hooks.js +62 -270
- package/dist/icons/index.d.ts +1 -0
- package/dist/icons/index.js +1 -0
- package/dist/index.d.ts +36 -26
- package/dist/index.js +87 -690
- package/dist/providers.d.ts +2 -2
- package/dist/providers.js +8 -35
- package/dist/rbac/eslint-rules.d.ts +46 -44
- package/dist/rbac/eslint-rules.js +7 -4
- package/dist/rbac/index.d.ts +124 -594
- package/dist/rbac/index.js +14 -207
- package/dist/styles/index.js +2 -12
- package/dist/theming/runtime.js +3 -19
- package/dist/{timezone-CHhWg6b4.d.ts → timezone-BZe_eUxx.d.ts} +175 -1
- package/dist/{types-CkbwOr4Y.d.ts → types-B-K_5VnO.d.ts} +4 -0
- package/dist/types-t9H8qKRw.d.ts +55 -0
- package/dist/types.d.ts +1 -1
- package/dist/types.js +7 -94
- package/dist/{usePublicRouteParams-i3qtoBgg.d.ts → usePublicRouteParams-COZ28Mvq.d.ts} +9 -9
- package/dist/utils.d.ts +24 -117
- package/dist/utils.js +54 -392
- package/docs/README.md +16 -6
- package/docs/api/README.md +4 -402
- package/docs/api/modules.md +454 -930
- package/docs/api-reference/components.md +3 -1
- package/docs/api-reference/deprecated.md +31 -6
- package/docs/api-reference/rpc-functions.md +78 -3
- package/docs/best-practices/accessibility.md +6 -3
- package/docs/getting-started/cursor-rules.md +3 -23
- package/docs/getting-started/dependencies.md +650 -0
- package/docs/getting-started/installation-guide.md +20 -7
- package/docs/getting-started/quick-start.md +23 -12
- package/docs/implementation-guides/permission-enforcement.md +4 -0
- package/docs/rbac/MIGRATION_GUIDE.md +819 -0
- package/docs/rbac/RBAC_CONTRACT.md +724 -0
- package/docs/rbac/README.md +12 -3
- package/docs/rbac/edge-functions-guide.md +376 -0
- package/docs/rbac/secure-client-protection.md +0 -34
- package/docs/standards/00-pace-core-compliance.md +967 -0
- package/docs/standards/01-standards-compliance.md +188 -0
- package/docs/standards/02-project-structure.md +985 -0
- package/docs/standards/03-solid-principles.md +39 -0
- package/docs/standards/04-testing-standards.md +36 -0
- package/docs/standards/05-bug-reports-and-features.md +27 -0
- package/docs/standards/{04-code-style-standard.md → 06-code-quality.md} +2 -0
- package/docs/standards/07-tech-stack-compliance.md +30 -0
- package/docs/standards/08-markup-quality.md +345 -0
- package/docs/standards/{07-rbac-and-rls-standard.md → 09-rbac-compliance.md} +149 -54
- package/docs/standards/10-error-handling-patterns.md +401 -0
- package/docs/standards/11-performance-optimization.md +348 -0
- package/docs/standards/12-ci-cd-integration.md +370 -0
- package/docs/standards/ALIGNMENT_REVIEW_SUMMARY.md +192 -0
- package/docs/standards/README.md +62 -33
- package/docs/troubleshooting/organisation-context-setup.md +42 -19
- package/eslint-config-pace-core.cjs +20 -4
- package/package.json +31 -21
- package/scripts/audit/audit-compliance.cjs +1295 -0
- package/scripts/audit/audit-components.cjs +260 -0
- package/scripts/audit/audit-dependencies.cjs +395 -0
- package/scripts/audit/audit-rbac.cjs +954 -0
- package/scripts/audit/audit-standards.cjs +1268 -0
- package/scripts/audit/index.cjs +1898 -194
- package/scripts/install-cursor-rules.cjs +259 -8
- package/scripts/validate-master.js +1 -1
- package/src/__tests__/fixtures/supabase.ts +1 -1
- package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +1 -1
- package/src/__tests__/helpers/__tests__/optimized-test-setup.test.ts +1 -1
- package/src/__tests__/helpers/__tests__/supabaseMock.test.ts +1 -1
- package/src/__tests__/helpers/__tests__/test-utils.test.tsx +3 -3
- package/src/__tests__/helpers/component-test-utils.tsx +1 -1
- package/src/__tests__/helpers/supabaseMock.ts +2 -2
- package/src/__tests__/public-recipe-view.test.ts +38 -9
- package/src/components/Button/Button.tsx +5 -1
- package/src/components/ContextSelector/ContextSelector.tsx +42 -39
- package/src/components/DataTable/__tests__/keyboard.test.tsx +15 -2
- package/src/components/DataTable/components/DataTableBody.tsx +55 -31
- package/src/components/DataTable/components/DataTableCore.tsx +186 -13
- package/src/components/DataTable/components/DataTableLayout.tsx +30 -5
- package/src/components/DataTable/components/EditFields.tsx +23 -3
- package/src/components/DataTable/components/EditableRow.tsx +7 -2
- package/src/components/DataTable/components/ImportModal.tsx +4 -6
- package/src/components/DataTable/components/RowComponent.tsx +12 -0
- package/src/components/DataTable/components/ViewRowModal.tsx +4 -4
- package/src/components/DataTable/components/__tests__/ImportModal.test.tsx +455 -96
- package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +122 -58
- package/src/components/DataTable/components/hooks/usePermissionTracking.ts +0 -4
- package/src/components/DataTable/core/DataTableContext.tsx +1 -1
- package/src/components/DataTable/hooks/__tests__/useDataTableState.test.ts +51 -47
- package/src/components/DataTable/hooks/useDataTablePermissions.ts +24 -21
- package/src/components/DataTable/hooks/useDataTableState.ts +125 -9
- package/src/components/DataTable/hooks/useTableColumns.ts +40 -2
- package/src/components/DataTable/hooks/useTableHandlers.ts +11 -0
- package/src/components/DataTable/types.ts +5 -0
- package/src/components/DateTimeField/DateTimeField.tsx +20 -20
- package/src/components/DateTimeField/README.md +5 -2
- package/src/components/Dialog/Dialog.test.tsx +361 -318
- package/src/components/Dialog/Dialog.tsx +1154 -323
- package/src/components/Dialog/index.ts +3 -3
- package/src/components/FileDisplay/FileDisplay.test.tsx +45 -2
- package/src/components/FileDisplay/FileDisplay.tsx +28 -22
- package/src/components/Form/Form.test.tsx +9 -10
- package/src/components/Form/Form.tsx +369 -9
- package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +28 -28
- package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +40 -54
- package/src/components/LoginForm/LoginForm.tsx +2 -2
- package/src/components/NavigationMenu/NavigationMenu.test.tsx +14 -13
- package/src/components/NavigationMenu/NavigationMenu.tsx +2 -2
- package/src/components/NavigationMenu/useNavigationFiltering.ts +11 -21
- package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +6 -4
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +30 -41
- package/src/components/PaceAppLayout/README.md +10 -9
- package/src/components/PaceAppLayout/test-setup.tsx +40 -31
- package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +108 -61
- package/src/components/PaceLoginPage/PaceLoginPage.tsx +27 -3
- package/src/components/PasswordChange/PasswordChangeForm.test.tsx +61 -0
- package/src/components/PasswordChange/PasswordChangeForm.tsx +20 -13
- package/src/components/PublicLayout/PublicLayout.test.tsx +7 -3
- package/src/components/PublicLayout/PublicPageLayout.tsx +5 -8
- package/src/components/Select/Select.tsx +23 -21
- package/src/components/Select/types.ts +1 -1
- package/src/components/UserMenu/UserMenu.test.tsx +38 -6
- package/src/components/UserMenu/UserMenu.tsx +39 -34
- package/src/components/index.ts +3 -4
- package/src/eslint-rules/index.cjs +22 -0
- package/src/eslint-rules/rules/compliance.cjs +348 -0
- package/src/eslint-rules/rules/components.cjs +113 -0
- package/src/eslint-rules/rules/imports.cjs +102 -0
- package/src/eslint-rules/rules/rbac.cjs +790 -0
- package/src/eslint-rules/utils/helpers.cjs +42 -0
- package/src/eslint-rules/utils/manifest-loader.cjs +75 -0
- package/src/hooks/__tests__/hooks.integration.test.tsx +6 -8
- package/src/hooks/__tests__/useAppConfig.unit.test.ts +129 -67
- package/src/hooks/__tests__/usePublicEvent.simple.test.ts +149 -67
- package/src/hooks/__tests__/usePublicEvent.test.ts +149 -79
- package/src/hooks/__tests__/usePublicEvent.unit.test.ts +158 -109
- package/src/hooks/__tests__/useSessionDraft.test.ts +163 -0
- package/src/hooks/__tests__/useSessionRestoration.unit.test.tsx +10 -5
- package/src/hooks/public/usePublicEvent.ts +62 -190
- package/src/hooks/public/usePublicEventLogo.test.ts +70 -17
- package/src/hooks/public/usePublicEventLogo.ts +19 -9
- package/src/hooks/useAppConfig.ts +26 -24
- package/src/hooks/useEventTheme.test.ts +211 -233
- package/src/hooks/useEventTheme.ts +19 -28
- package/src/hooks/useEvents.ts +11 -7
- package/src/hooks/useKeyboardShortcuts.ts +1 -1
- package/src/hooks/useOrganisationPermissions.ts +9 -11
- package/src/hooks/useOrganisations.ts +13 -7
- package/src/hooks/useQueryCache.ts +0 -1
- package/src/hooks/useSessionDraft.ts +380 -0
- package/src/hooks/useSessionRestoration.ts +3 -1
- package/src/icons/index.ts +27 -0
- package/src/index.ts +16 -1
- package/src/providers/OrganisationProvider.tsx +23 -14
- package/src/providers/services/EventServiceProvider.tsx +1 -24
- package/src/providers/services/UnifiedAuthProvider.tsx +5 -48
- package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +3 -0
- package/src/rbac/README.md +20 -20
- package/src/rbac/__tests__/adapters.comprehensive.test.tsx +7 -457
- package/src/rbac/__tests__/auth-rbac.e2e.test.tsx +33 -7
- package/src/rbac/adapters.tsx +7 -295
- package/src/rbac/api.test.ts +44 -56
- package/src/rbac/api.ts +10 -17
- package/src/rbac/cache-invalidation.ts +0 -1
- package/src/rbac/compliance/index.ts +10 -0
- package/src/rbac/compliance/pattern-detector.ts +553 -0
- package/src/rbac/compliance/runtime-compliance.ts +22 -0
- package/src/rbac/components/AccessDenied.tsx +150 -0
- package/src/rbac/components/NavigationGuard.tsx +12 -20
- package/src/rbac/components/PagePermissionGuard.tsx +4 -24
- package/src/rbac/components/__tests__/NavigationGuard.test.tsx +21 -8
- package/src/rbac/components/index.ts +3 -41
- package/src/rbac/eslint-rules.js +1 -1
- package/src/rbac/hooks/index.ts +0 -3
- package/src/rbac/hooks/permissions/index.ts +0 -3
- package/src/rbac/hooks/permissions/useAccessLevel.ts +4 -8
- package/src/rbac/hooks/usePermissions.ts +0 -3
- package/src/rbac/hooks/useRBAC.test.ts +21 -3
- package/src/rbac/hooks/useRBAC.ts +4 -3
- package/src/rbac/hooks/useResolvedScope.test.ts +57 -47
- package/src/rbac/hooks/useResolvedScope.ts +58 -140
- package/src/rbac/hooks/useResourcePermissions.test.ts +241 -60
- package/src/rbac/hooks/useResourcePermissions.ts +182 -63
- package/src/rbac/hooks/useRoleManagement.test.ts +65 -22
- package/src/rbac/hooks/useRoleManagement.ts +147 -19
- package/src/rbac/hooks/useSecureSupabase.ts +4 -8
- package/src/rbac/index.ts +7 -9
- package/src/rbac/permissions.ts +17 -17
- package/src/rbac/utils/contextValidator.ts +45 -7
- package/src/services/AuthService.ts +132 -23
- package/src/services/EventService.ts +4 -97
- package/src/services/InactivityService.ts +155 -58
- package/src/services/OrganisationService.ts +7 -44
- package/src/services/__tests__/OrganisationService.test.ts +26 -8
- package/src/services/base/BaseService.ts +0 -3
- package/src/styles/core.css +4 -0
- package/src/types/database.generated.ts +4733 -3809
- package/src/utils/__tests__/organisationContext.unit.test.ts +9 -10
- package/src/utils/context/organisationContext.test.ts +13 -28
- package/src/utils/context/organisationContext.ts +21 -52
- package/src/utils/dynamic/dynamicUtils.ts +1 -1
- package/src/utils/file-reference/index.ts +39 -15
- package/src/utils/formatting/formatDateTime.test.ts +3 -2
- package/src/utils/formatting/formatTime.test.ts +3 -2
- package/src/utils/google-places/loadGoogleMapsScript.ts +29 -4
- package/src/utils/index.ts +4 -1
- package/src/utils/persistence/__tests__/keyDerivation.test.ts +135 -0
- package/src/utils/persistence/__tests__/sensitiveFieldDetection.test.ts +123 -0
- package/src/utils/persistence/keyDerivation.ts +304 -0
- package/src/utils/persistence/sensitiveFieldDetection.ts +212 -0
- package/src/utils/security/secureStorage.ts +5 -5
- package/src/utils/storage/helpers.ts +3 -3
- package/src/utils/supabase/createBaseClient.ts +147 -0
- package/src/utils/timezone/timezone.test.ts +1 -2
- package/src/utils/timezone/timezone.ts +1 -1
- package/src/utils/validation/csrf.ts +4 -4
- package/cursor-rules/CHANGELOG.md +0 -119
- package/cursor-rules/README.md +0 -192
- package/dist/DataTable-E7YQZD7D.js +0 -175
- package/dist/DataTable-E7YQZD7D.js.map +0 -1
- package/dist/UnifiedAuthProvider-QPXO24B4.js +0 -18
- package/dist/UnifiedAuthProvider-QPXO24B4.js.map +0 -1
- package/dist/api-6LVZTHDS.js +0 -52
- package/dist/api-6LVZTHDS.js.map +0 -1
- package/dist/audit-V53FV5AG.js +0 -17
- package/dist/audit-V53FV5AG.js.map +0 -1
- package/dist/chunk-36LVWXB2.js +0 -227
- package/dist/chunk-36LVWXB2.js.map +0 -1
- package/dist/chunk-3LPHPB62.js.map +0 -1
- package/dist/chunk-5DRSZLL2.js.map +0 -1
- package/dist/chunk-5EC5MEWX.js.map +0 -1
- package/dist/chunk-63FOKYGO.js.map +0 -1
- package/dist/chunk-6SOIHG6Z.js.map +0 -1
- package/dist/chunk-7JPAB3T5.js.map +0 -1
- package/dist/chunk-ATKZM7RX.js +0 -2053
- package/dist/chunk-ATKZM7RX.js.map +0 -1
- package/dist/chunk-AVMLPIM7.js.map +0 -1
- package/dist/chunk-DGUM43GV.js.map +0 -1
- package/dist/chunk-E66EQZE6.js.map +0 -1
- package/dist/chunk-FFQEQTNW.js.map +0 -1
- package/dist/chunk-FMUCXFII.js.map +0 -1
- package/dist/chunk-G37KK66H.js.map +0 -1
- package/dist/chunk-I6DAQMWX.js.map +0 -1
- package/dist/chunk-J36DSWQK.js.map +0 -1
- package/dist/chunk-KQCRWDSA.js +0 -1
- package/dist/chunk-KQCRWDSA.js.map +0 -1
- package/dist/chunk-L4OXEN46.js.map +0 -1
- package/dist/chunk-LMC26NLJ.js +0 -84
- package/dist/chunk-LMC26NLJ.js.map +0 -1
- package/dist/chunk-M43Y4SSO.js.map +0 -1
- package/dist/chunk-M7MPQISP.js.map +0 -1
- package/dist/chunk-NN6WWZ5U.js.map +0 -1
- package/dist/chunk-OEWDTMG7.js.map +0 -1
- package/dist/chunk-PWLANIRT.js.map +0 -1
- package/dist/chunk-QXHPKYJV.js.map +0 -1
- package/dist/chunk-VBXEHIUJ.js.map +0 -1
- package/dist/chunk-YKRAFF5K.js.map +0 -1
- package/dist/chunk-ZSAAAMVR.js.map +0 -1
- package/dist/components.js.map +0 -1
- package/dist/contextValidator-OOPCLPZW.js +0 -9
- package/dist/contextValidator-OOPCLPZW.js.map +0 -1
- package/dist/eslint-rules/pace-core-compliance.cjs +0 -510
- package/dist/hooks.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/providers.js.map +0 -1
- package/dist/rbac/eslint-rules.js.map +0 -1
- package/dist/rbac/index.js.map +0 -1
- package/dist/styles/index.js.map +0 -1
- package/dist/theming/runtime.js.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/utils.js.map +0 -1
- package/docs/standards/01-architecture-standard.md +0 -44
- package/docs/standards/02-api-and-rpc-standard.md +0 -39
- package/docs/standards/03-component-standard.md +0 -32
- package/docs/standards/05-security-standard.md +0 -44
- package/docs/standards/06-testing-and-docs-standard.md +0 -29
- package/docs/standards/pace-core-compliance.md +0 -432
- package/scripts/audit/core/checks/accessibility.cjs +0 -197
- package/scripts/audit/core/checks/api-usage.cjs +0 -191
- package/scripts/audit/core/checks/bundle.cjs +0 -142
- package/scripts/audit/core/checks/compliance.cjs +0 -2706
- package/scripts/audit/core/checks/config.cjs +0 -54
- package/scripts/audit/core/checks/coverage.cjs +0 -84
- package/scripts/audit/core/checks/dependencies.cjs +0 -994
- package/scripts/audit/core/checks/documentation.cjs +0 -268
- package/scripts/audit/core/checks/environment.cjs +0 -116
- package/scripts/audit/core/checks/error-handling.cjs +0 -340
- package/scripts/audit/core/checks/forms.cjs +0 -172
- package/scripts/audit/core/checks/heuristics.cjs +0 -68
- package/scripts/audit/core/checks/hooks.cjs +0 -334
- package/scripts/audit/core/checks/imports.cjs +0 -244
- package/scripts/audit/core/checks/performance.cjs +0 -325
- package/scripts/audit/core/checks/routes.cjs +0 -117
- package/scripts/audit/core/checks/state.cjs +0 -130
- package/scripts/audit/core/checks/structure.cjs +0 -65
- package/scripts/audit/core/checks/style.cjs +0 -584
- package/scripts/audit/core/checks/testing.cjs +0 -122
- package/scripts/audit/core/checks/typescript.cjs +0 -61
- package/scripts/audit/core/scanner.cjs +0 -199
- package/scripts/audit/core/utils.cjs +0 -137
- package/scripts/audit/reporters/console.cjs +0 -151
- package/scripts/audit/reporters/json.cjs +0 -54
- package/scripts/audit/reporters/markdown.cjs +0 -124
- package/scripts/audit-consuming-app.cjs +0 -86
- package/src/eslint-rules/pace-core-compliance.cjs +0 -510
- package/src/eslint-rules/pace-core-compliance.js +0 -638
- package/src/rbac/components/EnhancedNavigationMenu.test.tsx +0 -555
- package/src/rbac/components/EnhancedNavigationMenu.tsx +0 -293
- package/src/rbac/components/NavigationProvider.test.tsx +0 -481
- package/src/rbac/components/NavigationProvider.tsx +0 -345
- package/src/rbac/components/PagePermissionProvider.test.tsx +0 -476
- package/src/rbac/components/PagePermissionProvider.tsx +0 -279
- package/src/rbac/components/PermissionEnforcer.tsx +0 -312
- package/src/rbac/components/RoleBasedRouter.tsx +0 -440
- package/src/rbac/components/SecureDataProvider.test.tsx +0 -543
- package/src/rbac/components/SecureDataProvider.tsx +0 -339
- package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +0 -620
- package/src/rbac/components/__tests__/NavigationProvider.test.tsx +0 -726
- package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +0 -661
- package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +0 -881
- package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +0 -783
- package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +0 -645
- package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +0 -659
- package/src/rbac/hooks/permissions/useCachedPermissions.ts +0 -79
- package/src/rbac/hooks/permissions/useHasAllPermissions.ts +0 -90
- package/src/rbac/hooks/permissions/useHasAnyPermission.ts +0 -90
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Enforce performance optimization patterns including React memoization, database query optimization, and caching strategies
|
|
3
|
+
globs: ["src/**/*.{ts,tsx,js,jsx}", "supabase/migrations/**/*.sql"]
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
paceCoreVersion: "0.6.x"
|
|
6
|
+
rulesVersion: "2025-01-28"
|
|
7
|
+
---
|
|
8
|
+
# Performance Optimization Guide
|
|
9
|
+
|
|
10
|
+
**📚 Human-Readable Standard**: See [11-performance-optimization.md](../../packages/core/docs/standards/11-performance-optimization.md) for complete documentation.
|
|
11
|
+
|
|
12
|
+
This guide enforces performance optimization patterns to ensure fast, responsive applications.
|
|
13
|
+
|
|
14
|
+
**AI Agent Instructions**: When writing performance-sensitive code, ALWAYS apply these optimizations. Use the decision trees below to determine when to optimize.
|
|
15
|
+
|
|
16
|
+
## MUST: Optimize React Re-renders
|
|
17
|
+
|
|
18
|
+
**MUST use memoization for expensive computations and stable references:**
|
|
19
|
+
|
|
20
|
+
```tsx
|
|
21
|
+
// ✅ CORRECT - Memoize expensive computation
|
|
22
|
+
const expensiveValue = useMemo(() => computeExpensiveValue(data), [data]);
|
|
23
|
+
|
|
24
|
+
// ✅ CORRECT - Stable callback reference
|
|
25
|
+
const handleClick = useCallback(() => doSomething(id), [id]);
|
|
26
|
+
|
|
27
|
+
// ✅ CORRECT - Memoize component
|
|
28
|
+
const ExpensiveComponent = React.memo(({ data }) => <div>{/* ... */}</div>);
|
|
29
|
+
|
|
30
|
+
// ❌ WRONG - Recomputes on every render
|
|
31
|
+
const expensiveValue = computeExpensiveValue(data);
|
|
32
|
+
const handleClick = () => doSomething(id);
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## MUST: Avoid Creating New Objects in Render
|
|
36
|
+
|
|
37
|
+
**MUST NOT create new objects/arrays in render:**
|
|
38
|
+
|
|
39
|
+
```tsx
|
|
40
|
+
// ❌ WRONG - New object on every render
|
|
41
|
+
function Component({ items }) {
|
|
42
|
+
const config = { items, enabled: true };
|
|
43
|
+
return <Child config={config} />;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// ✅ CORRECT - Memoize object
|
|
47
|
+
function Component({ items }) {
|
|
48
|
+
const config = useMemo(() => ({ items, enabled: true }), [items]);
|
|
49
|
+
return <Child config={config} />;
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## MUST: Use Helper Functions in RLS Policies
|
|
54
|
+
|
|
55
|
+
**MUST use STABLE SECURITY DEFINER helper functions (never subqueries):**
|
|
56
|
+
|
|
57
|
+
```sql
|
|
58
|
+
-- ✅ CORRECT - Helper function (evaluated once)
|
|
59
|
+
CREATE POLICY "rbac_select_users" ON users FOR SELECT USING (
|
|
60
|
+
check_user_organisation_access(organisation_id)
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
-- ❌ WRONG - Subquery (N+1 performance issue)
|
|
64
|
+
CREATE POLICY "rbac_select_users" ON users FOR SELECT USING (
|
|
65
|
+
organisation_id IN (SELECT organisation_id FROM organisation_memberships WHERE user_id = auth.uid())
|
|
66
|
+
);
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## SHOULD: Lazy Load Heavy Components
|
|
70
|
+
|
|
71
|
+
**SHOULD lazy load heavy components:**
|
|
72
|
+
|
|
73
|
+
```tsx
|
|
74
|
+
// ✅ CORRECT - Lazy load
|
|
75
|
+
import { lazy, Suspense } from 'react';
|
|
76
|
+
const HeavyComponent = lazy(() => import('./HeavyComponent'));
|
|
77
|
+
<Suspense fallback={<Loading />}><HeavyComponent /></Suspense>
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## SHOULD: Configure TanStack Query Cache
|
|
81
|
+
|
|
82
|
+
**SHOULD configure appropriate cache times:**
|
|
83
|
+
|
|
84
|
+
```tsx
|
|
85
|
+
// ✅ CORRECT - Configure cache
|
|
86
|
+
const queryClient = new QueryClient({
|
|
87
|
+
defaultOptions: {
|
|
88
|
+
queries: {
|
|
89
|
+
staleTime: 5 * 60 * 1000,
|
|
90
|
+
cacheTime: 10 * 60 * 1000,
|
|
91
|
+
retry: 1,
|
|
92
|
+
refetchOnWindowFocus: false,
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
});
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## SHOULD: Use RPC Functions for Complex Queries
|
|
99
|
+
|
|
100
|
+
**SHOULD use RPC functions instead of complex client-side queries:**
|
|
101
|
+
|
|
102
|
+
```tsx
|
|
103
|
+
// ✅ CORRECT - RPC for complex query
|
|
104
|
+
const { data } = await supabase.rpc('data_events_list', { organisation_id: orgId });
|
|
105
|
+
|
|
106
|
+
// ❌ AVOID - Complex client-side query
|
|
107
|
+
const { data } = await supabase.from('events').select('*, users(*), organisations(*)').eq('organisation_id', orgId);
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Decision Tree: Performance Optimization
|
|
111
|
+
|
|
112
|
+
**ALWAYS follow this decision tree:**
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
1. Is this expensive computation?
|
|
116
|
+
├─ YES → Use useMemo
|
|
117
|
+
└─ NO → Don't memoize (overhead not worth it)
|
|
118
|
+
|
|
119
|
+
2. Is this function passed as prop?
|
|
120
|
+
├─ YES → Use useCallback
|
|
121
|
+
└─ NO → Regular function is fine
|
|
122
|
+
|
|
123
|
+
3. Is this component expensive to render?
|
|
124
|
+
├─ YES → Use React.memo
|
|
125
|
+
└─ NO → Regular component is fine
|
|
126
|
+
|
|
127
|
+
4. Is this creating new object/array in render?
|
|
128
|
+
├─ YES → Memoize with useMemo
|
|
129
|
+
└─ NO → Continue
|
|
130
|
+
|
|
131
|
+
5. Is this RLS policy?
|
|
132
|
+
├─ YES → Use helper function (STABLE SECURITY DEFINER)
|
|
133
|
+
└─ NO → Continue
|
|
134
|
+
|
|
135
|
+
6. Is this complex query?
|
|
136
|
+
├─ YES → Use RPC function
|
|
137
|
+
└─ NO → Client-side query is fine
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## Performance Checklist
|
|
141
|
+
|
|
142
|
+
Before committing performance-sensitive code, verify:
|
|
143
|
+
|
|
144
|
+
- [ ] Expensive computations memoized
|
|
145
|
+
- [ ] Callbacks stable with useCallback
|
|
146
|
+
- [ ] Components memoized when appropriate
|
|
147
|
+
- [ ] No new objects/arrays in render
|
|
148
|
+
- [ ] Heavy components lazy loaded
|
|
149
|
+
- [ ] RLS policies use helper functions
|
|
150
|
+
- [ ] Queries use indexes appropriately
|
|
151
|
+
- [ ] No N+1 query patterns
|
|
152
|
+
- [ ] TanStack Query configured properly
|
|
153
|
+
- [ ] Bundle size optimized
|
|
154
|
+
|
|
155
|
+
## Common Performance Pitfalls
|
|
156
|
+
|
|
157
|
+
1. **Creating new objects in render** - Memoize with useMemo
|
|
158
|
+
2. **Using inline functions** - Use useCallback
|
|
159
|
+
3. **Over-memoizing** - Only memoize expensive operations
|
|
160
|
+
4. **Subqueries in RLS** - Use helper functions
|
|
161
|
+
5. **N+1 queries** - Use joins or RPC functions
|
|
162
|
+
6. **Not lazy loading** - Lazy load heavy components
|
|
163
|
+
7. **Poor cache configuration** - Configure TanStack Query properly
|
|
164
|
+
|
|
165
|
+
## Reference
|
|
166
|
+
|
|
167
|
+
- **Standard**: `packages/core/docs/standards/11-performance-optimization.md`
|
|
168
|
+
- **RLS**: See `09-rbac-compliance.mdc` for RLS performance requirements
|
|
169
|
+
- **Code Quality**: See `06-code-quality.mdc` for React patterns
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Enforce CI/CD integration patterns including automated quality checks, deployment processes, and security scanning
|
|
3
|
+
globs: [".github/workflows/**/*.yml", ".github/workflows/**/*.yaml", "package.json"]
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
paceCoreVersion: "0.6.x"
|
|
6
|
+
rulesVersion: "2025-01-28"
|
|
7
|
+
---
|
|
8
|
+
# CI/CD Integration Guide
|
|
9
|
+
|
|
10
|
+
**📚 Human-Readable Standard**: See [12-ci-cd-integration.md](../../packages/core/docs/standards/12-ci-cd-integration.md) for complete documentation.
|
|
11
|
+
|
|
12
|
+
This guide enforces CI/CD integration patterns to ensure automated quality checks and consistent deployments.
|
|
13
|
+
|
|
14
|
+
**AI Agent Instructions**: When setting up CI/CD pipelines, ALWAYS include the required checks below. Use the decision tree to determine what checks are needed.
|
|
15
|
+
|
|
16
|
+
## MUST: Include Required CI Checks
|
|
17
|
+
|
|
18
|
+
**MUST run these checks in every CI pipeline:**
|
|
19
|
+
|
|
20
|
+
```yaml
|
|
21
|
+
# ✅ CORRECT - Required checks
|
|
22
|
+
jobs:
|
|
23
|
+
quality-checks:
|
|
24
|
+
steps:
|
|
25
|
+
- name: Lint
|
|
26
|
+
run: npm run lint
|
|
27
|
+
- name: Type check
|
|
28
|
+
run: npx tsc --noEmit
|
|
29
|
+
- name: Run tests
|
|
30
|
+
run: npm run test
|
|
31
|
+
- name: Build
|
|
32
|
+
run: npm run build
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## MUST: Have Required Scripts
|
|
36
|
+
|
|
37
|
+
**MUST have these scripts in package.json:**
|
|
38
|
+
|
|
39
|
+
```json
|
|
40
|
+
// ✅ CORRECT - Required scripts
|
|
41
|
+
{
|
|
42
|
+
"scripts": {
|
|
43
|
+
"lint": "eslint .",
|
|
44
|
+
"type-check": "tsc --noEmit",
|
|
45
|
+
"test": "vitest run",
|
|
46
|
+
"build": "vite build"
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## SHOULD: Include Additional Checks
|
|
52
|
+
|
|
53
|
+
**SHOULD include these checks:**
|
|
54
|
+
|
|
55
|
+
```yaml
|
|
56
|
+
# ✅ RECOMMENDED - Additional checks
|
|
57
|
+
- name: Format check
|
|
58
|
+
run: npm run format:check
|
|
59
|
+
- name: Security scan
|
|
60
|
+
run: npm audit --audit-level=moderate
|
|
61
|
+
- name: Coverage check
|
|
62
|
+
run: npm run test:coverage
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## MUST: Use Secrets for Sensitive Data
|
|
66
|
+
|
|
67
|
+
**MUST NOT commit secrets to repository:**
|
|
68
|
+
|
|
69
|
+
```yaml
|
|
70
|
+
# ✅ CORRECT - Use secrets
|
|
71
|
+
env:
|
|
72
|
+
SUPABASE_URL: ${{ secrets.SUPABASE_URL }}
|
|
73
|
+
VITE_SUPABASE_ANON_KEY: ${{ secrets.VITE_SUPABASE_ANON_KEY }}
|
|
74
|
+
|
|
75
|
+
# ❌ WRONG - Hardcoded secrets
|
|
76
|
+
env:
|
|
77
|
+
SUPABASE_URL: "https://hardcoded-url.supabase.co"
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## SHOULD: Deploy to Staging First
|
|
81
|
+
|
|
82
|
+
**SHOULD deploy to staging before production:**
|
|
83
|
+
|
|
84
|
+
```yaml
|
|
85
|
+
# ✅ CORRECT - Staging first
|
|
86
|
+
deploy-staging:
|
|
87
|
+
if: github.ref == 'refs/heads/develop'
|
|
88
|
+
environment: staging
|
|
89
|
+
|
|
90
|
+
deploy-production:
|
|
91
|
+
needs: deploy-staging
|
|
92
|
+
if: github.ref == 'refs/heads/main'
|
|
93
|
+
environment: production
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## Decision Tree: CI/CD Setup
|
|
97
|
+
|
|
98
|
+
**ALWAYS follow this decision tree:**
|
|
99
|
+
|
|
100
|
+
```
|
|
101
|
+
1. What type of check is this?
|
|
102
|
+
├─ Lint → MUST include
|
|
103
|
+
├─ Type Check → MUST include
|
|
104
|
+
├─ Tests → MUST include
|
|
105
|
+
├─ Build → MUST include
|
|
106
|
+
├─ Compliance → MUST include
|
|
107
|
+
├─ Format → SHOULD include
|
|
108
|
+
├─ Security → SHOULD include
|
|
109
|
+
└─ Coverage → SHOULD include
|
|
110
|
+
|
|
111
|
+
2. Is this sensitive data?
|
|
112
|
+
├─ YES → Use secrets (never commit)
|
|
113
|
+
└─ NO → Can be in config
|
|
114
|
+
|
|
115
|
+
3. What environment?
|
|
116
|
+
├─ Staging → Deploy on develop branch
|
|
117
|
+
└─ Production → Deploy on main branch only
|
|
118
|
+
|
|
119
|
+
4. Are migrations needed?
|
|
120
|
+
├─ YES → Run in staging first, test in CI
|
|
121
|
+
└─ NO → Continue
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## CI/CD Checklist
|
|
125
|
+
|
|
126
|
+
Before committing CI/CD configuration, verify:
|
|
127
|
+
|
|
128
|
+
- [ ] Lint check configured
|
|
129
|
+
- [ ] Type check configured
|
|
130
|
+
- [ ] Tests run in CI
|
|
131
|
+
- [ ] Build succeeds in CI
|
|
132
|
+
- [ ] Security scan configured (recommended)
|
|
133
|
+
- [ ] Environment variables set as secrets
|
|
134
|
+
- [ ] Staging deployment configured
|
|
135
|
+
- [ ] Production deployment configured
|
|
136
|
+
- [ ] Migration strategy defined
|
|
137
|
+
- [ ] Required scripts in package.json
|
|
138
|
+
|
|
139
|
+
## Common CI/CD Mistakes
|
|
140
|
+
|
|
141
|
+
1. **Missing required checks** - Include all MUST checks
|
|
142
|
+
2. **Hardcoded secrets** - Always use secrets
|
|
143
|
+
3. **No staging environment** - Deploy to staging first
|
|
144
|
+
4. **No rollback plan** - Document rollback process
|
|
145
|
+
|
|
146
|
+
## Reference
|
|
147
|
+
|
|
148
|
+
- **Standard**: `packages/core/docs/standards/12-ci-cd-integration.md`
|
|
149
|
+
- **Testing**: See `04-testing-standards.mdc` for test configuration
|
|
150
|
+
- **Code Quality**: See `06-code-quality.mdc` for linting
|
|
@@ -477,6 +477,7 @@ declare class AuthService extends BaseService implements IAuthService {
|
|
|
477
477
|
private appName;
|
|
478
478
|
private errorHandler;
|
|
479
479
|
private unhandledRejectionHandler;
|
|
480
|
+
private wasAuthenticatedRef;
|
|
480
481
|
constructor(supabaseClient: SupabaseClient, appName?: string);
|
|
481
482
|
getInstanceId(): number;
|
|
482
483
|
getUser(): User | null;
|
|
@@ -499,6 +500,15 @@ declare class AuthService extends BaseService implements IAuthService {
|
|
|
499
500
|
private startSessionRestoration;
|
|
500
501
|
private finishSessionRestoration;
|
|
501
502
|
private clearRestorationTimeout;
|
|
503
|
+
/**
|
|
504
|
+
* Clear pace-core persistence entries from sessionStorage
|
|
505
|
+
* This includes dialog, form, and datatable persistence
|
|
506
|
+
*
|
|
507
|
+
* @param userId - Optional user ID to clear only that user's persistence.
|
|
508
|
+
* If not provided, clears all pace-core persistence (for user changes).
|
|
509
|
+
* @param clearUnscoped - If true, also clears old unscoped keys (without :user: prefix)
|
|
510
|
+
*/
|
|
511
|
+
private clearPersistenceOnLogin;
|
|
502
512
|
private setupAuthStateListener;
|
|
503
513
|
private restoreSession;
|
|
504
514
|
/**
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
-
import { d as DataRecord, D as DataTableColumn, e as DataTableRBACConfig, f as DataTableFeatureConfig, H as HierarchicalConfig, g as PerformanceConfig, S as ServerSideConfig, h as PaginationMode, C as ChunkingConfig, i as SearchIndexConfig, j as ExportOptions, G as GetRowId, E as EmptyStateConfig, c as AggregateConfig, a as DataTableAction } from './types-
|
|
2
|
+
import { d as DataRecord, D as DataTableColumn, e as DataTableRBACConfig, f as DataTableFeatureConfig, H as HierarchicalConfig, g as PerformanceConfig, S as ServerSideConfig, h as PaginationMode, C as ChunkingConfig, i as SearchIndexConfig, j as ExportOptions, G as GetRowId, E as EmptyStateConfig, c as AggregateConfig, a as DataTableAction } from './types-B-K_5VnO.js';
|
|
3
3
|
import React__default from 'react';
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export { ActionButtons, BulkOperationsDropdown, ColumnFactory, ColumnVisibilityDropdown, DataTable, DataTableCore, DataTableErrorBoundary, DataTableModals, DataTableToolbar, EditableRow, EmptyState, EnhancedPaginationControls, GroupHeader, GroupingDropdown, ImportModal, LoadingState, PaginationControls, UnifiedTableBody, announce, announceBulkOperation, announceFilterChange, announceLoadingState, announcePaginationChange, announceSearchResults, announceSelectionChange, announceSortChange, average, calculateAllDepths, calculateAllIndentation, calculateIndentation, calculateOptimalPageSize, cleanupLiveRegion, count, createHierarchicalStructure, defaultDataTableFeatures, exportToCSV, exportToCSVWithTableRows, generateCSVContent, getAriaSortValue, getCellRenderer, getColumnHeaderText, getHierarchicalSortConfig, getPageSizeOptions, getPaginationBinding, getRowDepth, getRowDescription, getRowIdSafe, getSortButtonLabel, groupHierarchicalData, hasValidRowId, initializeLiveRegion, isHierarchicalSortableColumn, max, min, normalizeDataTableFeatures, shouldShowColumnForRow, sortHierarchicalDataByStructure, sortHierarchicalDataWithSorting, sum, validateHierarchicalData, validatePaginationConfig } from './chunk-ZS5VO5JB.js';
|
|
2
|
+
import './chunk-7TYHROIV.js';
|
|
3
|
+
export { CircuitBreaker, DEFAULT_FALLBACK_CONFIG, DataChunkManager, DataTableError, DataTableErrorType, ErrorRecoveryManager, MemoryMonitor, SearchIndex, VisibilityTracker, chunkData, debounce, determinePaginationMode, getOptimalPageSizeOptions, safeExecute, throttle, useDataTablePerformance } from './chunk-S7DKJPLT.js';
|
|
4
|
+
import './chunk-3O3WHILE.js';
|
|
5
|
+
import './chunk-C7NSAPTL.js';
|
|
6
|
+
import './chunk-FTCRZOG2.js';
|
|
7
|
+
import './chunk-ZFYPMX46.js';
|
|
8
|
+
import './chunk-AHU7G2R5.js';
|
|
9
|
+
import './chunk-4SXLQIZO.js';
|
|
10
|
+
import './chunk-3QC3KRHK.js';
|
|
11
|
+
import './chunk-A55DK444.js';
|
|
12
|
+
import './chunk-SD6WQY43.js';
|
|
13
|
+
import './chunk-HF6O3O37.js';
|
|
14
|
+
import './chunk-TTRFSOKR.js';
|
|
15
|
+
import './chunk-3RG5ZIWI.js';
|