@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,309 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: Enforce code quality standards including TypeScript, ESLint, formatting, performance, and accessibility
|
|
3
|
-
globs: ["src/**/*.{ts,tsx,js,jsx}"]
|
|
4
|
-
alwaysApply: false
|
|
5
|
-
paceCoreVersion: "0.6.x"
|
|
6
|
-
rulesVersion: "2025-01-28"
|
|
7
|
-
---
|
|
8
|
-
# Code Quality Guide
|
|
9
|
-
|
|
10
|
-
This guide enforces code quality standards to ensure maintainable, performant, and accessible code.
|
|
11
|
-
|
|
12
|
-
## TypeScript Standards
|
|
13
|
-
|
|
14
|
-
### MUST: Use Strict Mode
|
|
15
|
-
|
|
16
|
-
**TypeScript MUST use strict mode:**
|
|
17
|
-
|
|
18
|
-
```json
|
|
19
|
-
// tsconfig.json
|
|
20
|
-
{
|
|
21
|
-
"compilerOptions": {
|
|
22
|
-
"strict": true,
|
|
23
|
-
"noImplicitAny": true,
|
|
24
|
-
"strictNullChecks": true,
|
|
25
|
-
"strictFunctionTypes": true,
|
|
26
|
-
"strictBindCallApply": true,
|
|
27
|
-
"strictPropertyInitialization": true,
|
|
28
|
-
"noImplicitThis": true,
|
|
29
|
-
"alwaysStrict": true
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
### MUST NOT: Use `any`
|
|
35
|
-
|
|
36
|
-
**MUST NOT use `any` type. Use `unknown` if type is truly unknown:**
|
|
37
|
-
|
|
38
|
-
```tsx
|
|
39
|
-
// ❌ WRONG: Using any
|
|
40
|
-
function processData(data: any) { return data.value; }
|
|
41
|
-
|
|
42
|
-
// ✅ CORRECT: Using unknown with type guard or proper types
|
|
43
|
-
function processData(data: unknown) {
|
|
44
|
-
if (typeof data === 'object' && data !== null && 'value' in data) {
|
|
45
|
-
return (data as { value: string }).value;
|
|
46
|
-
}
|
|
47
|
-
throw new Error('Invalid data');
|
|
48
|
-
}
|
|
49
|
-
// Or: interface Data { value: string; } function processData(data: Data) { return data.value; }
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
### MUST: Use Discriminated Unions
|
|
53
|
-
|
|
54
|
-
**MUST use discriminated unions instead of boolean flags:**
|
|
55
|
-
|
|
56
|
-
```tsx
|
|
57
|
-
// ❌ WRONG: Boolean flags (confusing: what if both are true?)
|
|
58
|
-
interface User { isAdmin: boolean; isGuest: boolean; }
|
|
59
|
-
|
|
60
|
-
// ✅ CORRECT: Discriminated union
|
|
61
|
-
type User = { type: 'admin'; permissions: Permission[] } | { type: 'guest'; limitedAccess: boolean } | { type: 'user'; role: UserRole };
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
### SHOULD: Use ReadonlyArray
|
|
65
|
-
|
|
66
|
-
**SHOULD use ReadonlyArray for immutable arrays:**
|
|
67
|
-
|
|
68
|
-
```tsx
|
|
69
|
-
// ✅ CORRECT - ReadonlyArray
|
|
70
|
-
function processItems(items: ReadonlyArray<Item>) {
|
|
71
|
-
// Can't mutate items
|
|
72
|
-
return items.map(item => transform(item));
|
|
73
|
-
}
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
## ESLint Configuration
|
|
77
|
-
|
|
78
|
-
### MUST: Use pace-core ESLint Config
|
|
79
|
-
|
|
80
|
-
**MUST extend pace-core ESLint configuration:**
|
|
81
|
-
|
|
82
|
-
```javascript
|
|
83
|
-
// eslint.config.js
|
|
84
|
-
import paceCoreConfig from '@jmruthers/pace-core/eslint-config';
|
|
85
|
-
|
|
86
|
-
export default [
|
|
87
|
-
...paceCoreConfig,
|
|
88
|
-
// Your additional config
|
|
89
|
-
];
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
### MUST: Fix ESLint Errors
|
|
93
|
-
|
|
94
|
-
**MUST fix all ESLint errors before committing:**
|
|
95
|
-
|
|
96
|
-
```bash
|
|
97
|
-
npm run lint
|
|
98
|
-
npm run lint:fix # Auto-fix where possible
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
## Code Formatting
|
|
102
|
-
|
|
103
|
-
### MUST: Use Consistent Formatting
|
|
104
|
-
|
|
105
|
-
**MUST use Prettier or equivalent for consistent formatting:**
|
|
106
|
-
|
|
107
|
-
```json
|
|
108
|
-
// .prettierrc
|
|
109
|
-
{
|
|
110
|
-
"semi": true,
|
|
111
|
-
"singleQuote": true,
|
|
112
|
-
"tabWidth": 2,
|
|
113
|
-
"trailingComma": "es5",
|
|
114
|
-
"printWidth": 100
|
|
115
|
-
}
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
### MUST: Format Before Committing
|
|
119
|
-
|
|
120
|
-
**MUST format code before committing:**
|
|
121
|
-
|
|
122
|
-
```bash
|
|
123
|
-
npm run format
|
|
124
|
-
# Or use pre-commit hook
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
## Performance Considerations
|
|
128
|
-
|
|
129
|
-
### SHOULD: Optimize Re-renders
|
|
130
|
-
|
|
131
|
-
**SHOULD use React.memo, useMemo, useCallback appropriately:**
|
|
132
|
-
|
|
133
|
-
```tsx
|
|
134
|
-
// ✅ CORRECT: Memoize expensive computations, callbacks, and components
|
|
135
|
-
const expensiveValue = useMemo(() => computeExpensiveValue(data), [data]);
|
|
136
|
-
const handleClick = useCallback(() => doSomething(id), [id]);
|
|
137
|
-
const ExpensiveComponent = React.memo(({ data }) => <div>{/* ... */}</div>);
|
|
138
|
-
```
|
|
139
|
-
|
|
140
|
-
### SHOULD: Avoid Unnecessary Re-renders
|
|
141
|
-
|
|
142
|
-
**SHOULD avoid causing unnecessary re-renders:**
|
|
143
|
-
|
|
144
|
-
```tsx
|
|
145
|
-
// ❌ WRONG: New object on every render (causes unnecessary re-renders)
|
|
146
|
-
function Component({ items }) { const config = { items, enabled: true }; return <Child config={config} />; }
|
|
147
|
-
|
|
148
|
-
// ✅ CORRECT: Memoize object
|
|
149
|
-
function Component({ items }) {
|
|
150
|
-
const config = useMemo(() => ({ items, enabled: true }), [items]);
|
|
151
|
-
return <Child config={config} />;
|
|
152
|
-
}
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
### SHOULD: Lazy Load Heavy Components
|
|
156
|
-
|
|
157
|
-
**SHOULD lazy load heavy components:**
|
|
158
|
-
|
|
159
|
-
```tsx
|
|
160
|
-
// ✅ CORRECT: Lazy load heavy components
|
|
161
|
-
import { lazy, Suspense } from 'react';
|
|
162
|
-
const HeavyComponent = lazy(() => import('./HeavyComponent'));
|
|
163
|
-
function App() {
|
|
164
|
-
return <Suspense fallback={<Loading />}><HeavyComponent /></Suspense>;
|
|
165
|
-
}
|
|
166
|
-
```
|
|
167
|
-
|
|
168
|
-
## Accessibility Requirements
|
|
169
|
-
|
|
170
|
-
### MUST: Use Semantic HTML
|
|
171
|
-
|
|
172
|
-
**MUST use semantic HTML elements:**
|
|
173
|
-
|
|
174
|
-
```tsx
|
|
175
|
-
// ❌ WRONG: Non-semantic (<div onClick={...}>)
|
|
176
|
-
// ✅ CORRECT: Semantic HTML (<button onClick={...}>)
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
### MUST: Provide ARIA Labels
|
|
180
|
-
|
|
181
|
-
**MUST provide ARIA labels for interactive elements:**
|
|
182
|
-
|
|
183
|
-
```tsx
|
|
184
|
-
// ✅ CORRECT: Provide ARIA labels for interactive elements
|
|
185
|
-
<button aria-label="Close dialog">×</button>
|
|
186
|
-
<input aria-label="Search" type="search" />
|
|
187
|
-
```
|
|
188
|
-
|
|
189
|
-
### MUST: Ensure Keyboard Navigation
|
|
190
|
-
|
|
191
|
-
**MUST ensure all interactive elements are keyboard accessible:**
|
|
192
|
-
|
|
193
|
-
```tsx
|
|
194
|
-
// ✅ CORRECT: Ensure keyboard navigation (Enter or Space key)
|
|
195
|
-
<button onClick={handleClick} onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') handleClick(); }}>Click me</button>
|
|
196
|
-
```
|
|
197
|
-
|
|
198
|
-
### MUST: Provide Focus Indicators
|
|
199
|
-
|
|
200
|
-
**MUST provide visible focus indicators:**
|
|
201
|
-
|
|
202
|
-
```tsx
|
|
203
|
-
// ✅ CORRECT: Provide visible focus indicators
|
|
204
|
-
<button className="focus:outline-none focus:ring-2 focus:ring-main-500">Click me</button>
|
|
205
|
-
```
|
|
206
|
-
|
|
207
|
-
## Code Review Checklist
|
|
208
|
-
|
|
209
|
-
**Before submitting code for review, verify:**
|
|
210
|
-
|
|
211
|
-
- [ ] TypeScript strict mode enabled
|
|
212
|
-
- [ ] No `any` types used
|
|
213
|
-
- [ ] ESLint passes with no errors
|
|
214
|
-
- [ ] Code is formatted consistently
|
|
215
|
-
- [ ] Performance optimizations applied where needed
|
|
216
|
-
- [ ] Accessibility requirements met
|
|
217
|
-
- [ ] Semantic HTML used
|
|
218
|
-
- [ ] ARIA labels provided
|
|
219
|
-
- [ ] Keyboard navigation works
|
|
220
|
-
- [ ] Focus indicators visible
|
|
221
|
-
- [ ] Code is readable and maintainable
|
|
222
|
-
- [ ] Comments explain "why", not "what"
|
|
223
|
-
|
|
224
|
-
## Code Complexity
|
|
225
|
-
|
|
226
|
-
### SHOULD: Keep Functions Small
|
|
227
|
-
|
|
228
|
-
**Functions SHOULD be small and focused:**
|
|
229
|
-
|
|
230
|
-
```tsx
|
|
231
|
-
// ❌ WRONG: Large function (100+ lines, multiple responsibilities)
|
|
232
|
-
function processUserData(user) { /* 100+ lines of logic */ }
|
|
233
|
-
|
|
234
|
-
// ✅ CORRECT: Small, focused functions
|
|
235
|
-
function validateUser(user: User): ValidationResult { /* Validation logic */ }
|
|
236
|
-
function transformUser(user: User): TransformedUser { /* Transformation logic */ }
|
|
237
|
-
function processUserData(user: User) {
|
|
238
|
-
const validation = validateUser(user);
|
|
239
|
-
if (!validation.valid) return validation;
|
|
240
|
-
return transformUser(user);
|
|
241
|
-
}
|
|
242
|
-
```
|
|
243
|
-
|
|
244
|
-
### SHOULD: Limit Cyclomatic Complexity
|
|
245
|
-
|
|
246
|
-
**Functions SHOULD have low cyclomatic complexity (< 10):**
|
|
247
|
-
|
|
248
|
-
```tsx
|
|
249
|
-
// ❌ WRONG: High complexity (many nested conditions)
|
|
250
|
-
function processData(data) { if (condition1) { if (condition2) { if (condition3) { /* ... */ } } } }
|
|
251
|
-
|
|
252
|
-
// ✅ CORRECT: Lower complexity (early returns)
|
|
253
|
-
function processData(data) { if (!condition1) return; if (!condition2) return; if (!condition3) return; /* Process */ }
|
|
254
|
-
```
|
|
255
|
-
|
|
256
|
-
## Error Handling
|
|
257
|
-
|
|
258
|
-
### MUST: Handle Errors Gracefully
|
|
259
|
-
|
|
260
|
-
**MUST handle errors and provide user feedback:**
|
|
261
|
-
|
|
262
|
-
```tsx
|
|
263
|
-
// ✅ CORRECT: Handle errors gracefully with user feedback
|
|
264
|
-
try {
|
|
265
|
-
const data = await fetchData();
|
|
266
|
-
setData(data);
|
|
267
|
-
} catch (error) {
|
|
268
|
-
logger.error('Failed to fetch data', error);
|
|
269
|
-
toast.error('Failed to load data. Please try again.');
|
|
270
|
-
}
|
|
271
|
-
```
|
|
272
|
-
|
|
273
|
-
### MUST: Use Type-Safe Error Handling
|
|
274
|
-
|
|
275
|
-
**MUST use type-safe error handling:**
|
|
276
|
-
|
|
277
|
-
```tsx
|
|
278
|
-
// ✅ CORRECT: Type-safe error handling
|
|
279
|
-
function isApiError(error: unknown): error is ApiError {
|
|
280
|
-
return typeof error === 'object' && error !== null && 'code' in error && 'message' in error;
|
|
281
|
-
}
|
|
282
|
-
try {
|
|
283
|
-
await apiCall();
|
|
284
|
-
} catch (error) {
|
|
285
|
-
if (isApiError(error)) handleApiError(error);
|
|
286
|
-
else handleUnknownError(error);
|
|
287
|
-
}
|
|
288
|
-
```
|
|
289
|
-
|
|
290
|
-
## Code Quality Checklist
|
|
291
|
-
|
|
292
|
-
Before committing, verify:
|
|
293
|
-
- [ ] TypeScript strict mode enabled
|
|
294
|
-
- [ ] No `any` types
|
|
295
|
-
- [ ] ESLint passes
|
|
296
|
-
- [ ] Code formatted
|
|
297
|
-
- [ ] Performance optimized
|
|
298
|
-
- [ ] Accessible (semantic HTML, ARIA, keyboard)
|
|
299
|
-
- [ ] Functions are small and focused
|
|
300
|
-
- [ ] Error handling in place
|
|
301
|
-
- [ ] Code is readable
|
|
302
|
-
- [ ] Comments explain "why"
|
|
303
|
-
|
|
304
|
-
## Reference
|
|
305
|
-
|
|
306
|
-
- TypeScript Handbook: https://www.typescriptlang.org/docs/
|
|
307
|
-
- ESLint Rules: pace-core eslint-config
|
|
308
|
-
- React Performance: https://react.dev/learn/render-and-commit
|
|
309
|
-
- Web Accessibility: https://www.w3.org/WAI/
|
|
@@ -1,214 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: Enforce tech stack compliance including Tailwind v4, React 19+, Supabase, and other required technologies
|
|
3
|
-
globs: ["src/**/*.{ts,tsx,js,jsx,css}", "*.config.{ts,js}"]
|
|
4
|
-
alwaysApply: false
|
|
5
|
-
paceCoreVersion: "0.6.x"
|
|
6
|
-
rulesVersion: "2025-01-28"
|
|
7
|
-
---
|
|
8
|
-
# Tech Stack Compliance Guide
|
|
9
|
-
|
|
10
|
-
This guide ensures consuming apps use the correct versions and patterns for all technologies in the PACE stack.
|
|
11
|
-
|
|
12
|
-
## Tailwind CSS v4
|
|
13
|
-
|
|
14
|
-
### MUST: Use Tailwind v4 CSS-First Approach
|
|
15
|
-
|
|
16
|
-
**MUST use Tailwind v4 CSS-first syntax, NOT v3 patterns:**
|
|
17
|
-
|
|
18
|
-
```css
|
|
19
|
-
/* ✅ CORRECT: Tailwind v4 CSS-first (@import 'tailwindcss'; @theme { ... }) */
|
|
20
|
-
/* ❌ WRONG: Tailwind v3 (@tailwind base/components/utilities directives) */
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
### MUST NOT: Use Bracket Syntax
|
|
24
|
-
|
|
25
|
-
**MUST NOT use bracket syntax like `bg-[oklch(...)]`. Map everything through theme variables:**
|
|
26
|
-
|
|
27
|
-
```tsx
|
|
28
|
-
// ❌ WRONG: Bracket syntax (bg-[oklch(...)])
|
|
29
|
-
// ✅ CORRECT: Theme variable (bg-main-500)
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
### MUST: Use Custom Color Namespaces
|
|
33
|
-
|
|
34
|
-
**MUST use custom color namespaces:**
|
|
35
|
-
- `main-*` for primary colors (green, emerald, teal, cyan, sky, blue)
|
|
36
|
-
- `sec-*` for secondary colors (indigo, violet, purple, fuchsia, slate, gray, zinc, neutral, stone)
|
|
37
|
-
- `acc-*` for accent colors (red, orange, amber, yellow, lime, pink, rose)
|
|
38
|
-
|
|
39
|
-
```tsx
|
|
40
|
-
// ✅ CORRECT: Custom namespaces (main-*, sec-*, acc-*)
|
|
41
|
-
// ❌ WRONG: Standard Tailwind colors (blue-*, gray-*, red-*)
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
### MUST: Use Semantic Classes
|
|
45
|
-
|
|
46
|
-
**MUST use semantic classes mapped in index.css:**
|
|
47
|
-
|
|
48
|
-
```tsx
|
|
49
|
-
// ✅ CORRECT - Semantic classes
|
|
50
|
-
<div className="bg-background text-foreground">
|
|
51
|
-
|
|
52
|
-
// ❌ WRONG - Direct color classes (unless necessary)
|
|
53
|
-
<div className="bg-main-50 text-main-950">
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
## React 19+
|
|
57
|
-
|
|
58
|
-
### MUST: Use React 19+ Features
|
|
59
|
-
|
|
60
|
-
**MUST use React 19+ patterns:**
|
|
61
|
-
|
|
62
|
-
```tsx
|
|
63
|
-
// ✅ CORRECT: React 19+ features (Suspense, useTransition, etc.)
|
|
64
|
-
import { Suspense, useTransition } from 'react';
|
|
65
|
-
function App() {
|
|
66
|
-
const [isPending, startTransition] = useTransition();
|
|
67
|
-
return <Suspense fallback={<Loading />}><Component /></Suspense>;
|
|
68
|
-
}
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
### MUST: Use Functional Components
|
|
72
|
-
|
|
73
|
-
**MUST use functional components with hooks exclusively:**
|
|
74
|
-
|
|
75
|
-
```tsx
|
|
76
|
-
// ✅ CORRECT: Functional components with hooks
|
|
77
|
-
function MyComponent() { const [state, setState] = useState(); return <div>...</div>; }
|
|
78
|
-
|
|
79
|
-
// ❌ WRONG: Class components
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
## Supabase
|
|
83
|
-
|
|
84
|
-
### MUST: Use Secure Supabase Client
|
|
85
|
-
|
|
86
|
-
**MUST use `useSecureSupabase()` for all database operations:**
|
|
87
|
-
|
|
88
|
-
```tsx
|
|
89
|
-
// ✅ CORRECT: useSecureSupabase() from '@jmruthers/pace-core/rbac'
|
|
90
|
-
// ❌ WRONG: createClient() from '@supabase/supabase-js' (base client)
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
### MUST: Enforce RLS
|
|
94
|
-
|
|
95
|
-
**MUST ensure RLS is enabled on all tables. Never bypass RLS.**
|
|
96
|
-
|
|
97
|
-
### SHOULD: Use RPC Functions
|
|
98
|
-
|
|
99
|
-
**SHOULD use RPC functions for complex queries:**
|
|
100
|
-
|
|
101
|
-
```tsx
|
|
102
|
-
// ✅ CORRECT: RPC functions for complex queries
|
|
103
|
-
const { data } = await secureSupabase.rpc('data_events_list', { organisation_id: orgId });
|
|
104
|
-
|
|
105
|
-
// ❌ AVOID: Complex client-side queries with many joins
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
## TanStack Query
|
|
109
|
-
|
|
110
|
-
### MUST: Use TanStack Query for Server State
|
|
111
|
-
|
|
112
|
-
**MUST use TanStack Query for all server state management:**
|
|
113
|
-
|
|
114
|
-
```tsx
|
|
115
|
-
// ✅ CORRECT: TanStack Query for server state
|
|
116
|
-
import { useQuery, useMutation } from '@tanstack/react-query';
|
|
117
|
-
const { data, isLoading } = useQuery({ queryKey: ['events', orgId], queryFn: () => fetchEvents(orgId) });
|
|
118
|
-
|
|
119
|
-
// ❌ WRONG: useState + useEffect for server state
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
### SHOULD: Configure Query Client
|
|
123
|
-
|
|
124
|
-
**SHOULD configure QueryClient with appropriate defaults:**
|
|
125
|
-
|
|
126
|
-
```tsx
|
|
127
|
-
// ✅ CORRECT: Configure QueryClient with appropriate defaults (staleTime, cacheTime, retry)
|
|
128
|
-
const queryClient = new QueryClient({ defaultOptions: { queries: { staleTime: 5 * 60 * 1000, cacheTime: 10 * 60 * 1000, retry: 1 } } });
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
## React Hook Form + Zod
|
|
132
|
-
|
|
133
|
-
### MUST: Use React Hook Form with Zod
|
|
134
|
-
|
|
135
|
-
**MUST use React Hook Form with Zod for all forms:**
|
|
136
|
-
|
|
137
|
-
```tsx
|
|
138
|
-
// ✅ CORRECT: React Hook Form + Zod (useZodForm from pace-core)
|
|
139
|
-
import { useZodForm } from '@jmruthers/pace-core';
|
|
140
|
-
const schema = z.object({ email: z.string().email(), name: z.string().min(1) });
|
|
141
|
-
const form = useZodForm(schema);
|
|
142
|
-
|
|
143
|
-
// ❌ WRONG: Manual form handling (useState for form state)
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
## Vite
|
|
147
|
-
|
|
148
|
-
### MUST: Use Vite for Build Tooling
|
|
149
|
-
|
|
150
|
-
**MUST use Vite for all build tooling:**
|
|
151
|
-
|
|
152
|
-
```typescript
|
|
153
|
-
// ✅ CORRECT: Vite for build tooling
|
|
154
|
-
import { defineConfig } from 'vite';
|
|
155
|
-
import react from '@vitejs/plugin-react';
|
|
156
|
-
export default defineConfig({ plugins: [react()] });
|
|
157
|
-
```
|
|
158
|
-
|
|
159
|
-
### MUST: Use Environment Variables Correctly
|
|
160
|
-
|
|
161
|
-
**MUST use `import.meta.env` for environment variables:**
|
|
162
|
-
|
|
163
|
-
```tsx
|
|
164
|
-
// ✅ CORRECT: import.meta.env.VITE_API_URL (Vite env vars)
|
|
165
|
-
// ❌ WRONG: process.env.VITE_API_URL (Node.js env vars)
|
|
166
|
-
```
|
|
167
|
-
|
|
168
|
-
## TypeScript
|
|
169
|
-
|
|
170
|
-
### MUST: Use TypeScript 5+
|
|
171
|
-
|
|
172
|
-
**MUST use TypeScript 5+ with strict mode:**
|
|
173
|
-
|
|
174
|
-
```json
|
|
175
|
-
// ✅ CORRECT: TypeScript 5+ with strict mode
|
|
176
|
-
{ "compilerOptions": { "target": "ES2022", "module": "ESNext", "strict": true } }
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
## Version Requirements
|
|
180
|
-
|
|
181
|
-
### MUST: Use Required Versions
|
|
182
|
-
|
|
183
|
-
**MUST use compatible versions:**
|
|
184
|
-
|
|
185
|
-
- React: `^19.0.0`
|
|
186
|
-
- TypeScript: `^5.0.0`
|
|
187
|
-
- Tailwind CSS: `^4.0.0`
|
|
188
|
-
- Vite: `^6.0.0`
|
|
189
|
-
- Supabase: `^2.49.0+`
|
|
190
|
-
|
|
191
|
-
**Check `package.json` for exact versions required by pace-core.**
|
|
192
|
-
|
|
193
|
-
## Tech Stack Checklist
|
|
194
|
-
|
|
195
|
-
Before committing, verify:
|
|
196
|
-
- [ ] Tailwind v4 CSS-first syntax (no @tailwind directives)
|
|
197
|
-
- [ ] No bracket syntax for colors (use theme variables)
|
|
198
|
-
- [ ] Custom color namespaces (main-*, sec-*, acc-*)
|
|
199
|
-
- [ ] React 19+ functional components
|
|
200
|
-
- [ ] Secure Supabase client (useSecureSupabase)
|
|
201
|
-
- [ ] TanStack Query for server state
|
|
202
|
-
- [ ] React Hook Form + Zod for forms
|
|
203
|
-
- [ ] Vite for build tooling
|
|
204
|
-
- [ ] TypeScript 5+ with strict mode
|
|
205
|
-
- [ ] All versions compatible with pace-core
|
|
206
|
-
|
|
207
|
-
## Reference
|
|
208
|
-
|
|
209
|
-
- Tailwind v4: https://tailwindcss.com/blog/tailwindcss-v4
|
|
210
|
-
- React 19: https://react.dev/blog/2024/04/25/react-19-upgrade-guide
|
|
211
|
-
- Supabase: https://supabase.com/docs
|
|
212
|
-
- TanStack Query: https://tanstack.com/query
|
|
213
|
-
- React Hook Form: https://react-hook-form.com
|
|
214
|
-
- Vite: https://vitejs.dev
|
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
# Cursor Rules Changelog
|
|
2
|
-
|
|
3
|
-
All notable changes to pace-core cursor rules will be documented in this file.
|
|
4
|
-
|
|
5
|
-
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
|
-
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
-
|
|
8
|
-
## [Unreleased]
|
|
9
|
-
|
|
10
|
-
### Added
|
|
11
|
-
- **08-markup-quality.mdc** - Enforces clean markup standards, semantic HTML usage, and pace-core component patterns
|
|
12
|
-
|
|
13
|
-
## [1.1.0] - 2025-01-28
|
|
14
|
-
|
|
15
|
-
### Added
|
|
16
|
-
- **08-markup-quality.mdc** - Comprehensive guide for markup quality, semantic HTML, and pace-core component usage patterns
|
|
17
|
-
- Enforces pace-core component usage over custom solutions
|
|
18
|
-
- Prohibits `<div>` elements (except first child of `<body>` in `index.html`)
|
|
19
|
-
- Requires semantic HTML elements (`<main>`, `<section>`, `<article>`, etc.)
|
|
20
|
-
- Prohibits typography styling (relies on pace-core core.css)
|
|
21
|
-
- Requires React Fragments for grouping without semantic meaning
|
|
22
|
-
- Enforces minimal element nesting and clear semantic purpose
|
|
23
|
-
- Includes decision tree and comprehensive checklist
|
|
24
|
-
|
|
25
|
-
## [1.0.0] - 2025-01-15
|
|
26
|
-
|
|
27
|
-
### Added
|
|
28
|
-
- Initial release of cursor rules system
|
|
29
|
-
- 8 comprehensive rule files covering compliance, standards, structure, SOLID, testing, bug reports, code quality, and tech stack
|
|
30
|
-
- Installation script with safety guards
|
|
31
|
-
- Comprehensive audit tool with Phase 1 (deterministic) and Phase 2 (heuristic) checks
|
|
32
|
-
- Markdown report generation with timestamps
|
|
33
|
-
|
|
34
|
-
## [1.0.0] - 2025-01-15
|
|
35
|
-
|
|
36
|
-
### Added
|
|
37
|
-
- **00-pace-core-compliance.mdc** - Enforces pace-core usage patterns
|
|
38
|
-
- **01-standards-compliance.mdc** - Maps to all pace-core standards
|
|
39
|
-
- **02-project-structure.mdc** - Defines standard folder structure
|
|
40
|
-
- **03-solid-principles.mdc** - Enforces SOLID architecture principles
|
|
41
|
-
- **04-testing-standards.mdc** - Enforces testing framework consistency
|
|
42
|
-
- **05-bug-reports-and-features.mdc** - Templates for bug reports and feature requests
|
|
43
|
-
- **06-code-quality.mdc** - Enforces code quality standards
|
|
44
|
-
- **07-tech-stack-compliance.mdc** - Enforces tech stack versions and patterns
|
|
45
|
-
|
|
46
|
-
### Features
|
|
47
|
-
- Opt-in installation script (not automatic postinstall)
|
|
48
|
-
- Safety guards (environment variable, git check)
|
|
49
|
-
- Version tracking in rule files
|
|
50
|
-
- Rule numbering system (pace-core: 00-09, apps: 50+)
|
|
51
|
-
- Targeted globs for efficient rule application
|
|
52
|
-
- MUST/SHOULD/MAY semantics for clear guidance
|
|
53
|
-
- Comprehensive audit tool with markdown reports
|
|
54
|
-
- Phase-based audit approach (deterministic vs heuristic)
|
|
55
|
-
|
|
56
|
-
### Documentation
|
|
57
|
-
- README.md with installation and usage guide
|
|
58
|
-
- Getting started guide in docs
|
|
59
|
-
- Updated standards README with cursor rules section
|
|
60
|
-
|
|
61
|
-
## Migration Guide
|
|
62
|
-
|
|
63
|
-
### From No Rules to Cursor Rules
|
|
64
|
-
|
|
65
|
-
1. Install pace-core (if not already installed):
|
|
66
|
-
```bash
|
|
67
|
-
npm install @jmruthers/pace-core
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
2. Install cursor rules:
|
|
71
|
-
```bash
|
|
72
|
-
node node_modules/@jmruthers/pace-core/scripts/install-cursor-rules.cjs
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
3. Restart Cursor to load rules
|
|
76
|
-
|
|
77
|
-
4. Run audit to check compliance:
|
|
78
|
-
```bash
|
|
79
|
-
node node_modules/@jmruthers/pace-core/scripts/audit-consuming-app.cjs
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
### Updating Rules
|
|
83
|
-
|
|
84
|
-
When pace-core is updated:
|
|
85
|
-
|
|
86
|
-
1. Update pace-core:
|
|
87
|
-
```bash
|
|
88
|
-
npm update @jmruthers/pace-core
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
2. Update rules:
|
|
92
|
-
```bash
|
|
93
|
-
npm run setup:cursor-rules
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
3. Review any changes in rule files
|
|
97
|
-
|
|
98
|
-
### Custom Rules
|
|
99
|
-
|
|
100
|
-
If you have custom rules, number them starting at 50:
|
|
101
|
-
- `50-my-custom-rule.mdc`
|
|
102
|
-
- `51-another-rule.mdc`
|
|
103
|
-
- etc.
|
|
104
|
-
|
|
105
|
-
This ensures pace-core rules (00-09) load first.
|
|
106
|
-
|
|
107
|
-
## Version History
|
|
108
|
-
|
|
109
|
-
- **1.1.0** (2025-01-28) - Added markup quality rule (08-markup-quality.mdc)
|
|
110
|
-
- **1.0.0** (2025-01-15) - Initial release
|
|
111
|
-
|
|
112
|
-
## Future Enhancements
|
|
113
|
-
|
|
114
|
-
Potential future enhancements:
|
|
115
|
-
- CLI for rule validation
|
|
116
|
-
- GitHub Action template for PR audits
|
|
117
|
-
- Rule update notification system
|
|
118
|
-
- Interactive rule configuration
|
|
119
|
-
- Rule effectiveness metrics
|