@jmruthers/pace-core 0.6.5 → 0.6.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +104 -0
- package/README.md +5 -403
- package/audit-tool/00-dependencies.cjs +394 -0
- package/audit-tool/audits/01-pace-core-compliance.cjs +556 -0
- package/audit-tool/audits/02-project-structure.cjs +255 -0
- package/audit-tool/audits/03-architecture.cjs +196 -0
- package/audit-tool/audits/04-code-quality.cjs +149 -0
- package/audit-tool/audits/05-styling.cjs +224 -0
- package/audit-tool/audits/06-security-rbac.cjs +544 -0
- package/audit-tool/audits/07-api-tech-stack.cjs +301 -0
- package/audit-tool/audits/08-testing-documentation.cjs +202 -0
- package/audit-tool/audits/09-operations.cjs +208 -0
- package/audit-tool/index.cjs +291 -0
- package/audit-tool/utils/code-utils.cjs +218 -0
- package/audit-tool/utils/file-utils.cjs +230 -0
- package/audit-tool/utils/report-utils.cjs +241 -0
- package/core-usage-manifest.json +93 -0
- package/cursor-rules/00-standards-overview.mdc +156 -0
- package/cursor-rules/01-pace-core-compliance.mdc +586 -0
- package/cursor-rules/02-project-structure.mdc +42 -4
- package/cursor-rules/{03-solid-principles.mdc → 03-architecture.mdc} +126 -10
- package/cursor-rules/04-code-quality.mdc +419 -0
- package/cursor-rules/{08-markup-quality.mdc → 05-styling.mdc} +104 -34
- package/cursor-rules/06-security-rbac.mdc +518 -0
- package/cursor-rules/07-api-tech-stack.mdc +377 -0
- package/cursor-rules/08-testing-documentation.mdc +324 -0
- package/cursor-rules/09-operations.mdc +365 -0
- package/dist/{AuthService-Cb34EQs3.d.ts → AuthService-DmfO5rGS.d.ts} +10 -0
- package/dist/DataTable-7PMH7XN7.js +15 -0
- package/dist/{DataTable-BMRU8a1j.d.ts → DataTable-DRUIgtUH.d.ts} +1 -1
- package/dist/{PublicPageProvider-QTFVrL-Z.d.ts → PublicPageProvider-DlsCaR5v.d.ts} +33 -72
- package/dist/UnifiedAuthProvider-ZT6TIGM7.js +7 -0
- package/dist/api-Y4MQWOFW.js +4 -0
- package/dist/audit-MYQXYZFU.js +3 -0
- package/dist/{chunk-DGUM43GV.js → chunk-3RG5ZIWI.js} +1 -4
- package/dist/{chunk-QXHPKYJV.js → chunk-4SXLQIZO.js} +1 -26
- package/dist/{chunk-UPPMRMYG.js → chunk-5X4QLXRG.js} +73 -151
- package/dist/chunk-6F3IILHI.js +62 -0
- package/dist/{chunk-E66EQZE6.js → chunk-6GLLNA6U.js} +3 -9
- package/dist/{chunk-ZSAAAMVR.js → chunk-6QYDGKQY.js} +1 -4
- package/dist/{chunk-FMUCXFII.js → chunk-7ILTDCL2.js} +9 -5
- package/dist/{chunk-M43Y4SSO.js → chunk-A3W6LW53.js} +15 -13
- package/dist/{chunk-63FOKYGO.js → chunk-AHU7G2R5.js} +2 -11
- package/dist/{chunk-HU2C6SSC.js → chunk-BM4CQ5P3.js} +606 -559
- package/dist/chunk-C7NSAPTL.js +1 -0
- package/dist/{chunk-J36DSWQK.js → chunk-FEJLJNWA.js} +7 -41
- package/dist/{chunk-IHB5DR3H.js → chunk-FTCRZOG2.js} +188 -387
- package/dist/{chunk-G37KK66H.js → chunk-FYHN4DD5.js} +60 -19
- package/dist/chunk-GHYHJTYV.js +994 -0
- package/dist/{chunk-VBXEHIUJ.js → chunk-HF6O3O37.js} +6 -88
- package/dist/{chunk-FFQEQTNW.js → chunk-IUBRCBSY.js} +134 -45
- package/dist/{chunk-6COVEUS7.js → chunk-JGWDVX64.js} +983 -1034
- package/dist/{chunk-RGAWHO7N.js → chunk-L4XMVJKY.js} +77 -222
- package/dist/chunk-MBADTM7L.js +64 -0
- package/dist/{chunk-M7MPQISP.js → chunk-OJ4SKRSV.js} +3 -16
- package/dist/{chunk-IVOFDYWT.js → chunk-Q7Q7V5NV.js} +2109 -1604
- package/dist/{chunk-JGRYX5UX.js → chunk-S7DKJPLT.js} +29 -58
- package/dist/{chunk-PWLANIRT.js → chunk-TTRFSOKR.js} +1 -7
- package/dist/{chunk-5DRSZLL2.js → chunk-UH3NTO3F.js} +1 -6
- package/dist/{chunk-NTM7ZSB6.js → chunk-VBCS3DUA.js} +261 -168
- package/dist/{chunk-EFN2EIMK.js → chunk-ZFYPMX46.js} +271 -87
- package/dist/{chunk-L4OXEN46.js → chunk-ZKAWKYT4.js} +10 -24
- package/dist/components.d.ts +7 -5
- package/dist/components.js +46 -257
- package/dist/{database.generated-CzIvgcPu.d.ts → database.generated-CcnC_DRc.d.ts} +4795 -3691
- package/dist/eslint-rules/index.cjs +35 -0
- package/{src/eslint-rules/pace-core-compliance.cjs → dist/eslint-rules/rules/01-pace-core-compliance.cjs} +234 -235
- package/dist/eslint-rules/rules/04-code-quality.cjs +290 -0
- package/dist/eslint-rules/rules/05-styling.cjs +61 -0
- package/dist/eslint-rules/rules/06-security-rbac.cjs +806 -0
- package/dist/eslint-rules/rules/07-api-tech-stack.cjs +263 -0
- package/dist/eslint-rules/rules/08-testing.cjs +94 -0
- package/dist/eslint-rules/utils/helpers.cjs +42 -0
- package/dist/eslint-rules/utils/manifest-loader.cjs +75 -0
- package/dist/hooks.d.ts +6 -6
- package/dist/hooks.js +62 -172
- package/dist/icons/index.d.ts +1 -0
- package/dist/icons/index.js +1 -0
- package/dist/index.d.ts +12 -11
- package/dist/index.js +67 -660
- package/dist/providers.d.ts +2 -2
- package/dist/providers.js +8 -35
- package/dist/rbac/eslint-rules.d.ts +46 -44
- package/dist/rbac/eslint-rules.js +7 -4
- package/dist/rbac/index.d.ts +109 -586
- package/dist/rbac/index.js +14 -207
- package/dist/styles/index.js +2 -12
- package/dist/theming/runtime.d.ts +14 -1
- package/dist/theming/runtime.js +3 -19
- package/dist/{timezone-CHhWg6b4.d.ts → timezone-BZe_eUxx.d.ts} +175 -1
- package/dist/{types-CkbwOr4Y.d.ts → types-DXstZpNI.d.ts} +4 -17
- package/dist/types-t9H8qKRw.d.ts +55 -0
- package/dist/types.d.ts +1 -1
- package/dist/types.js +7 -94
- package/dist/{usePublicRouteParams-ClnV4tnv.d.ts → usePublicRouteParams-MamNgwqe.d.ts} +20 -20
- package/dist/utils.d.ts +24 -117
- package/dist/utils.js +54 -392
- package/docs/README.md +17 -7
- package/docs/api/README.md +4 -402
- package/docs/api/modules.md +301 -871
- package/docs/api-reference/components.md +21 -21
- package/docs/api-reference/deprecated.md +31 -6
- package/docs/api-reference/hooks.md +80 -80
- package/docs/api-reference/rpc-functions.md +78 -3
- package/docs/api-reference/types.md +1 -1
- package/docs/api-reference/utilities.md +1 -1
- package/docs/architecture/README.md +1 -1
- package/docs/core-concepts/events.md +3 -3
- package/docs/core-concepts/organisations.md +6 -6
- package/docs/core-concepts/permissions.md +6 -6
- package/docs/documentation-index.md +12 -18
- package/docs/getting-started/cursor-rules.md +3 -23
- package/docs/getting-started/dependencies.md +650 -0
- package/docs/getting-started/documentation-index.md +1 -1
- package/docs/getting-started/examples/README.md +4 -4
- package/docs/getting-started/examples/full-featured-app.md +1 -1
- package/docs/getting-started/faq.md +2 -2
- package/docs/getting-started/installation-guide.md +20 -7
- package/docs/getting-started/quick-reference.md +4 -4
- package/docs/getting-started/quick-start.md +23 -12
- package/docs/implementation-guides/authentication.md +15 -15
- package/docs/implementation-guides/component-styling.md +1 -1
- package/docs/implementation-guides/data-tables.md +126 -33
- package/docs/implementation-guides/datatable-rbac-usage.md +1 -1
- package/docs/implementation-guides/dynamic-colors.md +3 -3
- package/docs/implementation-guides/file-upload-storage.md +2 -2
- package/docs/implementation-guides/hierarchical-datatable.md +40 -60
- package/docs/implementation-guides/inactivity-tracking.md +3 -3
- package/docs/implementation-guides/large-datasets.md +3 -2
- package/docs/implementation-guides/organisation-security.md +2 -2
- package/docs/implementation-guides/performance.md +2 -2
- package/docs/implementation-guides/permission-enforcement.md +5 -1
- package/docs/migration/V0.3.44_organisation-context-timing-fix.md +1 -1
- package/docs/migration/V0.4.0_rbac-migration.md +6 -6
- package/docs/rbac/MIGRATION_GUIDE.md +819 -0
- package/docs/rbac/RBAC_CONTRACT.md +724 -0
- package/docs/rbac/README.md +17 -8
- package/docs/rbac/advanced-patterns.md +6 -6
- package/docs/rbac/api-reference.md +20 -20
- package/docs/rbac/edge-functions-guide.md +376 -0
- package/docs/rbac/event-based-apps.md +3 -3
- package/docs/rbac/examples.md +41 -41
- package/docs/rbac/getting-started.md +37 -37
- package/docs/rbac/performance.md +1 -1
- package/docs/rbac/quick-start.md +52 -52
- package/docs/rbac/secure-client-protection.md +1 -35
- package/docs/rbac/troubleshooting.md +1 -1
- package/docs/security/README.md +5 -5
- package/docs/standards/0-standards-overview.md +220 -0
- package/docs/standards/1-pace-core-compliance-standards.md +986 -0
- package/docs/standards/2-project-structure-standards.md +949 -0
- package/docs/standards/3-architecture-standards.md +606 -0
- package/docs/standards/4-code-quality-standards.md +728 -0
- package/docs/standards/5-styling-standards.md +348 -0
- package/docs/standards/{07-rbac-and-rls-standard.md → 6-security-rbac-standards.md} +269 -66
- package/docs/standards/7-api-tech-stack-standards.md +662 -0
- package/docs/standards/8-testing-documentation-standards.md +401 -0
- package/docs/standards/9-operations-standards.md +1102 -0
- package/docs/standards/README.md +185 -57
- package/docs/troubleshooting/README.md +4 -4
- package/docs/troubleshooting/common-issues.md +2 -2
- package/docs/troubleshooting/debugging.md +9 -9
- package/docs/troubleshooting/migration.md +4 -4
- package/docs/troubleshooting/organisation-context-setup.md +42 -19
- package/eslint-config-pace-core.cjs +33 -6
- package/package.json +35 -23
- package/scripts/install-cursor-rules.cjs +25 -6
- package/scripts/install-eslint-config.cjs +284 -0
- package/src/__tests__/fixtures/supabase.ts +1 -1
- package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +3 -3
- package/src/__tests__/helpers/__tests__/optimized-test-setup.test.ts +1 -1
- package/src/__tests__/helpers/__tests__/supabaseMock.test.ts +1 -1
- package/src/__tests__/helpers/__tests__/test-providers.test.tsx +2 -2
- package/src/__tests__/helpers/__tests__/test-utils.test.tsx +13 -13
- package/src/__tests__/helpers/component-test-utils.tsx +1 -1
- package/src/__tests__/helpers/supabaseMock.ts +2 -2
- package/src/__tests__/integration/UserProfile.test.tsx +14 -14
- package/src/__tests__/public-recipe-view.test.ts +38 -9
- package/src/__tests__/rbac/PagePermissionGuard.test.tsx +6 -6
- package/src/__tests__/templates/accessibility.test.template.tsx +9 -9
- package/src/__tests__/templates/component.test.template.tsx +18 -15
- package/src/components/Button/Button.tsx +5 -1
- package/src/components/Calendar/Calendar.tsx +201 -47
- package/src/components/ContextSelector/ContextSelector.tsx +106 -119
- package/src/components/DataTable/AUDIT_REPORT.md +293 -0
- package/src/components/DataTable/__tests__/DataTableCore.test.tsx +10 -2
- package/src/components/DataTable/__tests__/a11y.basic.test.tsx +10 -4
- package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +9 -9
- package/src/components/DataTable/components/ColumnFilter.tsx +63 -74
- package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +43 -41
- package/src/components/DataTable/components/DataTableCore.tsx +186 -13
- package/src/components/DataTable/components/DataTableErrorBoundary.tsx +9 -11
- package/src/components/DataTable/components/DataTableLayout.tsx +35 -21
- package/src/components/DataTable/components/EditFields.tsx +23 -3
- package/src/components/DataTable/components/EditableRow.tsx +12 -9
- package/src/components/DataTable/components/EmptyState.tsx +10 -9
- package/src/components/DataTable/components/FilterRow.tsx +2 -4
- package/src/components/DataTable/components/ImportModal.tsx +124 -126
- package/src/components/DataTable/components/LoadingState.tsx +5 -6
- package/src/components/DataTable/components/RowComponent.tsx +12 -0
- package/src/components/DataTable/components/SortIndicator.tsx +50 -0
- package/src/components/DataTable/components/__tests__/COVERAGE_NOTE.md +4 -4
- package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +23 -82
- package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +37 -9
- package/src/components/DataTable/components/__tests__/EmptyState.test.tsx +7 -4
- package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +12 -4
- package/src/components/DataTable/components/__tests__/LoadingState.test.tsx +41 -27
- package/src/components/DataTable/components/hooks/usePermissionTracking.ts +0 -4
- package/src/components/DataTable/components/index.ts +2 -1
- package/src/components/DataTable/hooks/__tests__/useDataTableState.test.ts +51 -47
- package/src/components/DataTable/hooks/useDataTablePermissions.ts +24 -21
- package/src/components/DataTable/hooks/useDataTableState.ts +125 -9
- package/src/components/DataTable/hooks/useTableColumns.ts +40 -2
- package/src/components/DataTable/hooks/useTableHandlers.ts +11 -0
- package/src/components/DataTable/types.ts +5 -18
- package/src/components/DataTable/utils/a11yUtils.ts +17 -0
- package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +2 -1
- package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.tsx +11 -15
- package/src/components/DateTimeField/DateTimeField.tsx +10 -9
- package/src/components/Dialog/Dialog.test.tsx +128 -104
- package/src/components/Dialog/Dialog.tsx +742 -24
- package/src/components/ErrorBoundary/ErrorBoundary.tsx +77 -79
- package/src/components/FileDisplay/FileDisplay.test.tsx +4 -2
- package/src/components/FileDisplay/FileDisplay.tsx +23 -17
- package/src/components/FileUpload/FileUpload.test.tsx +52 -14
- package/src/components/FileUpload/FileUpload.tsx +112 -130
- package/src/components/Form/Form.test.tsx +6 -8
- package/src/components/Form/Form.tsx +365 -4
- package/src/components/NavigationMenu/NavigationMenu.test.tsx +14 -13
- package/src/components/NavigationMenu/useNavigationFiltering.ts +11 -21
- package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +6 -4
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +11 -15
- package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +108 -61
- package/src/components/PaceLoginPage/PaceLoginPage.tsx +27 -3
- package/src/components/Progress/Progress.tsx +2 -4
- package/src/components/ProtectedRoute/ProtectedRoute.tsx +8 -8
- package/src/components/Select/Select.tsx +109 -98
- package/src/components/Select/types.ts +4 -1
- package/src/components/UserMenu/UserMenu.tsx +9 -6
- package/src/hooks/__tests__/ServiceHooks.test.tsx +16 -16
- package/src/hooks/__tests__/hooks.integration.test.tsx +55 -57
- package/src/hooks/__tests__/useAppConfig.unit.test.ts +129 -67
- package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +97 -97
- package/src/hooks/__tests__/usePublicEvent.simple.test.ts +149 -67
- package/src/hooks/__tests__/usePublicEvent.test.ts +149 -79
- package/src/hooks/__tests__/usePublicEvent.unit.test.ts +158 -109
- package/src/hooks/__tests__/useSessionDraft.test.ts +163 -0
- package/src/hooks/__tests__/useSessionRestoration.unit.test.tsx +10 -5
- package/src/hooks/public/usePublicEvent.ts +67 -195
- package/src/hooks/public/usePublicEventLogo.test.ts +70 -17
- package/src/hooks/public/usePublicEventLogo.ts +24 -14
- package/src/hooks/public/usePublicFileDisplay.ts +2 -2
- package/src/hooks/public/usePublicRouteParams.ts +5 -5
- package/src/hooks/useAppConfig.ts +28 -26
- package/src/hooks/useEventTheme.test.ts +217 -239
- package/src/hooks/useEventTheme.ts +16 -28
- package/src/hooks/useFileDisplay.ts +2 -2
- package/src/hooks/useOrganisationPermissions.ts +5 -7
- package/src/hooks/useQueryCache.ts +0 -1
- package/src/hooks/useSessionDraft.ts +380 -0
- package/src/hooks/useSessionRestoration.ts +3 -1
- package/src/icons/index.ts +27 -0
- package/src/index.ts +5 -0
- package/src/providers/OrganisationProvider.tsx +23 -14
- package/src/providers/UnifiedAuthProvider.smoke.test.tsx +21 -21
- package/src/providers/__tests__/AuthProvider.test.tsx +21 -21
- package/src/providers/__tests__/EventProvider.test.tsx +61 -61
- package/src/providers/__tests__/InactivityProvider.test.tsx +56 -56
- package/src/providers/__tests__/OrganisationProvider.test.tsx +75 -75
- package/src/providers/__tests__/ProviderLifecycle.test.tsx +37 -37
- package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +103 -103
- package/src/providers/services/EventServiceProvider.tsx +1 -24
- package/src/providers/services/UnifiedAuthProvider.tsx +5 -48
- package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +7 -7
- package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +13 -10
- package/src/rbac/__tests__/adapters.comprehensive.test.tsx +7 -457
- package/src/rbac/__tests__/auth-rbac.e2e.test.tsx +33 -7
- package/src/rbac/adapters.tsx +7 -295
- package/src/rbac/api.test.ts +44 -56
- package/src/rbac/api.ts +10 -17
- package/src/rbac/cache-invalidation.ts +0 -1
- package/src/rbac/compliance/index.ts +10 -0
- package/src/rbac/compliance/pattern-detector.ts +553 -0
- package/src/rbac/compliance/runtime-compliance.ts +22 -0
- package/src/rbac/components/AccessDenied.tsx +150 -0
- package/src/rbac/components/NavigationGuard.tsx +12 -20
- package/src/rbac/components/PagePermissionGuard.tsx +4 -24
- package/src/rbac/components/__tests__/NavigationGuard.test.tsx +21 -8
- package/src/rbac/components/index.ts +3 -41
- package/src/rbac/eslint-rules.js +1 -1
- package/src/rbac/hooks/index.ts +0 -3
- package/src/rbac/hooks/permissions/index.ts +0 -3
- package/src/rbac/hooks/permissions/useAccessLevel.ts +4 -8
- package/src/rbac/hooks/usePermissions.ts +0 -3
- package/src/rbac/hooks/useResolvedScope.test.ts +57 -47
- package/src/rbac/hooks/useResolvedScope.ts +58 -140
- package/src/rbac/hooks/useResourcePermissions.test.ts +124 -38
- package/src/rbac/hooks/useResourcePermissions.ts +139 -48
- package/src/rbac/hooks/useRoleManagement.test.ts +65 -22
- package/src/rbac/hooks/useRoleManagement.ts +147 -19
- package/src/rbac/hooks/useSecureSupabase.ts +4 -8
- package/src/rbac/index.ts +7 -9
- package/src/rbac/utils/contextValidator.ts +9 -7
- package/src/services/AuthService.ts +130 -18
- package/src/services/EventService.ts +4 -97
- package/src/services/InactivityService.ts +16 -0
- package/src/services/OrganisationService.ts +7 -44
- package/src/services/__tests__/OrganisationService.test.ts +26 -8
- package/src/services/base/BaseService.ts +0 -3
- package/src/styles/core.css +7 -0
- package/src/theming/__tests__/parseEventColours.test.ts +9 -3
- package/src/theming/parseEventColours.ts +22 -10
- package/src/types/database.generated.ts +4733 -3809
- package/src/utils/__tests__/lazyLoad.unit.test.tsx +42 -39
- package/src/utils/__tests__/organisationContext.unit.test.ts +9 -10
- package/src/utils/context/organisationContext.test.ts +13 -28
- package/src/utils/context/organisationContext.ts +21 -52
- package/src/utils/dynamic/dynamicUtils.ts +1 -1
- package/src/utils/file-reference/index.ts +39 -15
- package/src/utils/formatting/formatDateTime.test.ts +3 -2
- package/src/utils/google-places/loadGoogleMapsScript.ts +29 -4
- package/src/utils/index.ts +4 -1
- package/src/utils/persistence/__tests__/keyDerivation.test.ts +135 -0
- package/src/utils/persistence/__tests__/sensitiveFieldDetection.test.ts +123 -0
- package/src/utils/persistence/keyDerivation.ts +304 -0
- package/src/utils/persistence/sensitiveFieldDetection.ts +212 -0
- package/src/utils/security/secureStorage.ts +5 -5
- package/src/utils/storage/README.md +1 -1
- package/src/utils/storage/helpers.ts +3 -3
- package/src/utils/supabase/createBaseClient.ts +147 -0
- package/src/utils/timezone/timezone.test.ts +1 -2
- package/src/utils/timezone/timezone.ts +1 -1
- package/src/utils/validation/csrf.ts +4 -4
- package/cursor-rules/00-pace-core-compliance.mdc +0 -331
- package/cursor-rules/01-standards-compliance.mdc +0 -244
- package/cursor-rules/04-testing-standards.mdc +0 -268
- package/cursor-rules/05-bug-reports-and-features.mdc +0 -246
- package/cursor-rules/06-code-quality.mdc +0 -309
- package/cursor-rules/07-tech-stack-compliance.mdc +0 -214
- package/cursor-rules/CHANGELOG.md +0 -119
- package/cursor-rules/README.md +0 -192
- package/dist/DataTable-AOVNCPTX.js +0 -175
- package/dist/DataTable-AOVNCPTX.js.map +0 -1
- package/dist/UnifiedAuthProvider-4SBX4LU5.js +0 -18
- package/dist/UnifiedAuthProvider-4SBX4LU5.js.map +0 -1
- package/dist/api-O6HTBX5Y.js +0 -52
- package/dist/api-O6HTBX5Y.js.map +0 -1
- package/dist/audit-V53FV5AG.js +0 -17
- package/dist/audit-V53FV5AG.js.map +0 -1
- package/dist/chunk-5DRSZLL2.js.map +0 -1
- package/dist/chunk-63FOKYGO.js.map +0 -1
- package/dist/chunk-6COVEUS7.js.map +0 -1
- package/dist/chunk-AFVQODI2.js +0 -263
- package/dist/chunk-AFVQODI2.js.map +0 -1
- package/dist/chunk-DGUM43GV.js.map +0 -1
- package/dist/chunk-E66EQZE6.js.map +0 -1
- package/dist/chunk-EFN2EIMK.js.map +0 -1
- package/dist/chunk-FFQEQTNW.js.map +0 -1
- package/dist/chunk-FMUCXFII.js.map +0 -1
- package/dist/chunk-G37KK66H.js.map +0 -1
- package/dist/chunk-G7QEZTYQ.js +0 -2053
- package/dist/chunk-G7QEZTYQ.js.map +0 -1
- package/dist/chunk-HU2C6SSC.js.map +0 -1
- package/dist/chunk-IHB5DR3H.js.map +0 -1
- package/dist/chunk-IVOFDYWT.js.map +0 -1
- package/dist/chunk-J36DSWQK.js.map +0 -1
- package/dist/chunk-JGRYX5UX.js.map +0 -1
- package/dist/chunk-KQCRWDSA.js +0 -1
- package/dist/chunk-KQCRWDSA.js.map +0 -1
- package/dist/chunk-L4OXEN46.js.map +0 -1
- package/dist/chunk-LMC26NLJ.js +0 -84
- package/dist/chunk-LMC26NLJ.js.map +0 -1
- package/dist/chunk-M43Y4SSO.js.map +0 -1
- package/dist/chunk-M7MPQISP.js.map +0 -1
- package/dist/chunk-NTM7ZSB6.js.map +0 -1
- package/dist/chunk-PWLANIRT.js.map +0 -1
- package/dist/chunk-QXHPKYJV.js.map +0 -1
- package/dist/chunk-RGAWHO7N.js.map +0 -1
- package/dist/chunk-UPPMRMYG.js.map +0 -1
- package/dist/chunk-VBXEHIUJ.js.map +0 -1
- package/dist/chunk-ZSAAAMVR.js.map +0 -1
- package/dist/components.js.map +0 -1
- package/dist/contextValidator-5OGXSPKS.js +0 -9
- package/dist/contextValidator-5OGXSPKS.js.map +0 -1
- package/dist/eslint-rules/pace-core-compliance.cjs +0 -510
- package/dist/hooks.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/providers.js.map +0 -1
- package/dist/rbac/eslint-rules.js.map +0 -1
- package/dist/rbac/index.js.map +0 -1
- package/dist/styles/index.js.map +0 -1
- package/dist/theming/runtime.js.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/utils.js.map +0 -1
- package/docs/best-practices/README.md +0 -472
- package/docs/best-practices/accessibility.md +0 -601
- package/docs/best-practices/common-patterns.md +0 -516
- package/docs/best-practices/deployment.md +0 -1103
- package/docs/best-practices/performance.md +0 -1328
- package/docs/best-practices/security.md +0 -940
- package/docs/best-practices/testing.md +0 -1034
- package/docs/rbac/compliance/compliance-guide.md +0 -544
- package/docs/standards/01-architecture-standard.md +0 -44
- package/docs/standards/02-api-and-rpc-standard.md +0 -39
- package/docs/standards/03-component-standard.md +0 -32
- package/docs/standards/04-code-style-standard.md +0 -32
- package/docs/standards/05-security-standard.md +0 -44
- package/docs/standards/06-testing-and-docs-standard.md +0 -29
- package/docs/standards/pace-core-compliance.md +0 -432
- package/scripts/audit/core/checks/accessibility.cjs +0 -197
- package/scripts/audit/core/checks/api-usage.cjs +0 -191
- package/scripts/audit/core/checks/bundle.cjs +0 -142
- package/scripts/audit/core/checks/compliance.cjs +0 -2706
- package/scripts/audit/core/checks/config.cjs +0 -54
- package/scripts/audit/core/checks/coverage.cjs +0 -84
- package/scripts/audit/core/checks/dependencies.cjs +0 -994
- package/scripts/audit/core/checks/documentation.cjs +0 -268
- package/scripts/audit/core/checks/environment.cjs +0 -116
- package/scripts/audit/core/checks/error-handling.cjs +0 -340
- package/scripts/audit/core/checks/forms.cjs +0 -172
- package/scripts/audit/core/checks/heuristics.cjs +0 -68
- package/scripts/audit/core/checks/hooks.cjs +0 -334
- package/scripts/audit/core/checks/imports.cjs +0 -244
- package/scripts/audit/core/checks/performance.cjs +0 -325
- package/scripts/audit/core/checks/routes.cjs +0 -117
- package/scripts/audit/core/checks/state.cjs +0 -130
- package/scripts/audit/core/checks/structure.cjs +0 -65
- package/scripts/audit/core/checks/style.cjs +0 -584
- package/scripts/audit/core/checks/testing.cjs +0 -122
- package/scripts/audit/core/checks/typescript.cjs +0 -61
- package/scripts/audit/core/scanner.cjs +0 -199
- package/scripts/audit/core/utils.cjs +0 -137
- package/scripts/audit/index.cjs +0 -223
- package/scripts/audit/reporters/console.cjs +0 -151
- package/scripts/audit/reporters/json.cjs +0 -54
- package/scripts/audit/reporters/markdown.cjs +0 -124
- package/scripts/audit-consuming-app.cjs +0 -86
- package/src/components/DataTable/components/DataTableBody.tsx +0 -454
- package/src/components/DataTable/components/DraggableColumnHeader.tsx +0 -156
- package/src/components/DataTable/components/ExpandButton.tsx +0 -113
- package/src/components/DataTable/components/GroupHeader.tsx +0 -54
- package/src/components/DataTable/components/ViewRowModal.tsx +0 -68
- package/src/components/DataTable/components/VirtualizedDataTable.tsx +0 -525
- package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +0 -462
- package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +0 -393
- package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +0 -476
- package/src/components/DataTable/components/__tests__/VirtualizedDataTable.test.tsx +0 -128
- package/src/components/DataTable/core/DataTableContext.tsx +0 -216
- package/src/components/DataTable/core/__tests__/DataTableContext.test.tsx +0 -136
- package/src/components/DataTable/hooks/__tests__/useColumnReordering.test.ts +0 -570
- package/src/components/DataTable/hooks/useColumnReordering.ts +0 -123
- package/src/components/DataTable/utils/debugTools.ts +0 -514
- package/src/eslint-rules/pace-core-compliance.js +0 -638
- package/src/rbac/components/EnhancedNavigationMenu.test.tsx +0 -555
- package/src/rbac/components/EnhancedNavigationMenu.tsx +0 -293
- package/src/rbac/components/NavigationProvider.test.tsx +0 -481
- package/src/rbac/components/NavigationProvider.tsx +0 -345
- package/src/rbac/components/PagePermissionProvider.test.tsx +0 -476
- package/src/rbac/components/PagePermissionProvider.tsx +0 -279
- package/src/rbac/components/PermissionEnforcer.tsx +0 -312
- package/src/rbac/components/RoleBasedRouter.tsx +0 -440
- package/src/rbac/components/SecureDataProvider.test.tsx +0 -543
- package/src/rbac/components/SecureDataProvider.tsx +0 -339
- package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +0 -620
- package/src/rbac/components/__tests__/NavigationProvider.test.tsx +0 -726
- package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +0 -661
- package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +0 -881
- package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +0 -783
- package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +0 -645
- package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +0 -659
- package/src/rbac/hooks/permissions/useCachedPermissions.ts +0 -79
- package/src/rbac/hooks/permissions/useHasAllPermissions.ts +0 -90
- package/src/rbac/hooks/permissions/useHasAnyPermission.ts +0 -90
|
@@ -1,331 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: Enforce pace-core usage patterns and prevent custom solutions when pace-core provides functionality
|
|
3
|
-
globs: ["src/**/*.{ts,tsx,js,jsx}"]
|
|
4
|
-
alwaysApply: false
|
|
5
|
-
paceCoreVersion: "0.6.x"
|
|
6
|
-
rulesVersion: "2025-01-28"
|
|
7
|
-
---
|
|
8
|
-
# pace-core Compliance Guide
|
|
9
|
-
|
|
10
|
-
This guide ensures consuming apps use pace-core components, hooks, and utilities correctly, preventing duplication and maintaining consistency across the PACE suite.
|
|
11
|
-
|
|
12
|
-
## MUST: Use pace-core Instead of Custom Solutions
|
|
13
|
-
|
|
14
|
-
**You MUST use pace-core components, hooks, and utilities when they exist.** Creating custom solutions duplicates functionality and breaks consistency.
|
|
15
|
-
|
|
16
|
-
### Components
|
|
17
|
-
|
|
18
|
-
**MUST use pace-core components:**
|
|
19
|
-
- `Button`, `Card`, `Input`, `Label`, `Textarea` - Basic UI components
|
|
20
|
-
- `Dialog`, `Select`, `Tabs`, `Calendar`, `Toast`, `Tooltip` - Advanced UI components
|
|
21
|
-
- `DataTable` - Complex data tables with RBAC integration
|
|
22
|
-
- `Form`, `FormField`, `LoginForm` - Form components
|
|
23
|
-
- `Header`, `Footer`, `PaceAppLayout` - Layout components
|
|
24
|
-
- `FileUpload`, `FileDisplay` - Storage components
|
|
25
|
-
|
|
26
|
-
**MUST NOT:**
|
|
27
|
-
- Create custom button components when `Button` from pace-core exists
|
|
28
|
-
- Use native HTML elements (`<button>`, `<input>`) when pace-core provides components
|
|
29
|
-
- Import directly from `@radix-ui/*` - Use pace-core wrappers instead
|
|
30
|
-
- Import directly from `lucide-react` - Use pace-core components that include icons
|
|
31
|
-
|
|
32
|
-
**Example:**
|
|
33
|
-
```tsx
|
|
34
|
-
// ❌ WRONG: <button className="btn">Click me</button>
|
|
35
|
-
// ✅ CORRECT: import { Button } from '@jmruthers/pace-core'; <Button>Click me</Button>
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
### Hooks
|
|
39
|
-
|
|
40
|
-
**MUST use pace-core hooks:**
|
|
41
|
-
- `useUnifiedAuth`, `useEvents`, `useOrganisations` - Authentication and data
|
|
42
|
-
- `usePermissions`, `useCan`, `useSecureSupabase` - RBAC hooks
|
|
43
|
-
- `useToast`, `useDebounce`, `useZodForm` - Utility hooks
|
|
44
|
-
- `useFileReference`, `useFileUpload` - File management hooks
|
|
45
|
-
|
|
46
|
-
**MUST NOT:**
|
|
47
|
-
- Create custom `useAuth` when `useUnifiedAuth` exists
|
|
48
|
-
- Create custom `useToast` when pace-core provides it
|
|
49
|
-
- Create custom `useDebounce` when pace-core provides it
|
|
50
|
-
- Create custom form hooks when `useZodForm` exists
|
|
51
|
-
|
|
52
|
-
**Example:**
|
|
53
|
-
```tsx
|
|
54
|
-
// ❌ WRONG: Custom useDebounce hook implementation
|
|
55
|
-
// ✅ CORRECT: import { useDebounce } from '@jmruthers/pace-core'; const debouncedValue = useDebounce(value, 500);
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
### Utilities
|
|
59
|
-
|
|
60
|
-
**MUST use pace-core utilities:**
|
|
61
|
-
- `cn` - Class name utility (replaces clsx/tailwind-merge)
|
|
62
|
-
- `formatDate`, `formatTime`, `formatDateTime` - Date formatting
|
|
63
|
-
- `formatCurrency`, `formatNumber`, `formatPercent` - Number formatting
|
|
64
|
-
- `emailSchema`, `nameSchema`, `passwordSchema` - Validation schemas
|
|
65
|
-
- `validateUserInput`, `sanitizeUserInput` - Input validation
|
|
66
|
-
|
|
67
|
-
**MUST NOT:**
|
|
68
|
-
- Create custom `formatDate` when pace-core provides it
|
|
69
|
-
- Use `clsx` directly - Use `cn` from pace-core
|
|
70
|
-
- Create custom validation when pace-core schemas exist
|
|
71
|
-
|
|
72
|
-
**Example:**
|
|
73
|
-
```tsx
|
|
74
|
-
// ❌ WRONG: Custom formatDate implementation
|
|
75
|
-
// ✅ CORRECT: import { formatDate } from '@jmruthers/pace-core'; const formatted = formatDate(date);
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
## MUST: Use Secure Supabase Client
|
|
79
|
-
|
|
80
|
-
**You MUST use `useSecureSupabase()` for all database operations.** Never use the base Supabase client directly.
|
|
81
|
-
|
|
82
|
-
**CRITICAL SECURITY REQUIREMENT:** Using `createClient()` from `@supabase/supabase-js` directly bypasses organisation context enforcement and RLS policies, which can lead to:
|
|
83
|
-
- Cross-organisation data access
|
|
84
|
-
- Security vulnerabilities
|
|
85
|
-
- Data leakage between organisations
|
|
86
|
-
|
|
87
|
-
```tsx
|
|
88
|
-
// ❌ WRONG: Direct Supabase client creation
|
|
89
|
-
import { createClient } from '@supabase/supabase-js';
|
|
90
|
-
const supabase = createClient(url, key);
|
|
91
|
-
// This bypasses organisation context and RLS policies!
|
|
92
|
-
|
|
93
|
-
// ✅ CORRECT: Use secure Supabase client
|
|
94
|
-
import { useSecureSupabase } from '@jmruthers/pace-core/rbac';
|
|
95
|
-
const secureSupabase = useSecureSupabase();
|
|
96
|
-
// Organisation context is automatically enforced
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
### Detection and Enforcement
|
|
100
|
-
|
|
101
|
-
pace-core provides multiple layers of protection:
|
|
102
|
-
|
|
103
|
-
1. **ESLint Rule**: The `no-direct-supabase-client` rule detects `createClient` calls and reports errors
|
|
104
|
-
2. **Runtime Warnings**: Development mode warnings when insecure clients are detected
|
|
105
|
-
3. **Type Safety**: Use `isSecureClient()` to verify clients are secure
|
|
106
|
-
|
|
107
|
-
```tsx
|
|
108
|
-
// Verify client is secure (optional, but recommended)
|
|
109
|
-
import { isSecureClient, warnIfInsecureClient } from '@jmruthers/pace-core/rbac/utils/clientSecurity';
|
|
110
|
-
|
|
111
|
-
const supabase = useSecureSupabase();
|
|
112
|
-
warnIfInsecureClient(supabase, 'MyComponent'); // Warns in dev if insecure
|
|
113
|
-
|
|
114
|
-
if (isSecureClient(supabase)) {
|
|
115
|
-
// Client is secure, safe to use
|
|
116
|
-
}
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
## MUST: Setup RBAC Before Use
|
|
120
|
-
|
|
121
|
-
**You MUST call `setupRBAC()` before any RBAC usage.** This is non-negotiable.
|
|
122
|
-
|
|
123
|
-
```tsx
|
|
124
|
-
// main.tsx - MUST be first
|
|
125
|
-
import { setupRBAC } from '@jmruthers/pace-core/rbac';
|
|
126
|
-
setupRBAC(supabase);
|
|
127
|
-
// Then render app
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
## MUST: Read Documentation Before Using Components
|
|
131
|
-
|
|
132
|
-
**You MUST read pace-core component documentation before using any component.** Never guess about props, usage patterns, or behavior.
|
|
133
|
-
|
|
134
|
-
### Where to Find Documentation
|
|
135
|
-
|
|
136
|
-
**Component API Reference:**
|
|
137
|
-
- Location: `node_modules/@jmruthers/pace-core/docs/api-reference/components.md`
|
|
138
|
-
- Or: Check pace-core repository `packages/core/docs/api-reference/components.md`
|
|
139
|
-
- Contains: Complete prop definitions, type information, usage examples
|
|
140
|
-
|
|
141
|
-
**Implementation Guides:**
|
|
142
|
-
- Location: `node_modules/@jmruthers/pace-core/docs/implementation-guides/`
|
|
143
|
-
- Contains: Detailed guides for complex components like DataTable, Forms, etc.
|
|
144
|
-
- Examples:
|
|
145
|
-
- `data-tables.md` - DataTable component guide
|
|
146
|
-
- `forms.md` - Form components guide
|
|
147
|
-
- `file-upload-storage.md` - FileUpload/FileDisplay guide
|
|
148
|
-
|
|
149
|
-
**Detailed API Documentation:**
|
|
150
|
-
- Location: `node_modules/@jmruthers/pace-core/docs/api/`
|
|
151
|
-
- Contains: In-depth API documentation for all exports
|
|
152
|
-
|
|
153
|
-
**Quick Reference:**
|
|
154
|
-
- Location: `node_modules/@jmruthers/pace-core/docs/getting-started/quick-reference.md`
|
|
155
|
-
- Contains: Quick lookup for common patterns
|
|
156
|
-
|
|
157
|
-
### How to Find Component-Specific Docs
|
|
158
|
-
|
|
159
|
-
1. **Check API Reference First:**
|
|
160
|
-
```bash
|
|
161
|
-
# In your consuming app
|
|
162
|
-
cat node_modules/@jmruthers/pace-core/docs/api-reference/components.md
|
|
163
|
-
```
|
|
164
|
-
|
|
165
|
-
2. **Search Implementation Guides:**
|
|
166
|
-
- Look for component name in `implementation-guides/` directory
|
|
167
|
-
- Complex components have dedicated guides
|
|
168
|
-
|
|
169
|
-
3. **Check Type Definitions:**
|
|
170
|
-
```tsx
|
|
171
|
-
// Import and check TypeScript types
|
|
172
|
-
import type { DataTableProps } from '@jmruthers/pace-core';
|
|
173
|
-
// Hover over type to see prop definitions
|
|
174
|
-
```
|
|
175
|
-
|
|
176
|
-
4. **Use IDE IntelliSense:**
|
|
177
|
-
- TypeScript types provide inline documentation
|
|
178
|
-
- Hover over component name to see prop types
|
|
179
|
-
- Use autocomplete to discover available props
|
|
180
|
-
|
|
181
|
-
### MUST NOT: Guess About Props or Usage
|
|
182
|
-
|
|
183
|
-
**❌ WRONG - Guessing props:**
|
|
184
|
-
```tsx
|
|
185
|
-
<DataTable data={data} columns={columns} /> // Missing required rbac prop
|
|
186
|
-
```
|
|
187
|
-
|
|
188
|
-
**✅ CORRECT - Read documentation first:**
|
|
189
|
-
```tsx
|
|
190
|
-
import { DataTable } from '@jmruthers/pace-core';
|
|
191
|
-
<DataTable data={data} columns={columns} rbac={{ pageName: 'users' }} features={{ search: true }} />
|
|
192
|
-
```
|
|
193
|
-
|
|
194
|
-
### Documentation Checklist
|
|
195
|
-
|
|
196
|
-
Before using any pace-core component:
|
|
197
|
-
- [ ] Read component API reference
|
|
198
|
-
- [ ] Check for implementation guide if component is complex
|
|
199
|
-
- [ ] Review TypeScript types for prop definitions
|
|
200
|
-
- [ ] Check examples in documentation
|
|
201
|
-
- [ ] Verify required vs optional props
|
|
202
|
-
- [ ] Understand component behavior and limitations
|
|
203
|
-
|
|
204
|
-
### Common Documentation Locations
|
|
205
|
-
|
|
206
|
-
| Component Type | Documentation Location |
|
|
207
|
-
|----------------|----------------------|
|
|
208
|
-
| Basic UI (Button, Card, etc.) | `api-reference/components.md` |
|
|
209
|
-
| DataTable | `implementation-guides/data-tables.md` |
|
|
210
|
-
| Forms | `implementation-guides/forms.md` |
|
|
211
|
-
| RBAC Components | `rbac/getting-started.md` |
|
|
212
|
-
| File Upload/Display | `implementation-guides/file-upload-storage.md` |
|
|
213
|
-
| Hooks | `api-reference/hooks.md` |
|
|
214
|
-
| Utilities | `api-reference/utilities.md` |
|
|
215
|
-
|
|
216
|
-
## SHOULD: Check pace-core Before Creating New Components
|
|
217
|
-
|
|
218
|
-
**Before creating a new component, hook, or utility:**
|
|
219
|
-
|
|
220
|
-
1. Check pace-core exports: `@jmruthers/pace-core`
|
|
221
|
-
2. Review pace-core documentation
|
|
222
|
-
3. Check `core-usage-manifest.json` for available exports
|
|
223
|
-
4. Search pace-core source if needed
|
|
224
|
-
|
|
225
|
-
**If pace-core doesn't provide what you need:**
|
|
226
|
-
- Consider if it should be added to pace-core (for shared use)
|
|
227
|
-
- Document why custom solution is needed
|
|
228
|
-
- Follow pace-core patterns for consistency
|
|
229
|
-
|
|
230
|
-
## MUST: Use pace-core Providers
|
|
231
|
-
|
|
232
|
-
**You MUST wrap your app with required providers:**
|
|
233
|
-
|
|
234
|
-
```tsx
|
|
235
|
-
import { UnifiedAuthProvider, OrganisationProvider } from '@jmruthers/pace-core';
|
|
236
|
-
<UnifiedAuthProvider supabaseClient={supabase} appName="Your App">
|
|
237
|
-
<OrganisationProvider>{/* Your app */}</OrganisationProvider>
|
|
238
|
-
</UnifiedAuthProvider>
|
|
239
|
-
```
|
|
240
|
-
|
|
241
|
-
## MUST: Import Core Styles
|
|
242
|
-
|
|
243
|
-
**You MUST import pace-core styles:**
|
|
244
|
-
|
|
245
|
-
```tsx
|
|
246
|
-
// main.tsx or App.tsx
|
|
247
|
-
import '@jmruthers/pace-core/styles/core.css';
|
|
248
|
-
```
|
|
249
|
-
|
|
250
|
-
## MUST NOT: Use Inline Styles
|
|
251
|
-
|
|
252
|
-
**You MUST NOT use inline styles (`style={{...}}`).** All styling MUST come from pace-core components and Tailwind classes.
|
|
253
|
-
|
|
254
|
-
### Why No Inline Styles
|
|
255
|
-
|
|
256
|
-
- Inline styles override pace-core component styles
|
|
257
|
-
- Inline styles break consistency across the PACE suite
|
|
258
|
-
- Inline styles are harder to maintain and update
|
|
259
|
-
- Inline styles don't benefit from theme variables and design system
|
|
260
|
-
|
|
261
|
-
### Use pace-core Components for Styling
|
|
262
|
-
|
|
263
|
-
**All styling MUST come from:**
|
|
264
|
-
1. **pace-core components** - Components already have correct styling
|
|
265
|
-
2. **Tailwind utility classes** - Use Tailwind classes for layout and spacing
|
|
266
|
-
3. **Semantic classes** - Use semantic classes from pace-core (e.g., `bg-background`, `text-foreground`)
|
|
267
|
-
|
|
268
|
-
**MUST NOT:**
|
|
269
|
-
- Use `style={{...}}` prop
|
|
270
|
-
- Use inline CSS strings
|
|
271
|
-
- Override component styles with inline styles
|
|
272
|
-
- Create custom CSS for styling that pace-core provides
|
|
273
|
-
|
|
274
|
-
**Example:**
|
|
275
|
-
```tsx
|
|
276
|
-
// ❌ WRONG: <div style={{ backgroundColor: 'blue' }}> or <Button style={{...}}>
|
|
277
|
-
// ✅ CORRECT: <Card className="bg-main-500 p-4"> or <Button variant="default"> or <div className="flex gap-4">
|
|
278
|
-
```
|
|
279
|
-
|
|
280
|
-
### When Tailwind Classes Are Acceptable
|
|
281
|
-
|
|
282
|
-
**Tailwind classes are acceptable for:**
|
|
283
|
-
- Layout (flex, grid, positioning)
|
|
284
|
-
- Spacing (margin, padding, gap)
|
|
285
|
-
- Responsive design (breakpoints)
|
|
286
|
-
- Layout-specific styling not provided by pace-core components
|
|
287
|
-
|
|
288
|
-
**Tailwind classes MUST NOT:**
|
|
289
|
-
- Override pace-core component internal styles
|
|
290
|
-
- Duplicate styling that pace-core components already provide
|
|
291
|
-
- Use standard Tailwind colors (use `main-*`, `sec-*`, `acc-*` namespaces)
|
|
292
|
-
|
|
293
|
-
### Styling Checklist
|
|
294
|
-
|
|
295
|
-
Before adding any styling:
|
|
296
|
-
- [ ] Check if pace-core component provides the styling you need
|
|
297
|
-
- [ ] Use pace-core component variants/props for styling
|
|
298
|
-
- [ ] Use Tailwind classes only for layout/spacing
|
|
299
|
-
- [ ] Never use inline `style={{...}}` prop
|
|
300
|
-
- [ ] Never override component styles with inline styles
|
|
301
|
-
- [ ] Use semantic classes (`bg-background`, `text-foreground`) when available
|
|
302
|
-
|
|
303
|
-
## SHOULD: Use pace-core Patterns
|
|
304
|
-
|
|
305
|
-
**Follow pace-core patterns for consistency:**
|
|
306
|
-
- Component structure and composition
|
|
307
|
-
- Error handling patterns
|
|
308
|
-
- Loading state patterns
|
|
309
|
-
- Form validation patterns
|
|
310
|
-
- RBAC permission checking patterns
|
|
311
|
-
|
|
312
|
-
## Common Mistakes to Avoid
|
|
313
|
-
|
|
314
|
-
1. **Using inline styles** - Never use `style={{...}}`, use pace-core components and Tailwind classes
|
|
315
|
-
2. **Guessing component props** - Always read documentation first
|
|
316
|
-
3. **Creating duplicate components** - Always check pace-core first
|
|
317
|
-
4. **Using base Supabase client** - Always use `useSecureSupabase()`
|
|
318
|
-
5. **Missing RBAC setup** - Always call `setupRBAC()` first
|
|
319
|
-
6. **Missing providers** - Always wrap with required providers
|
|
320
|
-
7. **Missing styles** - Always import core.css
|
|
321
|
-
8. **Direct library imports** - Use pace-core wrappers instead
|
|
322
|
-
|
|
323
|
-
## Reference
|
|
324
|
-
|
|
325
|
-
- **pace-core Exports**: See `pace-core-exports.mdc` for complete export reference
|
|
326
|
-
- **RBAC Implementation**: See `rbac-implementation.mdc` for RBAC patterns
|
|
327
|
-
- **Component Documentation**:
|
|
328
|
-
- API Reference: `node_modules/@jmruthers/pace-core/docs/api-reference/components.md`
|
|
329
|
-
- Implementation Guides: `node_modules/@jmruthers/pace-core/docs/implementation-guides/`
|
|
330
|
-
- Detailed API: `node_modules/@jmruthers/pace-core/docs/api/`
|
|
331
|
-
- **Always read documentation before using components** - Never guess about props or usage
|
|
@@ -1,244 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: Enforce compliance with all pace-core standards across architecture, API, components, code style, security, testing, and RBAC/RLS
|
|
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
|
-
# Standards Compliance Guide
|
|
9
|
-
|
|
10
|
-
This guide ensures consuming apps comply with all pace-core standards. Follow these standards to maintain quality, security, and consistency.
|
|
11
|
-
|
|
12
|
-
## Architecture Standard
|
|
13
|
-
|
|
14
|
-
### MUST: Follow Architecture Principles
|
|
15
|
-
|
|
16
|
-
**MUST adhere to:**
|
|
17
|
-
- Composition over complexity
|
|
18
|
-
- Separation of concerns
|
|
19
|
-
- Domain-agnostic design
|
|
20
|
-
- Extensible, stable APIs
|
|
21
|
-
- Secure by default
|
|
22
|
-
- Performance-conscious
|
|
23
|
-
|
|
24
|
-
### MUST: Use Helper Functions in RLS Policies
|
|
25
|
-
|
|
26
|
-
**RLS policies MUST use helper functions, NEVER subqueries.**
|
|
27
|
-
|
|
28
|
-
```sql
|
|
29
|
-
-- ❌ WRONG: Subquery in RLS policy (causes N+1 queries)
|
|
30
|
-
CREATE POLICY rbac_select_users ON users FOR SELECT USING (
|
|
31
|
-
organisation_id IN (SELECT organisation_id FROM organisation_memberships WHERE user_id = auth.uid())
|
|
32
|
-
);
|
|
33
|
-
|
|
34
|
-
-- ✅ CORRECT: Helper function with STABLE SECURITY DEFINER
|
|
35
|
-
CREATE OR REPLACE FUNCTION get_user_organisation_ids() RETURNS uuid[] LANGUAGE plpgsql STABLE SECURITY DEFINER SET search_path TO public AS $$
|
|
36
|
-
BEGIN RETURN ARRAY(SELECT organisation_id FROM organisation_memberships WHERE user_id = get_effective_user_id()); END;
|
|
37
|
-
$$;
|
|
38
|
-
CREATE POLICY rbac_select_users ON users FOR SELECT USING (organisation_id = ANY(get_user_organisation_ids()));
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
### MUST: Test Database Migrations
|
|
42
|
-
|
|
43
|
-
**MUST verify migrations don't cause query timeouts or performance degradation.**
|
|
44
|
-
|
|
45
|
-
## API & RPC Standard
|
|
46
|
-
|
|
47
|
-
### MUST: Follow RPC Naming Convention
|
|
48
|
-
|
|
49
|
-
**RPCs MUST follow pattern: `<family>_<domain>_<verb>`**
|
|
50
|
-
|
|
51
|
-
- `data_*` prefix for read operations: `data_cake_dishes_list`, `data_file_reference_list`
|
|
52
|
-
- `app_*` prefix for write operations: `app_cake_dish_create`, `app_cake_dish_update`
|
|
53
|
-
- CRUD verbs only: `create`, `read`, `update`, `delete`, `list`, `get`
|
|
54
|
-
- Bulk operations: `_bulk` suffix (e.g., `app_cake_dish_create_bulk`)
|
|
55
|
-
|
|
56
|
-
```sql
|
|
57
|
-
-- ✅ CORRECT: data_cake_dishes_list, app_cake_dish_create, app_cake_dish_create_bulk
|
|
58
|
-
-- ❌ WRONG: getDishes, create_dish (wrong naming pattern)
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
### MUST: Use ApiResult Shape
|
|
62
|
-
|
|
63
|
-
**All RPCs MUST return ApiResult shape:**
|
|
64
|
-
|
|
65
|
-
```typescript
|
|
66
|
-
type ApiResult<T> = { ok: true; data: T } | { ok: false; error: ApiError };
|
|
67
|
-
type ApiError = { code: string; message: string; details?: object };
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
### MUST: Enforce RLS in RPCs
|
|
71
|
-
|
|
72
|
-
**RPCs MUST enforce RLS and tenant boundaries.** Never bypass RLS.
|
|
73
|
-
|
|
74
|
-
### SHOULD: Make Write RPCs Idempotent
|
|
75
|
-
|
|
76
|
-
**Write RPCs SHOULD be idempotent when possible.**
|
|
77
|
-
|
|
78
|
-
## Component Standard
|
|
79
|
-
|
|
80
|
-
### MUST: Follow Component Principles
|
|
81
|
-
|
|
82
|
-
**Components MUST:**
|
|
83
|
-
- Be stateless when possible
|
|
84
|
-
- Use composable structure
|
|
85
|
-
- Be accessible by default
|
|
86
|
-
- Be fully typed
|
|
87
|
-
- Have small surface area
|
|
88
|
-
|
|
89
|
-
### MUST NOT: Add Domain Logic to Components
|
|
90
|
-
|
|
91
|
-
**Components MUST NOT:**
|
|
92
|
-
- Include domain-specific logic
|
|
93
|
-
- Fetch data directly (use hooks/services)
|
|
94
|
-
- Include business workflows
|
|
95
|
-
|
|
96
|
-
### MUST: Ensure Accessibility
|
|
97
|
-
|
|
98
|
-
**Components MUST:**
|
|
99
|
-
- Be keyboard operable
|
|
100
|
-
- Have correct ARIA roles
|
|
101
|
-
- Have visible focus states
|
|
102
|
-
- Avoid inaccessible interactions
|
|
103
|
-
|
|
104
|
-
## Code Style Standard
|
|
105
|
-
|
|
106
|
-
### MUST: Follow TypeScript Rules
|
|
107
|
-
|
|
108
|
-
**MUST:**
|
|
109
|
-
- Use strict mode (`strict: true` in tsconfig)
|
|
110
|
-
- Prefer discriminated unions
|
|
111
|
-
- Use ReadonlyArray where possible
|
|
112
|
-
- Avoid boolean mode flags (use unions instead)
|
|
113
|
-
|
|
114
|
-
**MUST NOT:**
|
|
115
|
-
- Use `any` (use `unknown` if type is truly unknown)
|
|
116
|
-
- Use implicit any
|
|
117
|
-
- Use unnecessary type assertions
|
|
118
|
-
|
|
119
|
-
### MUST: Follow Naming Conventions
|
|
120
|
-
|
|
121
|
-
- Hooks: `useSomething`
|
|
122
|
-
- Providers: `SomethingProvider`
|
|
123
|
-
- Utilities: `camelCase`
|
|
124
|
-
- Components: `PascalCase`
|
|
125
|
-
|
|
126
|
-
### SHOULD: Use Preferred Patterns
|
|
127
|
-
|
|
128
|
-
**SHOULD:**
|
|
129
|
-
- Use pure functions
|
|
130
|
-
- Prefer composition over inheritance
|
|
131
|
-
- Use early returns
|
|
132
|
-
- Extract large functions into small helpers
|
|
133
|
-
|
|
134
|
-
## Security Standard
|
|
135
|
-
|
|
136
|
-
### MUST: Never Bypass RLS
|
|
137
|
-
|
|
138
|
-
**MUST enforce RLS on all tables.** Never bypass RLS policies.
|
|
139
|
-
|
|
140
|
-
### MUST: Validate All Inputs
|
|
141
|
-
|
|
142
|
-
**MUST validate all inputs using Zod schemas or similar.**
|
|
143
|
-
|
|
144
|
-
### MUST: Sanitize Logs
|
|
145
|
-
|
|
146
|
-
**MUST NOT log:**
|
|
147
|
-
- Passwords
|
|
148
|
-
- Tokens
|
|
149
|
-
- Sensitive data (PII)
|
|
150
|
-
|
|
151
|
-
**MAY log:**
|
|
152
|
-
- IDs
|
|
153
|
-
- Non-PII metadata
|
|
154
|
-
|
|
155
|
-
### MUST: Use Safe Error Messaging
|
|
156
|
-
|
|
157
|
-
**MUST NOT expose internal details in error messages.**
|
|
158
|
-
|
|
159
|
-
### MUST: Use Helper Functions in RLS
|
|
160
|
-
|
|
161
|
-
**RLS policies MUST use STABLE SECURITY DEFINER helper functions:**
|
|
162
|
-
- `STABLE` - Results consistent within transaction
|
|
163
|
-
- `SECURITY DEFINER` - Bypass RLS to avoid recursion
|
|
164
|
-
- `SET search_path TO 'public'` - Prevent search path injection
|
|
165
|
-
|
|
166
|
-
## Testing Standard
|
|
167
|
-
|
|
168
|
-
### MUST: Meet Coverage Requirements
|
|
169
|
-
|
|
170
|
-
**MUST achieve:**
|
|
171
|
-
- ≥90% coverage for utils & hooks
|
|
172
|
-
- ≥70% coverage for components
|
|
173
|
-
|
|
174
|
-
### MUST: Use React Testing Library
|
|
175
|
-
|
|
176
|
-
**MUST use React Testing Library + userEvent for component tests.**
|
|
177
|
-
|
|
178
|
-
### SHOULD: Colocate Tests
|
|
179
|
-
|
|
180
|
-
**Tests SHOULD be colocated: `*.test.ts` or `*.test.tsx`**
|
|
181
|
-
|
|
182
|
-
### SHOULD: Test Critical Paths
|
|
183
|
-
|
|
184
|
-
**SHOULD test:**
|
|
185
|
-
- Key user interactions
|
|
186
|
-
- Error handling
|
|
187
|
-
- Edge cases
|
|
188
|
-
- Critical business logic
|
|
189
|
-
|
|
190
|
-
## RBAC & RLS Standard
|
|
191
|
-
|
|
192
|
-
### MUST: Use Helper Functions
|
|
193
|
-
|
|
194
|
-
**All RLS policies MUST use helper functions with:**
|
|
195
|
-
- `STABLE` attribute
|
|
196
|
-
- `SECURITY DEFINER` attribute
|
|
197
|
-
- `SET search_path TO 'public'`
|
|
198
|
-
|
|
199
|
-
### MUST: Follow Policy Naming
|
|
200
|
-
|
|
201
|
-
**RLS policies MUST follow pattern: `rbac_{operation}_{table_name}_{scope}`**
|
|
202
|
-
|
|
203
|
-
Example: `rbac_select_users_organisation`
|
|
204
|
-
|
|
205
|
-
### MUST: Include Organisation Context
|
|
206
|
-
|
|
207
|
-
**RLS policies MUST include `organisation_id` for multi-tenant isolation.**
|
|
208
|
-
|
|
209
|
-
### MUST: Include Super Admin Checks
|
|
210
|
-
|
|
211
|
-
**RLS policies SHOULD include super admin checks where appropriate.**
|
|
212
|
-
|
|
213
|
-
## Standards Precedence
|
|
214
|
-
|
|
215
|
-
When standards conflict, follow this order:
|
|
216
|
-
1. Security Standard (highest priority)
|
|
217
|
-
2. API & RPC Standard
|
|
218
|
-
3. Component Standard
|
|
219
|
-
4. Code Style Standard
|
|
220
|
-
5. Testing Standard
|
|
221
|
-
6. Documentation Standard
|
|
222
|
-
|
|
223
|
-
## Compliance Checklist
|
|
224
|
-
|
|
225
|
-
Before committing code, verify:
|
|
226
|
-
- [ ] RLS policies use helper functions (no subqueries)
|
|
227
|
-
- [ ] RPCs follow naming convention
|
|
228
|
-
- [ ] Components are accessible and typed
|
|
229
|
-
- [ ] No `any` types used
|
|
230
|
-
- [ ] Inputs are validated
|
|
231
|
-
- [ ] Tests meet coverage requirements
|
|
232
|
-
- [ ] No sensitive data in logs
|
|
233
|
-
- [ ] Error messages are safe
|
|
234
|
-
|
|
235
|
-
## Reference
|
|
236
|
-
|
|
237
|
-
See `packages/core/docs/standards/` for complete standards documentation:
|
|
238
|
-
- 01-architecture-standard.md
|
|
239
|
-
- 02-api-and-rpc-standard.md
|
|
240
|
-
- 03-component-standard.md
|
|
241
|
-
- 04-code-style-standard.md
|
|
242
|
-
- 05-security-standard.md
|
|
243
|
-
- 06-testing-and-docs-standard.md
|
|
244
|
-
- 07-rbac-and-rls-standard.md
|