@jmruthers/pace-core 0.6.5 → 0.6.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +104 -0
- package/README.md +5 -403
- package/audit-tool/00-dependencies.cjs +394 -0
- package/audit-tool/audits/01-pace-core-compliance.cjs +556 -0
- package/audit-tool/audits/02-project-structure.cjs +255 -0
- package/audit-tool/audits/03-architecture.cjs +196 -0
- package/audit-tool/audits/04-code-quality.cjs +149 -0
- package/audit-tool/audits/05-styling.cjs +224 -0
- package/audit-tool/audits/06-security-rbac.cjs +544 -0
- package/audit-tool/audits/07-api-tech-stack.cjs +301 -0
- package/audit-tool/audits/08-testing-documentation.cjs +202 -0
- package/audit-tool/audits/09-operations.cjs +208 -0
- package/audit-tool/index.cjs +291 -0
- package/audit-tool/utils/code-utils.cjs +218 -0
- package/audit-tool/utils/file-utils.cjs +230 -0
- package/audit-tool/utils/report-utils.cjs +241 -0
- package/core-usage-manifest.json +93 -0
- package/cursor-rules/00-standards-overview.mdc +156 -0
- package/cursor-rules/01-pace-core-compliance.mdc +586 -0
- package/cursor-rules/02-project-structure.mdc +42 -4
- package/cursor-rules/{03-solid-principles.mdc → 03-architecture.mdc} +126 -10
- package/cursor-rules/04-code-quality.mdc +419 -0
- package/cursor-rules/{08-markup-quality.mdc → 05-styling.mdc} +104 -34
- package/cursor-rules/06-security-rbac.mdc +518 -0
- package/cursor-rules/07-api-tech-stack.mdc +377 -0
- package/cursor-rules/08-testing-documentation.mdc +324 -0
- package/cursor-rules/09-operations.mdc +365 -0
- package/dist/{AuthService-Cb34EQs3.d.ts → AuthService-DmfO5rGS.d.ts} +10 -0
- package/dist/DataTable-7PMH7XN7.js +15 -0
- package/dist/{DataTable-BMRU8a1j.d.ts → DataTable-DRUIgtUH.d.ts} +1 -1
- package/dist/{PublicPageProvider-QTFVrL-Z.d.ts → PublicPageProvider-DlsCaR5v.d.ts} +33 -72
- package/dist/UnifiedAuthProvider-ZT6TIGM7.js +7 -0
- package/dist/api-Y4MQWOFW.js +4 -0
- package/dist/audit-MYQXYZFU.js +3 -0
- package/dist/{chunk-DGUM43GV.js → chunk-3RG5ZIWI.js} +1 -4
- package/dist/{chunk-QXHPKYJV.js → chunk-4SXLQIZO.js} +1 -26
- package/dist/{chunk-UPPMRMYG.js → chunk-5X4QLXRG.js} +73 -151
- package/dist/chunk-6F3IILHI.js +62 -0
- package/dist/{chunk-E66EQZE6.js → chunk-6GLLNA6U.js} +3 -9
- package/dist/{chunk-ZSAAAMVR.js → chunk-6QYDGKQY.js} +1 -4
- package/dist/{chunk-FMUCXFII.js → chunk-7ILTDCL2.js} +9 -5
- package/dist/{chunk-M43Y4SSO.js → chunk-A3W6LW53.js} +15 -13
- package/dist/{chunk-63FOKYGO.js → chunk-AHU7G2R5.js} +2 -11
- package/dist/{chunk-HU2C6SSC.js → chunk-BM4CQ5P3.js} +606 -559
- package/dist/chunk-C7NSAPTL.js +1 -0
- package/dist/{chunk-J36DSWQK.js → chunk-FEJLJNWA.js} +7 -41
- package/dist/{chunk-IHB5DR3H.js → chunk-FTCRZOG2.js} +188 -387
- package/dist/{chunk-G37KK66H.js → chunk-FYHN4DD5.js} +60 -19
- package/dist/chunk-GHYHJTYV.js +994 -0
- package/dist/{chunk-VBXEHIUJ.js → chunk-HF6O3O37.js} +6 -88
- package/dist/{chunk-FFQEQTNW.js → chunk-IUBRCBSY.js} +134 -45
- package/dist/{chunk-6COVEUS7.js → chunk-JGWDVX64.js} +983 -1034
- package/dist/{chunk-RGAWHO7N.js → chunk-L4XMVJKY.js} +77 -222
- package/dist/chunk-MBADTM7L.js +64 -0
- package/dist/{chunk-M7MPQISP.js → chunk-OJ4SKRSV.js} +3 -16
- package/dist/{chunk-IVOFDYWT.js → chunk-Q7Q7V5NV.js} +2109 -1604
- package/dist/{chunk-JGRYX5UX.js → chunk-S7DKJPLT.js} +29 -58
- package/dist/{chunk-PWLANIRT.js → chunk-TTRFSOKR.js} +1 -7
- package/dist/{chunk-5DRSZLL2.js → chunk-UH3NTO3F.js} +1 -6
- package/dist/{chunk-NTM7ZSB6.js → chunk-VBCS3DUA.js} +261 -168
- package/dist/{chunk-EFN2EIMK.js → chunk-ZFYPMX46.js} +271 -87
- package/dist/{chunk-L4OXEN46.js → chunk-ZKAWKYT4.js} +10 -24
- package/dist/components.d.ts +7 -5
- package/dist/components.js +46 -257
- package/dist/{database.generated-CzIvgcPu.d.ts → database.generated-CcnC_DRc.d.ts} +4795 -3691
- package/dist/eslint-rules/index.cjs +35 -0
- package/{src/eslint-rules/pace-core-compliance.cjs → dist/eslint-rules/rules/01-pace-core-compliance.cjs} +234 -235
- package/dist/eslint-rules/rules/04-code-quality.cjs +290 -0
- package/dist/eslint-rules/rules/05-styling.cjs +61 -0
- package/dist/eslint-rules/rules/06-security-rbac.cjs +806 -0
- package/dist/eslint-rules/rules/07-api-tech-stack.cjs +263 -0
- package/dist/eslint-rules/rules/08-testing.cjs +94 -0
- package/dist/eslint-rules/utils/helpers.cjs +42 -0
- package/dist/eslint-rules/utils/manifest-loader.cjs +75 -0
- package/dist/hooks.d.ts +6 -6
- package/dist/hooks.js +62 -172
- package/dist/icons/index.d.ts +1 -0
- package/dist/icons/index.js +1 -0
- package/dist/index.d.ts +12 -11
- package/dist/index.js +67 -660
- package/dist/providers.d.ts +2 -2
- package/dist/providers.js +8 -35
- package/dist/rbac/eslint-rules.d.ts +46 -44
- package/dist/rbac/eslint-rules.js +7 -4
- package/dist/rbac/index.d.ts +109 -586
- package/dist/rbac/index.js +14 -207
- package/dist/styles/index.js +2 -12
- package/dist/theming/runtime.d.ts +14 -1
- package/dist/theming/runtime.js +3 -19
- package/dist/{timezone-CHhWg6b4.d.ts → timezone-BZe_eUxx.d.ts} +175 -1
- package/dist/{types-CkbwOr4Y.d.ts → types-DXstZpNI.d.ts} +4 -17
- package/dist/types-t9H8qKRw.d.ts +55 -0
- package/dist/types.d.ts +1 -1
- package/dist/types.js +7 -94
- package/dist/{usePublicRouteParams-ClnV4tnv.d.ts → usePublicRouteParams-MamNgwqe.d.ts} +20 -20
- package/dist/utils.d.ts +24 -117
- package/dist/utils.js +54 -392
- package/docs/README.md +17 -7
- package/docs/api/README.md +4 -402
- package/docs/api/modules.md +301 -871
- package/docs/api-reference/components.md +21 -21
- package/docs/api-reference/deprecated.md +31 -6
- package/docs/api-reference/hooks.md +80 -80
- package/docs/api-reference/rpc-functions.md +78 -3
- package/docs/api-reference/types.md +1 -1
- package/docs/api-reference/utilities.md +1 -1
- package/docs/architecture/README.md +1 -1
- package/docs/core-concepts/events.md +3 -3
- package/docs/core-concepts/organisations.md +6 -6
- package/docs/core-concepts/permissions.md +6 -6
- package/docs/documentation-index.md +12 -18
- package/docs/getting-started/cursor-rules.md +3 -23
- package/docs/getting-started/dependencies.md +650 -0
- package/docs/getting-started/documentation-index.md +1 -1
- package/docs/getting-started/examples/README.md +4 -4
- package/docs/getting-started/examples/full-featured-app.md +1 -1
- package/docs/getting-started/faq.md +2 -2
- package/docs/getting-started/installation-guide.md +20 -7
- package/docs/getting-started/quick-reference.md +4 -4
- package/docs/getting-started/quick-start.md +23 -12
- package/docs/implementation-guides/authentication.md +15 -15
- package/docs/implementation-guides/component-styling.md +1 -1
- package/docs/implementation-guides/data-tables.md +126 -33
- package/docs/implementation-guides/datatable-rbac-usage.md +1 -1
- package/docs/implementation-guides/dynamic-colors.md +3 -3
- package/docs/implementation-guides/file-upload-storage.md +2 -2
- package/docs/implementation-guides/hierarchical-datatable.md +40 -60
- package/docs/implementation-guides/inactivity-tracking.md +3 -3
- package/docs/implementation-guides/large-datasets.md +3 -2
- package/docs/implementation-guides/organisation-security.md +2 -2
- package/docs/implementation-guides/performance.md +2 -2
- package/docs/implementation-guides/permission-enforcement.md +5 -1
- package/docs/migration/V0.3.44_organisation-context-timing-fix.md +1 -1
- package/docs/migration/V0.4.0_rbac-migration.md +6 -6
- package/docs/rbac/MIGRATION_GUIDE.md +819 -0
- package/docs/rbac/RBAC_CONTRACT.md +724 -0
- package/docs/rbac/README.md +17 -8
- package/docs/rbac/advanced-patterns.md +6 -6
- package/docs/rbac/api-reference.md +20 -20
- package/docs/rbac/edge-functions-guide.md +376 -0
- package/docs/rbac/event-based-apps.md +3 -3
- package/docs/rbac/examples.md +41 -41
- package/docs/rbac/getting-started.md +37 -37
- package/docs/rbac/performance.md +1 -1
- package/docs/rbac/quick-start.md +52 -52
- package/docs/rbac/secure-client-protection.md +1 -35
- package/docs/rbac/troubleshooting.md +1 -1
- package/docs/security/README.md +5 -5
- package/docs/standards/0-standards-overview.md +220 -0
- package/docs/standards/1-pace-core-compliance-standards.md +986 -0
- package/docs/standards/2-project-structure-standards.md +949 -0
- package/docs/standards/3-architecture-standards.md +606 -0
- package/docs/standards/4-code-quality-standards.md +728 -0
- package/docs/standards/5-styling-standards.md +348 -0
- package/docs/standards/{07-rbac-and-rls-standard.md → 6-security-rbac-standards.md} +269 -66
- package/docs/standards/7-api-tech-stack-standards.md +662 -0
- package/docs/standards/8-testing-documentation-standards.md +401 -0
- package/docs/standards/9-operations-standards.md +1102 -0
- package/docs/standards/README.md +185 -57
- package/docs/troubleshooting/README.md +4 -4
- package/docs/troubleshooting/common-issues.md +2 -2
- package/docs/troubleshooting/debugging.md +9 -9
- package/docs/troubleshooting/migration.md +4 -4
- package/docs/troubleshooting/organisation-context-setup.md +42 -19
- package/eslint-config-pace-core.cjs +33 -6
- package/package.json +35 -23
- package/scripts/install-cursor-rules.cjs +25 -6
- package/scripts/install-eslint-config.cjs +284 -0
- package/src/__tests__/fixtures/supabase.ts +1 -1
- package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +3 -3
- package/src/__tests__/helpers/__tests__/optimized-test-setup.test.ts +1 -1
- package/src/__tests__/helpers/__tests__/supabaseMock.test.ts +1 -1
- package/src/__tests__/helpers/__tests__/test-providers.test.tsx +2 -2
- package/src/__tests__/helpers/__tests__/test-utils.test.tsx +13 -13
- package/src/__tests__/helpers/component-test-utils.tsx +1 -1
- package/src/__tests__/helpers/supabaseMock.ts +2 -2
- package/src/__tests__/integration/UserProfile.test.tsx +14 -14
- package/src/__tests__/public-recipe-view.test.ts +38 -9
- package/src/__tests__/rbac/PagePermissionGuard.test.tsx +6 -6
- package/src/__tests__/templates/accessibility.test.template.tsx +9 -9
- package/src/__tests__/templates/component.test.template.tsx +18 -15
- package/src/components/Button/Button.tsx +5 -1
- package/src/components/Calendar/Calendar.tsx +201 -47
- package/src/components/ContextSelector/ContextSelector.tsx +106 -119
- package/src/components/DataTable/AUDIT_REPORT.md +293 -0
- package/src/components/DataTable/__tests__/DataTableCore.test.tsx +10 -2
- package/src/components/DataTable/__tests__/a11y.basic.test.tsx +10 -4
- package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +9 -9
- package/src/components/DataTable/components/ColumnFilter.tsx +63 -74
- package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +43 -41
- package/src/components/DataTable/components/DataTableCore.tsx +186 -13
- package/src/components/DataTable/components/DataTableErrorBoundary.tsx +9 -11
- package/src/components/DataTable/components/DataTableLayout.tsx +35 -21
- package/src/components/DataTable/components/EditFields.tsx +23 -3
- package/src/components/DataTable/components/EditableRow.tsx +12 -9
- package/src/components/DataTable/components/EmptyState.tsx +10 -9
- package/src/components/DataTable/components/FilterRow.tsx +2 -4
- package/src/components/DataTable/components/ImportModal.tsx +124 -126
- package/src/components/DataTable/components/LoadingState.tsx +5 -6
- package/src/components/DataTable/components/RowComponent.tsx +12 -0
- package/src/components/DataTable/components/SortIndicator.tsx +50 -0
- package/src/components/DataTable/components/__tests__/COVERAGE_NOTE.md +4 -4
- package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +23 -82
- package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +37 -9
- package/src/components/DataTable/components/__tests__/EmptyState.test.tsx +7 -4
- package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +12 -4
- package/src/components/DataTable/components/__tests__/LoadingState.test.tsx +41 -27
- package/src/components/DataTable/components/hooks/usePermissionTracking.ts +0 -4
- package/src/components/DataTable/components/index.ts +2 -1
- package/src/components/DataTable/hooks/__tests__/useDataTableState.test.ts +51 -47
- package/src/components/DataTable/hooks/useDataTablePermissions.ts +24 -21
- package/src/components/DataTable/hooks/useDataTableState.ts +125 -9
- package/src/components/DataTable/hooks/useTableColumns.ts +40 -2
- package/src/components/DataTable/hooks/useTableHandlers.ts +11 -0
- package/src/components/DataTable/types.ts +5 -18
- package/src/components/DataTable/utils/a11yUtils.ts +17 -0
- package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +2 -1
- package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.tsx +11 -15
- package/src/components/DateTimeField/DateTimeField.tsx +10 -9
- package/src/components/Dialog/Dialog.test.tsx +128 -104
- package/src/components/Dialog/Dialog.tsx +742 -24
- package/src/components/ErrorBoundary/ErrorBoundary.tsx +77 -79
- package/src/components/FileDisplay/FileDisplay.test.tsx +4 -2
- package/src/components/FileDisplay/FileDisplay.tsx +23 -17
- package/src/components/FileUpload/FileUpload.test.tsx +52 -14
- package/src/components/FileUpload/FileUpload.tsx +112 -130
- package/src/components/Form/Form.test.tsx +6 -8
- package/src/components/Form/Form.tsx +365 -4
- package/src/components/NavigationMenu/NavigationMenu.test.tsx +14 -13
- package/src/components/NavigationMenu/useNavigationFiltering.ts +11 -21
- package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +6 -4
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +11 -15
- package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +108 -61
- package/src/components/PaceLoginPage/PaceLoginPage.tsx +27 -3
- package/src/components/Progress/Progress.tsx +2 -4
- package/src/components/ProtectedRoute/ProtectedRoute.tsx +8 -8
- package/src/components/Select/Select.tsx +109 -98
- package/src/components/Select/types.ts +4 -1
- package/src/components/UserMenu/UserMenu.tsx +9 -6
- package/src/hooks/__tests__/ServiceHooks.test.tsx +16 -16
- package/src/hooks/__tests__/hooks.integration.test.tsx +55 -57
- package/src/hooks/__tests__/useAppConfig.unit.test.ts +129 -67
- package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +97 -97
- package/src/hooks/__tests__/usePublicEvent.simple.test.ts +149 -67
- package/src/hooks/__tests__/usePublicEvent.test.ts +149 -79
- package/src/hooks/__tests__/usePublicEvent.unit.test.ts +158 -109
- package/src/hooks/__tests__/useSessionDraft.test.ts +163 -0
- package/src/hooks/__tests__/useSessionRestoration.unit.test.tsx +10 -5
- package/src/hooks/public/usePublicEvent.ts +67 -195
- package/src/hooks/public/usePublicEventLogo.test.ts +70 -17
- package/src/hooks/public/usePublicEventLogo.ts +24 -14
- package/src/hooks/public/usePublicFileDisplay.ts +2 -2
- package/src/hooks/public/usePublicRouteParams.ts +5 -5
- package/src/hooks/useAppConfig.ts +28 -26
- package/src/hooks/useEventTheme.test.ts +217 -239
- package/src/hooks/useEventTheme.ts +16 -28
- package/src/hooks/useFileDisplay.ts +2 -2
- package/src/hooks/useOrganisationPermissions.ts +5 -7
- package/src/hooks/useQueryCache.ts +0 -1
- package/src/hooks/useSessionDraft.ts +380 -0
- package/src/hooks/useSessionRestoration.ts +3 -1
- package/src/icons/index.ts +27 -0
- package/src/index.ts +5 -0
- package/src/providers/OrganisationProvider.tsx +23 -14
- package/src/providers/UnifiedAuthProvider.smoke.test.tsx +21 -21
- package/src/providers/__tests__/AuthProvider.test.tsx +21 -21
- package/src/providers/__tests__/EventProvider.test.tsx +61 -61
- package/src/providers/__tests__/InactivityProvider.test.tsx +56 -56
- package/src/providers/__tests__/OrganisationProvider.test.tsx +75 -75
- package/src/providers/__tests__/ProviderLifecycle.test.tsx +37 -37
- package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +103 -103
- package/src/providers/services/EventServiceProvider.tsx +1 -24
- package/src/providers/services/UnifiedAuthProvider.tsx +5 -48
- package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +7 -7
- package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +13 -10
- package/src/rbac/__tests__/adapters.comprehensive.test.tsx +7 -457
- package/src/rbac/__tests__/auth-rbac.e2e.test.tsx +33 -7
- package/src/rbac/adapters.tsx +7 -295
- package/src/rbac/api.test.ts +44 -56
- package/src/rbac/api.ts +10 -17
- package/src/rbac/cache-invalidation.ts +0 -1
- package/src/rbac/compliance/index.ts +10 -0
- package/src/rbac/compliance/pattern-detector.ts +553 -0
- package/src/rbac/compliance/runtime-compliance.ts +22 -0
- package/src/rbac/components/AccessDenied.tsx +150 -0
- package/src/rbac/components/NavigationGuard.tsx +12 -20
- package/src/rbac/components/PagePermissionGuard.tsx +4 -24
- package/src/rbac/components/__tests__/NavigationGuard.test.tsx +21 -8
- package/src/rbac/components/index.ts +3 -41
- package/src/rbac/eslint-rules.js +1 -1
- package/src/rbac/hooks/index.ts +0 -3
- package/src/rbac/hooks/permissions/index.ts +0 -3
- package/src/rbac/hooks/permissions/useAccessLevel.ts +4 -8
- package/src/rbac/hooks/usePermissions.ts +0 -3
- package/src/rbac/hooks/useResolvedScope.test.ts +57 -47
- package/src/rbac/hooks/useResolvedScope.ts +58 -140
- package/src/rbac/hooks/useResourcePermissions.test.ts +124 -38
- package/src/rbac/hooks/useResourcePermissions.ts +139 -48
- package/src/rbac/hooks/useRoleManagement.test.ts +65 -22
- package/src/rbac/hooks/useRoleManagement.ts +147 -19
- package/src/rbac/hooks/useSecureSupabase.ts +4 -8
- package/src/rbac/index.ts +7 -9
- package/src/rbac/utils/contextValidator.ts +9 -7
- package/src/services/AuthService.ts +130 -18
- package/src/services/EventService.ts +4 -97
- package/src/services/InactivityService.ts +16 -0
- package/src/services/OrganisationService.ts +7 -44
- package/src/services/__tests__/OrganisationService.test.ts +26 -8
- package/src/services/base/BaseService.ts +0 -3
- package/src/styles/core.css +7 -0
- package/src/theming/__tests__/parseEventColours.test.ts +9 -3
- package/src/theming/parseEventColours.ts +22 -10
- package/src/types/database.generated.ts +4733 -3809
- package/src/utils/__tests__/lazyLoad.unit.test.tsx +42 -39
- package/src/utils/__tests__/organisationContext.unit.test.ts +9 -10
- package/src/utils/context/organisationContext.test.ts +13 -28
- package/src/utils/context/organisationContext.ts +21 -52
- package/src/utils/dynamic/dynamicUtils.ts +1 -1
- package/src/utils/file-reference/index.ts +39 -15
- package/src/utils/formatting/formatDateTime.test.ts +3 -2
- package/src/utils/google-places/loadGoogleMapsScript.ts +29 -4
- package/src/utils/index.ts +4 -1
- package/src/utils/persistence/__tests__/keyDerivation.test.ts +135 -0
- package/src/utils/persistence/__tests__/sensitiveFieldDetection.test.ts +123 -0
- package/src/utils/persistence/keyDerivation.ts +304 -0
- package/src/utils/persistence/sensitiveFieldDetection.ts +212 -0
- package/src/utils/security/secureStorage.ts +5 -5
- package/src/utils/storage/README.md +1 -1
- package/src/utils/storage/helpers.ts +3 -3
- package/src/utils/supabase/createBaseClient.ts +147 -0
- package/src/utils/timezone/timezone.test.ts +1 -2
- package/src/utils/timezone/timezone.ts +1 -1
- package/src/utils/validation/csrf.ts +4 -4
- package/cursor-rules/00-pace-core-compliance.mdc +0 -331
- package/cursor-rules/01-standards-compliance.mdc +0 -244
- package/cursor-rules/04-testing-standards.mdc +0 -268
- package/cursor-rules/05-bug-reports-and-features.mdc +0 -246
- package/cursor-rules/06-code-quality.mdc +0 -309
- package/cursor-rules/07-tech-stack-compliance.mdc +0 -214
- package/cursor-rules/CHANGELOG.md +0 -119
- package/cursor-rules/README.md +0 -192
- package/dist/DataTable-AOVNCPTX.js +0 -175
- package/dist/DataTable-AOVNCPTX.js.map +0 -1
- package/dist/UnifiedAuthProvider-4SBX4LU5.js +0 -18
- package/dist/UnifiedAuthProvider-4SBX4LU5.js.map +0 -1
- package/dist/api-O6HTBX5Y.js +0 -52
- package/dist/api-O6HTBX5Y.js.map +0 -1
- package/dist/audit-V53FV5AG.js +0 -17
- package/dist/audit-V53FV5AG.js.map +0 -1
- package/dist/chunk-5DRSZLL2.js.map +0 -1
- package/dist/chunk-63FOKYGO.js.map +0 -1
- package/dist/chunk-6COVEUS7.js.map +0 -1
- package/dist/chunk-AFVQODI2.js +0 -263
- package/dist/chunk-AFVQODI2.js.map +0 -1
- package/dist/chunk-DGUM43GV.js.map +0 -1
- package/dist/chunk-E66EQZE6.js.map +0 -1
- package/dist/chunk-EFN2EIMK.js.map +0 -1
- package/dist/chunk-FFQEQTNW.js.map +0 -1
- package/dist/chunk-FMUCXFII.js.map +0 -1
- package/dist/chunk-G37KK66H.js.map +0 -1
- package/dist/chunk-G7QEZTYQ.js +0 -2053
- package/dist/chunk-G7QEZTYQ.js.map +0 -1
- package/dist/chunk-HU2C6SSC.js.map +0 -1
- package/dist/chunk-IHB5DR3H.js.map +0 -1
- package/dist/chunk-IVOFDYWT.js.map +0 -1
- package/dist/chunk-J36DSWQK.js.map +0 -1
- package/dist/chunk-JGRYX5UX.js.map +0 -1
- package/dist/chunk-KQCRWDSA.js +0 -1
- package/dist/chunk-KQCRWDSA.js.map +0 -1
- package/dist/chunk-L4OXEN46.js.map +0 -1
- package/dist/chunk-LMC26NLJ.js +0 -84
- package/dist/chunk-LMC26NLJ.js.map +0 -1
- package/dist/chunk-M43Y4SSO.js.map +0 -1
- package/dist/chunk-M7MPQISP.js.map +0 -1
- package/dist/chunk-NTM7ZSB6.js.map +0 -1
- package/dist/chunk-PWLANIRT.js.map +0 -1
- package/dist/chunk-QXHPKYJV.js.map +0 -1
- package/dist/chunk-RGAWHO7N.js.map +0 -1
- package/dist/chunk-UPPMRMYG.js.map +0 -1
- package/dist/chunk-VBXEHIUJ.js.map +0 -1
- package/dist/chunk-ZSAAAMVR.js.map +0 -1
- package/dist/components.js.map +0 -1
- package/dist/contextValidator-5OGXSPKS.js +0 -9
- package/dist/contextValidator-5OGXSPKS.js.map +0 -1
- package/dist/eslint-rules/pace-core-compliance.cjs +0 -510
- package/dist/hooks.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/providers.js.map +0 -1
- package/dist/rbac/eslint-rules.js.map +0 -1
- package/dist/rbac/index.js.map +0 -1
- package/dist/styles/index.js.map +0 -1
- package/dist/theming/runtime.js.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/utils.js.map +0 -1
- package/docs/best-practices/README.md +0 -472
- package/docs/best-practices/accessibility.md +0 -601
- package/docs/best-practices/common-patterns.md +0 -516
- package/docs/best-practices/deployment.md +0 -1103
- package/docs/best-practices/performance.md +0 -1328
- package/docs/best-practices/security.md +0 -940
- package/docs/best-practices/testing.md +0 -1034
- package/docs/rbac/compliance/compliance-guide.md +0 -544
- package/docs/standards/01-architecture-standard.md +0 -44
- package/docs/standards/02-api-and-rpc-standard.md +0 -39
- package/docs/standards/03-component-standard.md +0 -32
- package/docs/standards/04-code-style-standard.md +0 -32
- package/docs/standards/05-security-standard.md +0 -44
- package/docs/standards/06-testing-and-docs-standard.md +0 -29
- package/docs/standards/pace-core-compliance.md +0 -432
- package/scripts/audit/core/checks/accessibility.cjs +0 -197
- package/scripts/audit/core/checks/api-usage.cjs +0 -191
- package/scripts/audit/core/checks/bundle.cjs +0 -142
- package/scripts/audit/core/checks/compliance.cjs +0 -2706
- package/scripts/audit/core/checks/config.cjs +0 -54
- package/scripts/audit/core/checks/coverage.cjs +0 -84
- package/scripts/audit/core/checks/dependencies.cjs +0 -994
- package/scripts/audit/core/checks/documentation.cjs +0 -268
- package/scripts/audit/core/checks/environment.cjs +0 -116
- package/scripts/audit/core/checks/error-handling.cjs +0 -340
- package/scripts/audit/core/checks/forms.cjs +0 -172
- package/scripts/audit/core/checks/heuristics.cjs +0 -68
- package/scripts/audit/core/checks/hooks.cjs +0 -334
- package/scripts/audit/core/checks/imports.cjs +0 -244
- package/scripts/audit/core/checks/performance.cjs +0 -325
- package/scripts/audit/core/checks/routes.cjs +0 -117
- package/scripts/audit/core/checks/state.cjs +0 -130
- package/scripts/audit/core/checks/structure.cjs +0 -65
- package/scripts/audit/core/checks/style.cjs +0 -584
- package/scripts/audit/core/checks/testing.cjs +0 -122
- package/scripts/audit/core/checks/typescript.cjs +0 -61
- package/scripts/audit/core/scanner.cjs +0 -199
- package/scripts/audit/core/utils.cjs +0 -137
- package/scripts/audit/index.cjs +0 -223
- package/scripts/audit/reporters/console.cjs +0 -151
- package/scripts/audit/reporters/json.cjs +0 -54
- package/scripts/audit/reporters/markdown.cjs +0 -124
- package/scripts/audit-consuming-app.cjs +0 -86
- package/src/components/DataTable/components/DataTableBody.tsx +0 -454
- package/src/components/DataTable/components/DraggableColumnHeader.tsx +0 -156
- package/src/components/DataTable/components/ExpandButton.tsx +0 -113
- package/src/components/DataTable/components/GroupHeader.tsx +0 -54
- package/src/components/DataTable/components/ViewRowModal.tsx +0 -68
- package/src/components/DataTable/components/VirtualizedDataTable.tsx +0 -525
- package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +0 -462
- package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +0 -393
- package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +0 -476
- package/src/components/DataTable/components/__tests__/VirtualizedDataTable.test.tsx +0 -128
- package/src/components/DataTable/core/DataTableContext.tsx +0 -216
- package/src/components/DataTable/core/__tests__/DataTableContext.test.tsx +0 -136
- package/src/components/DataTable/hooks/__tests__/useColumnReordering.test.ts +0 -570
- package/src/components/DataTable/hooks/useColumnReordering.ts +0 -123
- package/src/components/DataTable/utils/debugTools.ts +0 -514
- package/src/eslint-rules/pace-core-compliance.js +0 -638
- package/src/rbac/components/EnhancedNavigationMenu.test.tsx +0 -555
- package/src/rbac/components/EnhancedNavigationMenu.tsx +0 -293
- package/src/rbac/components/NavigationProvider.test.tsx +0 -481
- package/src/rbac/components/NavigationProvider.tsx +0 -345
- package/src/rbac/components/PagePermissionProvider.test.tsx +0 -476
- package/src/rbac/components/PagePermissionProvider.tsx +0 -279
- package/src/rbac/components/PermissionEnforcer.tsx +0 -312
- package/src/rbac/components/RoleBasedRouter.tsx +0 -440
- package/src/rbac/components/SecureDataProvider.test.tsx +0 -543
- package/src/rbac/components/SecureDataProvider.tsx +0 -339
- package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +0 -620
- package/src/rbac/components/__tests__/NavigationProvider.test.tsx +0 -726
- package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +0 -661
- package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +0 -881
- package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +0 -783
- package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +0 -645
- package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +0 -659
- package/src/rbac/hooks/permissions/useCachedPermissions.ts +0 -79
- package/src/rbac/hooks/permissions/useHasAllPermissions.ts +0 -90
- package/src/rbac/hooks/permissions/useHasAnyPermission.ts +0 -90
package/docs/rbac/quick-start.md
CHANGED
|
@@ -357,15 +357,15 @@ export function Login() {
|
|
|
357
357
|
}
|
|
358
358
|
|
|
359
359
|
return (
|
|
360
|
-
<
|
|
361
|
-
<
|
|
362
|
-
<
|
|
360
|
+
<main className="min-h-screen flex items-center justify-center bg-sec-50">
|
|
361
|
+
<section className="max-w-md w-full space-y-8">
|
|
362
|
+
<section>
|
|
363
363
|
<h2 className="mt-6 text-center text-3xl font-extrabold text-sec-900">
|
|
364
364
|
Sign in to your account
|
|
365
365
|
</h2>
|
|
366
|
-
</
|
|
366
|
+
</section>
|
|
367
367
|
<form className="mt-8 space-y-6" onSubmit={handleLogin}>
|
|
368
|
-
<
|
|
368
|
+
<section>
|
|
369
369
|
<label htmlFor="email" className="sr-only">
|
|
370
370
|
Email address
|
|
371
371
|
</label>
|
|
@@ -379,8 +379,8 @@ export function Login() {
|
|
|
379
379
|
value={email}
|
|
380
380
|
onChange={(e) => setEmail(e.target.value)}
|
|
381
381
|
/>
|
|
382
|
-
</
|
|
383
|
-
<
|
|
382
|
+
</section>
|
|
383
|
+
<section>
|
|
384
384
|
<label htmlFor="password" className="sr-only">
|
|
385
385
|
Password
|
|
386
386
|
</label>
|
|
@@ -394,8 +394,8 @@ export function Login() {
|
|
|
394
394
|
value={password}
|
|
395
395
|
onChange={(e) => setPassword(e.target.value)}
|
|
396
396
|
/>
|
|
397
|
-
</
|
|
398
|
-
<
|
|
397
|
+
</section>
|
|
398
|
+
<section>
|
|
399
399
|
<button
|
|
400
400
|
type="submit"
|
|
401
401
|
disabled={loading}
|
|
@@ -403,10 +403,10 @@ export function Login() {
|
|
|
403
403
|
>
|
|
404
404
|
{loading ? 'Signing in...' : 'Sign in'}
|
|
405
405
|
</button>
|
|
406
|
-
</
|
|
406
|
+
</section>
|
|
407
407
|
</form>
|
|
408
|
-
</
|
|
409
|
-
</
|
|
408
|
+
</section>
|
|
409
|
+
</main>
|
|
410
410
|
)
|
|
411
411
|
}
|
|
412
412
|
```
|
|
@@ -427,18 +427,18 @@ export function Dashboard() {
|
|
|
427
427
|
const { user, selectedOrganisationId } = useUnifiedAuth()
|
|
428
428
|
|
|
429
429
|
if (!user) {
|
|
430
|
-
return <
|
|
430
|
+
return <p>Please log in</p>
|
|
431
431
|
}
|
|
432
432
|
|
|
433
433
|
return (
|
|
434
|
-
<
|
|
434
|
+
<main className="min-h-screen bg-sec-50">
|
|
435
435
|
<nav className="bg-background shadow">
|
|
436
|
-
<
|
|
437
|
-
<
|
|
438
|
-
<
|
|
436
|
+
<section className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
|
437
|
+
<section className="flex justify-between h-16">
|
|
438
|
+
<section className="flex items-center">
|
|
439
439
|
<h1 className="text-xl font-semibold">Dashboard</h1>
|
|
440
|
-
</
|
|
441
|
-
<
|
|
440
|
+
</section>
|
|
441
|
+
<section className="flex items-center space-x-4">
|
|
442
442
|
<span className="text-sm text-sec-700">
|
|
443
443
|
{user.email} | Org: {selectedOrganisationId}
|
|
444
444
|
</span>
|
|
@@ -448,39 +448,39 @@ export function Dashboard() {
|
|
|
448
448
|
>
|
|
449
449
|
Sign out
|
|
450
450
|
</button>
|
|
451
|
-
</
|
|
452
|
-
</
|
|
453
|
-
</
|
|
451
|
+
</section>
|
|
452
|
+
</section>
|
|
453
|
+
</section>
|
|
454
454
|
</nav>
|
|
455
455
|
|
|
456
456
|
<main className="max-w-7xl mx-auto py-6 sm:px-6 lg:px-8">
|
|
457
|
-
<
|
|
458
|
-
<
|
|
457
|
+
<section className="px-4 py-6 sm:px-0">
|
|
458
|
+
<section className="border-4 border-dashed border-sec-200 rounded-lg h-96 p-8">
|
|
459
459
|
<h2 className="text-2xl font-bold mb-4">Welcome to your Dashboard</h2>
|
|
460
460
|
|
|
461
461
|
{/* CRITICAL: Use PagePermissionGuard for page-level permissions */}
|
|
462
462
|
<PagePermissionGuard
|
|
463
463
|
pageName="dashboard"
|
|
464
464
|
operation="read"
|
|
465
|
-
fallback={<
|
|
465
|
+
fallback={<p>You don't have permission to view the dashboard</p>}
|
|
466
466
|
>
|
|
467
|
-
<
|
|
467
|
+
<section className="space-y-4">
|
|
468
468
|
<p>You have access to the dashboard!</p>
|
|
469
469
|
|
|
470
|
-
<
|
|
470
|
+
<section className="space-x-4">
|
|
471
471
|
<Link
|
|
472
472
|
to="/users"
|
|
473
473
|
className="bg-main-500 text-main-50 px-4 py-2 rounded hover:bg-main-600"
|
|
474
474
|
>
|
|
475
475
|
View Users
|
|
476
476
|
</Link>
|
|
477
|
-
</
|
|
478
|
-
</
|
|
477
|
+
</section>
|
|
478
|
+
</section>
|
|
479
479
|
</PagePermissionGuard>
|
|
480
|
-
</
|
|
481
|
-
</
|
|
480
|
+
</section>
|
|
481
|
+
</section>
|
|
482
482
|
</main>
|
|
483
|
-
</
|
|
483
|
+
</main>
|
|
484
484
|
)
|
|
485
485
|
}
|
|
486
486
|
```
|
|
@@ -501,21 +501,21 @@ export function Users() {
|
|
|
501
501
|
const { user, selectedOrganisationId } = useUnifiedAuth()
|
|
502
502
|
|
|
503
503
|
if (!user) {
|
|
504
|
-
return <
|
|
504
|
+
return <p>Please log in</p>
|
|
505
505
|
}
|
|
506
506
|
|
|
507
507
|
return (
|
|
508
|
-
<
|
|
508
|
+
<main className="min-h-screen bg-sec-50">
|
|
509
509
|
<nav className="bg-background shadow">
|
|
510
|
-
<
|
|
511
|
-
<
|
|
512
|
-
<
|
|
510
|
+
<section className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
|
511
|
+
<section className="flex justify-between h-16">
|
|
512
|
+
<section className="flex items-center">
|
|
513
513
|
<Link to="/" className="text-main-600 hover:text-main-800 mr-4">
|
|
514
514
|
← Back to Dashboard
|
|
515
515
|
</Link>
|
|
516
516
|
<h1 className="text-xl font-semibold">Users</h1>
|
|
517
|
-
</
|
|
518
|
-
<
|
|
517
|
+
</section>
|
|
518
|
+
<section className="flex items-center space-x-4">
|
|
519
519
|
<span className="text-sm text-sec-700">
|
|
520
520
|
{user.email} | Org: {selectedOrganisationId}
|
|
521
521
|
</span>
|
|
@@ -525,35 +525,35 @@ export function Users() {
|
|
|
525
525
|
>
|
|
526
526
|
Sign out
|
|
527
527
|
</button>
|
|
528
|
-
</
|
|
529
|
-
</
|
|
530
|
-
</
|
|
528
|
+
</section>
|
|
529
|
+
</section>
|
|
530
|
+
</section>
|
|
531
531
|
</nav>
|
|
532
532
|
|
|
533
533
|
<main className="max-w-7xl mx-auto py-6 sm:px-6 lg:px-8">
|
|
534
|
-
<
|
|
535
|
-
<
|
|
534
|
+
<section className="px-4 py-6 sm:px-0">
|
|
535
|
+
<section className="border-4 border-dashed border-sec-200 rounded-lg h-96 p-8">
|
|
536
536
|
<h2 className="text-2xl font-bold mb-4">User Management</h2>
|
|
537
537
|
|
|
538
538
|
{/* CRITICAL: Use PagePermissionGuard for page-level permissions */}
|
|
539
539
|
<PagePermissionGuard
|
|
540
540
|
pageName="users"
|
|
541
541
|
operation="read"
|
|
542
|
-
fallback={<
|
|
542
|
+
fallback={<p>You don't have permission to view users</p>}
|
|
543
543
|
>
|
|
544
|
-
<
|
|
544
|
+
<section className="space-y-4">
|
|
545
545
|
<p>You have access to the users page!</p>
|
|
546
546
|
<p>This means your RBAC system is working correctly.</p>
|
|
547
547
|
|
|
548
|
-
<
|
|
548
|
+
<section className="bg-main-100 border border-main-400 text-main-700 px-4 py-3 rounded">
|
|
549
549
|
<strong>Success!</strong> Your RBAC setup is working correctly.
|
|
550
|
-
</
|
|
551
|
-
</
|
|
550
|
+
</section>
|
|
551
|
+
</section>
|
|
552
552
|
</PagePermissionGuard>
|
|
553
|
-
</
|
|
554
|
-
</
|
|
553
|
+
</section>
|
|
554
|
+
</section>
|
|
555
555
|
</main>
|
|
556
|
-
</
|
|
556
|
+
</main>
|
|
557
557
|
)
|
|
558
558
|
}
|
|
559
559
|
```
|
|
@@ -134,7 +134,7 @@ function MyComponent() {
|
|
|
134
134
|
const supabase = useSecureSupabase();
|
|
135
135
|
|
|
136
136
|
if (!supabase) {
|
|
137
|
-
return <
|
|
137
|
+
return <p>Loading...</p>;
|
|
138
138
|
}
|
|
139
139
|
|
|
140
140
|
// Organisation context is automatically enforced
|
|
@@ -229,38 +229,6 @@ function MyComponent() {
|
|
|
229
229
|
}
|
|
230
230
|
```
|
|
231
231
|
|
|
232
|
-
## Audit Script Detection
|
|
233
|
-
|
|
234
|
-
The pace-core audit script comprehensively detects insecure client usage:
|
|
235
|
-
|
|
236
|
-
```bash
|
|
237
|
-
npm run audit
|
|
238
|
-
```
|
|
239
|
-
|
|
240
|
-
The audit will report violations including:
|
|
241
|
-
- ✅ Direct `createClient` imports from `@supabase/supabase-js`
|
|
242
|
-
- ✅ Direct `createClient()` function calls
|
|
243
|
-
- ✅ Usage of non-secure clients for database queries (`.from()` calls)
|
|
244
|
-
- ✅ Files that import `createClient` but don't use `useSecureSupabase()`
|
|
245
|
-
- ✅ Variables created with `createClient()` that are used for queries
|
|
246
|
-
|
|
247
|
-
**Example audit output**:
|
|
248
|
-
```
|
|
249
|
-
❌ Direct Supabase client usage detected
|
|
250
|
-
File: src/components/UserList.tsx
|
|
251
|
-
Line: 15
|
|
252
|
-
Variable: supabase
|
|
253
|
-
Table: users
|
|
254
|
-
Reason: Direct Supabase client usage detected. Variable 'supabase' is created with createClient() and used for database queries. You MUST use useSecureSupabase() instead to ensure RLS policies and organisation context are enforced.
|
|
255
|
-
Recommendation: Replace with: import { useSecureSupabase } from '@jmruthers/pace-core/rbac'; const supabase = useSecureSupabase();
|
|
256
|
-
```
|
|
257
|
-
|
|
258
|
-
The audit tool provides the same level of detection as the ESLint rule, making it useful for:
|
|
259
|
-
- Pre-commit checks
|
|
260
|
-
- CI/CD pipelines
|
|
261
|
-
- Code reviews
|
|
262
|
-
- Migration validation
|
|
263
|
-
|
|
264
232
|
## Best Practices
|
|
265
233
|
|
|
266
234
|
1. **Always use `useSecureSupabase()`** in React components
|
|
@@ -268,7 +236,6 @@ The audit tool provides the same level of detection as the ESLint rule, making i
|
|
|
268
236
|
3. **Never import `createClient`** from `@supabase/supabase-js` in component files
|
|
269
237
|
4. **Verify client security** in critical code paths (optional but recommended)
|
|
270
238
|
5. **Run ESLint** regularly to catch violations early
|
|
271
|
-
6. **Run audit script** before deploying to catch any missed violations
|
|
272
239
|
|
|
273
240
|
## Troubleshooting
|
|
274
241
|
|
|
@@ -324,7 +291,6 @@ The protection system provides:
|
|
|
324
291
|
- ✅ **Runtime warnings** to alert developers in development mode
|
|
325
292
|
- ✅ **Type safety** to verify client security
|
|
326
293
|
- ✅ **Automatic marking** of secure clients
|
|
327
|
-
- ✅ **Audit scripts** to catch violations before deployment
|
|
328
294
|
|
|
329
295
|
By following these guidelines, you ensure that all database operations respect organisation context and RLS policies, preventing security vulnerabilities and data leakage.
|
|
330
296
|
|
package/docs/security/README.md
CHANGED
|
@@ -126,14 +126,14 @@ function ProtectedComponent() {
|
|
|
126
126
|
const { user, session, isLoading } = useUnifiedAuth();
|
|
127
127
|
|
|
128
128
|
if (isLoading) {
|
|
129
|
-
return <
|
|
129
|
+
return <p>Loading...</p>;
|
|
130
130
|
}
|
|
131
131
|
|
|
132
132
|
if (!user || !session) {
|
|
133
|
-
return <
|
|
133
|
+
return <p>Please log in</p>;
|
|
134
134
|
}
|
|
135
135
|
|
|
136
|
-
return <
|
|
136
|
+
return <p>Welcome, {user.email}!</p>;
|
|
137
137
|
}
|
|
138
138
|
```
|
|
139
139
|
|
|
@@ -672,9 +672,9 @@ test('hides content when user lacks permission', () => {
|
|
|
672
672
|
<PermissionEnforcer
|
|
673
673
|
operation="read"
|
|
674
674
|
resource="users"
|
|
675
|
-
fallback={<
|
|
675
|
+
fallback={<p>Access denied</p>}
|
|
676
676
|
>
|
|
677
|
-
<
|
|
677
|
+
<section>User data</section>
|
|
678
678
|
</PermissionEnforcer>
|
|
679
679
|
);
|
|
680
680
|
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
# Standards Overview
|
|
2
|
+
|
|
3
|
+
**🤖 Cursor Rule**: See [00-standards-overview.mdc](../../cursor-rules/00-standards-overview.mdc) for AI-optimized directives that automatically enforce these standards.
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
This document provides an overview of the pace-core standards system, how it works, and how to use it. These standards are the **canonical development standards** for **pace-core** and **all consuming applications** in the pace-suite.
|
|
8
|
+
|
|
9
|
+
These standards are **human-readable first**, but are deliberately structured so they can be **enforced by automation**, including Cursor rules, ESLint, and custom audit tooling.
|
|
10
|
+
|
|
11
|
+
They are the **single source of truth**.
|
|
12
|
+
All other quality tools must align *to these standards*, not reinterpret them.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## How to Use These Standards
|
|
17
|
+
|
|
18
|
+
### pace-core
|
|
19
|
+
|
|
20
|
+
- Treat these standards as **hard constraints**
|
|
21
|
+
- pace-core sets the bar and defines the contracts
|
|
22
|
+
- Any deviation must be explicitly documented here
|
|
23
|
+
|
|
24
|
+
### Consuming Applications
|
|
25
|
+
|
|
26
|
+
- Inherit these standards by default
|
|
27
|
+
- Only diverge where a documented exception exists
|
|
28
|
+
- Consuming apps should never weaken standards silently
|
|
29
|
+
|
|
30
|
+
### AI Agents (Cursor, Codex, etc.)
|
|
31
|
+
|
|
32
|
+
- Follow these standards **strictly**
|
|
33
|
+
- Do **not** silence rules to "make things pass"
|
|
34
|
+
- If compliance is unclear, stop and report rather than guessing
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## The Four Layers of Quality Enforcement
|
|
39
|
+
|
|
40
|
+
The pace-suite uses **four complementary quality layers**, each with a distinct responsibility.
|
|
41
|
+
They are intentionally overlapping in *coverage*, but **not duplicative in purpose**.
|
|
42
|
+
|
|
43
|
+
Think of this as *defence in depth*, not redundancy.
|
|
44
|
+
|
|
45
|
+
### 1. Standards Documents (Source of Truth)
|
|
46
|
+
|
|
47
|
+
**What they are**
|
|
48
|
+
- Human-readable `.md` documents
|
|
49
|
+
- Describe *intent*, *principles*, and *expectations*
|
|
50
|
+
- Technology-agnostic where possible
|
|
51
|
+
|
|
52
|
+
**What they are used for**
|
|
53
|
+
- Defining *what "good" looks like*
|
|
54
|
+
- Onboarding humans and AI agents
|
|
55
|
+
- Resolving ambiguity when tools disagree
|
|
56
|
+
- Designing new rules, lint checks, and audits
|
|
57
|
+
|
|
58
|
+
**What they are NOT**
|
|
59
|
+
- They are not executable
|
|
60
|
+
- They do not enforce anything by themselves
|
|
61
|
+
- They should not contain implementation hacks
|
|
62
|
+
|
|
63
|
+
➡️ **If there is a conflict, the standards win.**
|
|
64
|
+
|
|
65
|
+
### 2. Cursor Rules (Real-time Guidance)
|
|
66
|
+
|
|
67
|
+
**What they are**
|
|
68
|
+
- AI-optimised interpretations of the standards
|
|
69
|
+
- Applied while code is being written or modified
|
|
70
|
+
- Prevent mistakes *before* they land
|
|
71
|
+
|
|
72
|
+
**What they are used for**
|
|
73
|
+
- Steering AI agents toward correct patterns
|
|
74
|
+
- Enforcing architectural intent during development
|
|
75
|
+
- Reducing rework later in linting or audits
|
|
76
|
+
|
|
77
|
+
**What they are NOT**
|
|
78
|
+
- They are not a replacement for lint or audits
|
|
79
|
+
- They should not invent new standards
|
|
80
|
+
- They should not silence problems "to move on"
|
|
81
|
+
|
|
82
|
+
➡️ Cursor rules **translate standards into behaviour**, but do not redefine them.
|
|
83
|
+
|
|
84
|
+
### 3. ESLint (Fast, Local Static Analysis)
|
|
85
|
+
|
|
86
|
+
**What it is**
|
|
87
|
+
- Deterministic, file-level static analysis
|
|
88
|
+
- Runs locally and in CI
|
|
89
|
+
- Focused on correctness, safety, and consistency
|
|
90
|
+
|
|
91
|
+
**What it is used for**
|
|
92
|
+
- Catching obvious issues early (types, hooks, imports, patterns)
|
|
93
|
+
- Enforcing mechanically checkable rules
|
|
94
|
+
- Preventing regressions during refactors
|
|
95
|
+
|
|
96
|
+
**What it is NOT**
|
|
97
|
+
- ESLint should not encode complex business rules
|
|
98
|
+
- It should not contain subjective or architectural debates
|
|
99
|
+
- It should not be silenced to "get green builds"
|
|
100
|
+
|
|
101
|
+
➡️ ESLint enforces *how code is written*, not *whether the system is correct*.
|
|
102
|
+
|
|
103
|
+
### 4. Audit Tool (Deep, System-Level Analysis)
|
|
104
|
+
|
|
105
|
+
**What it is**
|
|
106
|
+
- A custom static analysis tool
|
|
107
|
+
- Operates across files, folders, and systems
|
|
108
|
+
- Understands pace-core contracts and invariants
|
|
109
|
+
- Organized by the 10-file standards structure
|
|
110
|
+
|
|
111
|
+
**What it is used for**
|
|
112
|
+
- Validating architectural compliance (RBAC, data access, boundaries)
|
|
113
|
+
- Catching issues ESLint cannot see (cross-file analysis, configuration validation)
|
|
114
|
+
- Providing actionable remediation plans
|
|
115
|
+
- System-level checks (provider nesting, RLS policies in SQL, project structure)
|
|
116
|
+
|
|
117
|
+
**What it is NOT**
|
|
118
|
+
- It is not a linter replacement
|
|
119
|
+
- It should not report stylistic issues (handled by ESLint)
|
|
120
|
+
- It should not duplicate ESLint checks (file-level AST analysis)
|
|
121
|
+
- It should not contradict the standards
|
|
122
|
+
|
|
123
|
+
➡️ The audit tool answers: *"Is this system actually compliant?"*
|
|
124
|
+
|
|
125
|
+
**Usage**: Run `npm run audit:pace-core` in your consuming app to generate a comprehensive audit report organized by standard.
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## How the Layers Work Together
|
|
130
|
+
|
|
131
|
+
| Layer | Strength | Timing |
|
|
132
|
+
|--------------|----------------------------------|-----------------|
|
|
133
|
+
| Standards | Intent & clarity | Design time |
|
|
134
|
+
| Cursor rules | Preventive guidance | Write time |
|
|
135
|
+
| ESLint | Fast mechanical enforcement | Dev / CI |
|
|
136
|
+
| Audit tool | Deep architectural verification | Review / CI |
|
|
137
|
+
|
|
138
|
+
No single layer is sufficient on its own.
|
|
139
|
+
Together, they create a **repeatable, scalable quality system** for both humans and AI.
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## Precedence Order
|
|
144
|
+
|
|
145
|
+
When standards conflict, apply this precedence order:
|
|
146
|
+
|
|
147
|
+
1. **Security** - Security and RBAC standards take highest priority
|
|
148
|
+
2. **API/RPC** - API contracts and RPC standards
|
|
149
|
+
3. **Components & Markup** - Component usage and markup quality
|
|
150
|
+
4. **Code Quality/Style** - TypeScript, naming, code style
|
|
151
|
+
5. **Testing & Documentation** - Testing and documentation requirements
|
|
152
|
+
6. **Consuming App Structure** - Project structure and organization
|
|
153
|
+
|
|
154
|
+
**Example:** If a component pattern conflicts with a security requirement, security wins.
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## Standards File Mapping
|
|
159
|
+
|
|
160
|
+
The standards are organized into 10 files, each covering a specific domain:
|
|
161
|
+
|
|
162
|
+
| File | Standard | Cursor Rule | Purpose |
|
|
163
|
+
|------|----------|------------|---------|
|
|
164
|
+
| `0-standards-overview.md` | Overview | `00-standards-overview.mdc` | This file - entry point and system overview |
|
|
165
|
+
| `1-pace-core-compliance-standards.md` | pace-core Compliance | `01-pace-core-compliance.mdc` | Enforce pace-core usage patterns |
|
|
166
|
+
| `2-project-structure-standards.md` | Project Structure | `02-project-structure.mdc` | Define standard folder structure |
|
|
167
|
+
| `3-architecture-standards.md` | Architecture | `03-architecture.mdc` | Enforce SOLID architecture principles |
|
|
168
|
+
| `4-code-quality-standards.md` | Code Quality | `04-code-quality.mdc` | Enforce code quality standards |
|
|
169
|
+
| `5-styling-standards.md` | Styling | `05-styling.mdc` | Enforce clean markup and styling standards |
|
|
170
|
+
| `6-security-rbac-standards.md` | Security & RBAC | `06-security-rbac.mdc` | Enforce RBAC contract and security |
|
|
171
|
+
| `7-api-tech-stack-standards.md` | API & Tech Stack | `07-api-tech-stack.mdc` | Enforce tech stack versions and API standards |
|
|
172
|
+
| `8-testing-documentation-standards.md` | Testing & Documentation | `08-testing-documentation.mdc` | Enforce testing and documentation standards |
|
|
173
|
+
| `9-operations-standards.md` | Operations | `09-operations.mdc` | Enforce error handling, performance, and CI/CD |
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## Quick Reference Guide
|
|
178
|
+
|
|
179
|
+
**New to pace-core?** Start here:
|
|
180
|
+
1. Read [Standards Overview](./0-standards-overview.md) (this file) - Understand the system
|
|
181
|
+
2. Read [Styling Standards](./5-styling-standards.md) - **CRITICAL:** Required CSS setup
|
|
182
|
+
3. Read [pace-core Compliance](./1-pace-core-compliance-standards.md) - How to use pace-core
|
|
183
|
+
4. Read [Project Structure](./2-project-structure-standards.md) - Organize your code
|
|
184
|
+
|
|
185
|
+
**Common Tasks:**
|
|
186
|
+
- **Setting up a new app?** → [Project Structure](./2-project-structure-standards.md) + [Styling Standards](./5-styling-standards.md)
|
|
187
|
+
- **Writing components?** → [Architecture](./3-architecture-standards.md) + [Code Quality](./4-code-quality-standards.md)
|
|
188
|
+
- **Working with RBAC?** → [Security & RBAC](./6-security-rbac-standards.md)
|
|
189
|
+
- **Creating APIs/RPCs?** → [API & Tech Stack](./7-api-tech-stack-standards.md)
|
|
190
|
+
- **Handling errors?** → [Operations](./9-operations-standards.md)
|
|
191
|
+
- **Writing tests?** → [Testing & Documentation](./8-testing-documentation-standards.md)
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## Key Principles
|
|
196
|
+
|
|
197
|
+
- **Do not silence tools** — fix the underlying issue
|
|
198
|
+
- **Do not duplicate rules** — each layer has a purpose
|
|
199
|
+
- **Do not diverge silently** — document exceptions explicitly
|
|
200
|
+
- **Standards always win** — tools must align to them
|
|
201
|
+
|
|
202
|
+
---
|
|
203
|
+
|
|
204
|
+
## Related Documentation
|
|
205
|
+
|
|
206
|
+
- [pace-core Compliance](./1-pace-core-compliance-standards.md) - pace-core usage patterns
|
|
207
|
+
- [Project Structure](./2-project-structure-standards.md) - Project structure and organization
|
|
208
|
+
- [Architecture](./3-architecture-standards.md) - SOLID architecture principles
|
|
209
|
+
- [Code Quality](./4-code-quality-standards.md) - Code quality and TypeScript standards
|
|
210
|
+
- [Styling](./5-styling-standards.md) - Markup and styling standards
|
|
211
|
+
- [Security & RBAC](./6-security-rbac-standards.md) - RBAC and RLS standards
|
|
212
|
+
- [API & Tech Stack](./7-api-tech-stack-standards.md) - Tech stack and API/RPC standards
|
|
213
|
+
- [Testing & Documentation](./8-testing-documentation-standards.md) - Testing and documentation standards
|
|
214
|
+
- [Operations](./9-operations-standards.md) - Error handling, performance, and CI/CD
|
|
215
|
+
|
|
216
|
+
---
|
|
217
|
+
|
|
218
|
+
**Last Updated:** 2025-01-28
|
|
219
|
+
**Version:** 2.0.0
|
|
220
|
+
**Applies to:** All pace-core and consuming apps
|