@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/standards/README.md
CHANGED
|
@@ -1,75 +1,203 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Pace Standards
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
This document is the single source of truth for all engineering standards for pace-core and consuming apps.
|
|
3
|
+
This repository defines the **canonical development standards** for **pace-core** and **all consuming applications** in the pace-suite.
|
|
5
4
|
|
|
6
|
-
|
|
7
|
-
- 01-architecture-standard.md
|
|
8
|
-
- 02-api-and-rpc-standard.md
|
|
9
|
-
- 03-component-standard.md
|
|
10
|
-
- 04-code-style-standard.md
|
|
11
|
-
- 05-security-standard.md
|
|
12
|
-
- 06-testing-and-docs-standard.md
|
|
5
|
+
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.
|
|
13
6
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
- 02-pace-core-integration.md
|
|
17
|
-
- 03-domain-model.md
|
|
18
|
-
- 04-app-security-and-rbac.md
|
|
19
|
-
- 05-testing-strategy.md
|
|
20
|
-
- 06-ai-collaboration.md
|
|
7
|
+
They are the **single source of truth**.
|
|
8
|
+
All other quality tools must align *to these standards*, not reinterpret them.
|
|
21
9
|
|
|
22
|
-
|
|
23
|
-
1. Security
|
|
24
|
-
2. API/RPC
|
|
25
|
-
3. Components
|
|
26
|
-
4. Code Style
|
|
27
|
-
5. Testing
|
|
28
|
-
6. Documentation
|
|
29
|
-
7. Consuming App Standards
|
|
10
|
+
---
|
|
30
11
|
|
|
31
|
-
##
|
|
32
|
-
- Read relevant standards
|
|
33
|
-
- Apply Cursor Checklists
|
|
34
|
-
- Prefer pace-core for reusable logic
|
|
35
|
-
- Update docs on API changes
|
|
12
|
+
## How to use these standards
|
|
36
13
|
|
|
37
|
-
|
|
14
|
+
### pace-core
|
|
15
|
+
- Treat these standards as **hard constraints**
|
|
16
|
+
- pace-core sets the bar and defines the contracts
|
|
17
|
+
- Any deviation must be explicitly documented here
|
|
38
18
|
|
|
39
|
-
|
|
19
|
+
### Consuming applications
|
|
20
|
+
- Inherit these standards by default
|
|
21
|
+
- Only diverge where a documented exception exists
|
|
22
|
+
- Consuming apps should never weaken standards silently
|
|
40
23
|
|
|
41
|
-
###
|
|
24
|
+
### AI agents (Cursor, Codex, etc.)
|
|
25
|
+
- Follow these standards **strictly**
|
|
26
|
+
- Do **not** silence rules to "make things pass"
|
|
27
|
+
- If compliance is unclear, stop and report rather than guessing
|
|
42
28
|
|
|
43
|
-
|
|
29
|
+
---
|
|
44
30
|
|
|
45
|
-
|
|
46
|
-
node node_modules/@jmruthers/pace-core/scripts/install-cursor-rules.cjs
|
|
47
|
-
```
|
|
31
|
+
## The Four Layers of Quality Enforcement
|
|
48
32
|
|
|
49
|
-
|
|
33
|
+
The pace-suite uses **four complementary quality layers**, each with a distinct responsibility.
|
|
34
|
+
They are intentionally overlapping in *coverage*, but **not duplicative in purpose**.
|
|
50
35
|
|
|
51
|
-
|
|
52
|
-
- **00-pace-core-compliance** - Enforce pace-core usage patterns
|
|
53
|
-
- **01-standards-compliance** - Enforce all standards (this document)
|
|
54
|
-
- **02-project-structure** - Define standard folder structure
|
|
55
|
-
- **03-solid-principles** - Enforce SOLID architecture
|
|
56
|
-
- **04-testing-standards** - Enforce testing consistency
|
|
57
|
-
- **05-bug-reports-and-features** - Templates for issue reporting
|
|
58
|
-
- **06-code-quality** - Enforce code quality standards
|
|
59
|
-
- **07-tech-stack-compliance** - Enforce tech stack versions
|
|
60
|
-
- **08-markup-quality** - Enforce clean markup standards, semantic HTML usage, and pace-core component patterns
|
|
36
|
+
Think of this as *defence in depth*, not redundancy.
|
|
61
37
|
|
|
62
|
-
|
|
38
|
+
---
|
|
63
39
|
|
|
64
|
-
|
|
40
|
+
### 1. Standards Documents (Source of Truth)
|
|
65
41
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
42
|
+
**What they are**
|
|
43
|
+
- Human-readable `.md` documents
|
|
44
|
+
- Describe *intent*, *principles*, and *expectations*
|
|
45
|
+
- Technology-agnostic where possible
|
|
69
46
|
|
|
70
|
-
|
|
47
|
+
**What they are used for**
|
|
48
|
+
- Defining *what "good" looks like*
|
|
49
|
+
- Onboarding humans and AI agents
|
|
50
|
+
- Resolving ambiguity when tools disagree
|
|
51
|
+
- Designing new rules, lint checks, and audits
|
|
71
52
|
|
|
72
|
-
|
|
53
|
+
**What they are NOT**
|
|
54
|
+
- They are not executable
|
|
55
|
+
- They do not enforce anything by themselves
|
|
56
|
+
- They should not contain implementation hacks
|
|
73
57
|
|
|
74
|
-
|
|
75
|
-
|
|
58
|
+
➡️ **If there is a conflict, the standards win.**
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
### 2. Cursor Rules (Real-time Guidance)
|
|
63
|
+
|
|
64
|
+
**What they are**
|
|
65
|
+
- AI-optimised interpretations of the standards
|
|
66
|
+
- Applied while code is being written or modified
|
|
67
|
+
- Prevent mistakes *before* they land
|
|
68
|
+
|
|
69
|
+
**What they are used for**
|
|
70
|
+
- Steering AI agents toward correct patterns
|
|
71
|
+
- Enforcing architectural intent during development
|
|
72
|
+
- Reducing rework later in linting or audits
|
|
73
|
+
|
|
74
|
+
**What they are NOT**
|
|
75
|
+
- They are not a replacement for lint or audits
|
|
76
|
+
- They should not invent new standards
|
|
77
|
+
- They should not silence problems "to move on"
|
|
78
|
+
|
|
79
|
+
➡️ Cursor rules **translate standards into behaviour**, but do not redefine them.
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
### 3. ESLint (Fast, Local Static Analysis)
|
|
84
|
+
|
|
85
|
+
**What it is**
|
|
86
|
+
- Deterministic, file-level static analysis
|
|
87
|
+
- Runs locally and in CI
|
|
88
|
+
- Focused on correctness, safety, and consistency
|
|
89
|
+
|
|
90
|
+
**What it is used for**
|
|
91
|
+
- Catching obvious issues early (types, hooks, imports, patterns)
|
|
92
|
+
- Enforcing mechanically checkable rules
|
|
93
|
+
- Preventing regressions during refactors
|
|
94
|
+
|
|
95
|
+
**What it is NOT**
|
|
96
|
+
- ESLint should not encode complex business rules
|
|
97
|
+
- It should not contain subjective or architectural debates
|
|
98
|
+
- It should not be silenced to "get green builds"
|
|
99
|
+
|
|
100
|
+
➡️ ESLint enforces *how code is written*, not *whether the system is correct*.
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
### 4. Audit Tool (Deep, System-Level Analysis)
|
|
105
|
+
|
|
106
|
+
**What it is**
|
|
107
|
+
- A custom static analysis tool
|
|
108
|
+
- Operates across files, folders, and systems
|
|
109
|
+
- Understands pace-core contracts and invariants
|
|
110
|
+
|
|
111
|
+
**What it is used for**
|
|
112
|
+
- Validating architectural compliance (RBAC, data access, boundaries)
|
|
113
|
+
- Catching issues ESLint cannot see
|
|
114
|
+
- Providing actionable remediation plans
|
|
115
|
+
|
|
116
|
+
**What it is NOT**
|
|
117
|
+
- It is not a linter replacement
|
|
118
|
+
- It should not report stylistic issues
|
|
119
|
+
- It should not contradict the standards
|
|
120
|
+
|
|
121
|
+
➡️ The audit tool answers: *"Is this system actually compliant?"*
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## How the layers work together
|
|
126
|
+
|
|
127
|
+
| Layer | Strength | Timing |
|
|
128
|
+
|--------------|----------------------------------|-----------------|
|
|
129
|
+
| Standards | Intent & clarity | Design time |
|
|
130
|
+
| Cursor rules | Preventive guidance | Write time |
|
|
131
|
+
| ESLint | Fast mechanical enforcement | Dev / CI |
|
|
132
|
+
| Audit tool | Deep architectural verification | Review / CI |
|
|
133
|
+
|
|
134
|
+
No single layer is sufficient on its own.
|
|
135
|
+
Together, they create a **repeatable, scalable quality system** for both humans and AI.
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## Standards Documents
|
|
140
|
+
|
|
141
|
+
The standards are organized into **10 files**, each covering a specific domain:
|
|
142
|
+
|
|
143
|
+
### 0. [Standards Overview](./0-standards-overview.md)
|
|
144
|
+
Entry point, precedence, how standards work, and the four layers of quality enforcement.
|
|
145
|
+
|
|
146
|
+
### 1. [pace-core Compliance](./1-pace-core-compliance-standards.md)
|
|
147
|
+
pace-core usage patterns, ESLint rules, secure Supabase client requirements, and compliance enforcement.
|
|
148
|
+
|
|
149
|
+
### 2. [Project Structure](./2-project-structure-standards.md)
|
|
150
|
+
Standard directory structure, file organization patterns, naming conventions, and migration guides.
|
|
151
|
+
|
|
152
|
+
### 3. [Architecture](./3-architecture-standards.md)
|
|
153
|
+
SOLID principles, component design, API design, and architectural patterns.
|
|
154
|
+
|
|
155
|
+
### 4. [Code Quality](./4-code-quality-standards.md)
|
|
156
|
+
TypeScript rules, naming conventions, code style patterns, and React patterns.
|
|
157
|
+
|
|
158
|
+
### 5. [Styling](./5-styling-standards.md)
|
|
159
|
+
**CRITICAL:** Required CSS configuration, Tailwind v4 setup, markup quality, and styling patterns.
|
|
160
|
+
|
|
161
|
+
### 6. [Security & RBAC](./6-security-rbac-standards.md)
|
|
162
|
+
RLS policy patterns, RBAC integration, helper functions, and security requirements.
|
|
163
|
+
|
|
164
|
+
### 7. [API & Tech Stack](./7-api-tech-stack-standards.md)
|
|
165
|
+
Required tech stack, API/RPC naming conventions, result shapes, and deprecation policy.
|
|
166
|
+
|
|
167
|
+
### 8. [Testing & Documentation](./8-testing-documentation-standards.md)
|
|
168
|
+
Testing strategy, documentation requirements, bug report templates, and feature request templates.
|
|
169
|
+
|
|
170
|
+
### 9. [Operations](./9-operations-standards.md)
|
|
171
|
+
Error handling patterns, performance optimization, caching strategies, and CI/CD integration.
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
## Key Principles
|
|
176
|
+
|
|
177
|
+
- **Do not silence tools** — fix the underlying issue
|
|
178
|
+
- **Do not duplicate rules** — each layer has a purpose
|
|
179
|
+
- **Do not diverge silently** — document exceptions explicitly
|
|
180
|
+
- **Standards always win** — tools must align to them
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## Getting Started
|
|
185
|
+
|
|
186
|
+
1. **Read the Overview** - Start with [0-standards-overview.md](./0-standards-overview.md) to understand the system
|
|
187
|
+
2. **Review Critical Standards** - Pay special attention to:
|
|
188
|
+
- [5-styling-standards.md](./5-styling-standards.md) - **CRITICAL CSS configuration**
|
|
189
|
+
- [1-pace-core-compliance-standards.md](./1-pace-core-compliance-standards.md) - pace-core usage
|
|
190
|
+
- [6-security-rbac-standards.md](./6-security-rbac-standards.md) - Security and RBAC
|
|
191
|
+
3. **Set Up Quality Enforcement** - Install Cursor rules and ESLint config:
|
|
192
|
+
- `npm run setup:cursor-rules` - Install Cursor rules for AI-assisted enforcement
|
|
193
|
+
- `npm run setup:eslint` - Install ESLint config for real-time linting
|
|
194
|
+
4. **Run Audits** - Use the audit tool to validate compliance:
|
|
195
|
+
- `npm run audit:pace-core` - Run comprehensive audit organized by standards
|
|
196
|
+
5. **Follow the Standards** - Use the standards as your guide for all development work
|
|
197
|
+
6. **Reference When Needed** - Use the standards to resolve conflicts and answer questions
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
**Last Updated:** 2025-01-28
|
|
202
|
+
**Version:** 2.0.0
|
|
203
|
+
**Applies to:** All pace-core and consuming apps
|
|
@@ -84,7 +84,7 @@ import '@jmruthers/pace-core/src/styles/core.css';
|
|
|
84
84
|
```tsx
|
|
85
85
|
// ✅ Check if user has proper context
|
|
86
86
|
const { hasPermission, isLoading } = useCan();
|
|
87
|
-
if (isLoading) return <
|
|
87
|
+
if (isLoading) return <p>Loading permissions...</p>;
|
|
88
88
|
|
|
89
89
|
// ✅ Ensure proper scope
|
|
90
90
|
<PermissionGuard
|
|
@@ -525,8 +525,8 @@ function useDebugRender(componentName: string, props?: any) {
|
|
|
525
525
|
function MyComponent({ data, loading }) {
|
|
526
526
|
useDebugRender('MyComponent', { data, loading });
|
|
527
527
|
|
|
528
|
-
if (loading) return <
|
|
529
|
-
return <
|
|
528
|
+
if (loading) return <p>Loading...</p>;
|
|
529
|
+
return <p>{data}</p>;
|
|
530
530
|
}
|
|
531
531
|
```
|
|
532
532
|
|
|
@@ -922,5 +922,5 @@ When issues occur intermittently:
|
|
|
922
922
|
- [Common Issues](./common-issues.md) - Specific problem solutions
|
|
923
923
|
- [Styling Issues](./styling-issues.md) - Component styling problems
|
|
924
924
|
- [Authentication Guide](../implementation-guides/authentication.md) - Auth troubleshooting
|
|
925
|
-
- [Performance
|
|
925
|
+
- [Performance Optimization](../standards/9-operations-standards.md#performance-optimization) - Performance debugging
|
|
926
926
|
- [API Reference](../api-reference/) - Component documentation
|
|
@@ -142,7 +142,7 @@ import { useUnifiedAuth } from '@jmruthers/pace-core'
|
|
|
142
142
|
function DebugComponent() {
|
|
143
143
|
const auth = useUnifiedAuth()
|
|
144
144
|
console.log('Auth context:', auth)
|
|
145
|
-
return <
|
|
145
|
+
return <p>Check console for auth context</p>
|
|
146
146
|
}
|
|
147
147
|
```
|
|
148
148
|
|
|
@@ -154,7 +154,7 @@ import { useRBAC } from '@jmruthers/pace-core'
|
|
|
154
154
|
function DebugRBAC() {
|
|
155
155
|
const rbac = useRBAC()
|
|
156
156
|
console.log('RBAC context:', rbac)
|
|
157
|
-
return <
|
|
157
|
+
return <p>Check console for RBAC context</p>
|
|
158
158
|
}
|
|
159
159
|
```
|
|
160
160
|
|
|
@@ -46,8 +46,8 @@ function useDebugRender(componentName: string, props?: any) {
|
|
|
46
46
|
function MyComponent({ data, loading }) {
|
|
47
47
|
useDebugRender('MyComponent', { data, loading });
|
|
48
48
|
|
|
49
|
-
if (loading) return <
|
|
50
|
-
return <
|
|
49
|
+
if (loading) return <p>Loading...</p>;
|
|
50
|
+
return <p>{data}</p>;
|
|
51
51
|
}
|
|
52
52
|
```
|
|
53
53
|
|
|
@@ -205,7 +205,7 @@ function MyComponent() {
|
|
|
205
205
|
prevState.current = state;
|
|
206
206
|
}, [state]);
|
|
207
207
|
|
|
208
|
-
return <
|
|
208
|
+
return <p>{state.count}</p>;
|
|
209
209
|
}
|
|
210
210
|
```
|
|
211
211
|
|
|
@@ -273,7 +273,7 @@ function ExpensiveComponent() {
|
|
|
273
273
|
useRenderDebug('ExpensiveComponent');
|
|
274
274
|
|
|
275
275
|
// Component logic here
|
|
276
|
-
return <
|
|
276
|
+
return <p>Expensive content</p>;
|
|
277
277
|
}
|
|
278
278
|
```
|
|
279
279
|
|
|
@@ -320,11 +320,11 @@ export function useAuthDebug() {
|
|
|
320
320
|
function AuthDebugger() {
|
|
321
321
|
const auth = useAuthDebug();
|
|
322
322
|
|
|
323
|
-
if (auth.loading) return <
|
|
324
|
-
if (auth.error) return <
|
|
325
|
-
if (!auth.user) return <
|
|
323
|
+
if (auth.loading) return <p>Loading auth...</p>;
|
|
324
|
+
if (auth.error) return <p>Auth error: {auth.error}</p>;
|
|
325
|
+
if (!auth.user) return <p>Not authenticated</p>;
|
|
326
326
|
|
|
327
|
-
return <
|
|
327
|
+
return <p>Authenticated as: {auth.user.email}</p>;
|
|
328
328
|
}
|
|
329
329
|
```
|
|
330
330
|
|
|
@@ -589,7 +589,7 @@ function MyComponent() {
|
|
|
589
589
|
useMemoryLeakDetection('MyComponent');
|
|
590
590
|
|
|
591
591
|
// Component logic
|
|
592
|
-
return <
|
|
592
|
+
return <p>Content</p>;
|
|
593
593
|
}
|
|
594
594
|
```
|
|
595
595
|
|
|
@@ -31,10 +31,10 @@ function MyComponent() {
|
|
|
31
31
|
const { hasPermission } = usePermissions();
|
|
32
32
|
|
|
33
33
|
return (
|
|
34
|
-
<
|
|
34
|
+
<section>
|
|
35
35
|
{user && <p>Welcome, {user.email}</p>}
|
|
36
36
|
{hasPermission('read:users') && <UserList />}
|
|
37
|
-
</
|
|
37
|
+
</section>
|
|
38
38
|
);
|
|
39
39
|
}
|
|
40
40
|
|
|
@@ -47,10 +47,10 @@ function MyComponent() {
|
|
|
47
47
|
const { hasPermission } = useCan();
|
|
48
48
|
|
|
49
49
|
return (
|
|
50
|
-
<
|
|
50
|
+
<section>
|
|
51
51
|
{user && <p>Welcome, {user.email}</p>}
|
|
52
52
|
{hasPermission('read:users') && <UserList />}
|
|
53
|
-
</
|
|
53
|
+
</section>
|
|
54
54
|
);
|
|
55
55
|
}
|
|
56
56
|
```
|
|
@@ -1,37 +1,51 @@
|
|
|
1
1
|
---
|
|
2
|
-
lastUpdated:
|
|
3
|
-
version: 0.
|
|
2
|
+
lastUpdated: 2026-01-06T15:00:00+11:00
|
|
3
|
+
version: 0.6.x
|
|
4
4
|
reviewedBy: documentation-standards-audit
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Organisation Context Setup Troubleshooting
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
> **⚠️ IMPORTANT UPDATE (v0.6.x)**: The `set_organisation_context` and `get_organisation_context` functions have been **removed** in pace-core v0.6.x. Organisation context is now handled automatically via secure Supabase client headers.
|
|
10
10
|
|
|
11
|
-
##
|
|
11
|
+
## ✅ Current Implementation (v0.6.x+)
|
|
12
|
+
|
|
13
|
+
Organisation context is now handled automatically:
|
|
14
|
+
|
|
15
|
+
1. **Secure Supabase Client**: The `useSecureSupabase()` hook automatically injects organisation context headers
|
|
16
|
+
2. **Explicit Parameters**: RPC functions receive `p_organisation_id` as explicit parameters
|
|
17
|
+
3. **RLS Policies**: Row Level Security policies use `auth.uid()` and `organisation_id` columns directly
|
|
18
|
+
|
|
19
|
+
**No manual context setting is required.** The secure client handles this automatically.
|
|
20
|
+
|
|
21
|
+
## 🚨 Legacy Error (v0.5.x and earlier)
|
|
22
|
+
|
|
23
|
+
If you're seeing this error, you may be using an older version of pace-core:
|
|
12
24
|
|
|
13
25
|
```
|
|
14
26
|
Error loading units: unrecognized configuration parameter "app.organisation_id"
|
|
15
27
|
```
|
|
16
28
|
|
|
17
|
-
**
|
|
18
|
-
```
|
|
19
|
-
Supabase error fetching units: Object {
|
|
20
|
-
code: "42704",
|
|
21
|
-
details: null,
|
|
22
|
-
hint: null,
|
|
23
|
-
message: 'unrecognized configuration parameter "app.organisation_id"'
|
|
24
|
-
}
|
|
25
|
-
```
|
|
29
|
+
**This error should not occur in v0.6.x+** as the functions have been removed.
|
|
26
30
|
|
|
27
|
-
## 🔍
|
|
31
|
+
## 🔍 If You Still See Errors
|
|
28
32
|
|
|
29
|
-
|
|
30
|
-
1. The Supabase database doesn't have the `set_organisation_context` function
|
|
31
|
-
2. The `app.organisation_id` configuration parameter isn't available
|
|
32
|
-
3. The organisation context isn't being set before making database queries
|
|
33
|
+
If you're using pace-core v0.6.x+ and still seeing context-related errors:
|
|
33
34
|
|
|
34
|
-
|
|
35
|
+
1. **Verify you're using `useSecureSupabase()`**: Always use the secure client from the hook, not the base client
|
|
36
|
+
2. **Check RPC parameters**: Ensure RPC functions receive `p_organisation_id` as explicit parameters
|
|
37
|
+
3. **Verify RLS policies**: RLS policies should use `auth.uid()` and `organisation_id` columns, not session variables
|
|
38
|
+
|
|
39
|
+
## 📚 Legacy Documentation (v0.5.x)
|
|
40
|
+
|
|
41
|
+
The following information is for reference only (v0.5.x and earlier):
|
|
42
|
+
|
|
43
|
+
### Legacy Solution: Database Setup
|
|
44
|
+
|
|
45
|
+
**Note**: These functions are no longer needed in v0.6.x+. This section is for historical reference only.
|
|
46
|
+
|
|
47
|
+
<details>
|
|
48
|
+
<summary>Click to view legacy setup (v0.5.x)</summary>
|
|
35
49
|
|
|
36
50
|
### Step 1: Create the Organisation Context Functions
|
|
37
51
|
|
|
@@ -282,6 +296,15 @@ If you're still experiencing problems:
|
|
|
282
296
|
|
|
283
297
|
The key is making sure the database has the organisation context functions and your RLS policies use them correctly.
|
|
284
298
|
|
|
299
|
+
</details>
|
|
300
|
+
|
|
301
|
+
## ✅ Current Best Practices (v0.6.x+)
|
|
302
|
+
|
|
303
|
+
1. **Always use `useSecureSupabase()`**: This hook automatically handles organisation context
|
|
304
|
+
2. **Pass explicit parameters**: RPC functions should receive `p_organisation_id` as explicit parameters
|
|
305
|
+
3. **Use RLS policies correctly**: Policies should use `auth.uid()` and `organisation_id` columns directly
|
|
306
|
+
4. **No manual context setting**: The secure client handles everything automatically
|
|
307
|
+
|
|
285
308
|
## ♿ Accessibility
|
|
286
309
|
|
|
287
310
|
Organisation context setup doesn't directly impact accessibility, but ensure:
|
|
@@ -31,21 +31,21 @@ try {
|
|
|
31
31
|
console.warn('Warning: Could not load core-usage-manifest.json for ESLint config');
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
// Load pace-core
|
|
34
|
+
// Load pace-core ESLint rules
|
|
35
35
|
let paceCoreRules = {};
|
|
36
36
|
try {
|
|
37
|
-
// Try source path first (for development)
|
|
38
|
-
const sourceRulesPath = path.resolve(__dirname, '
|
|
37
|
+
// Try source path first (for development) - new location at package root
|
|
38
|
+
const sourceRulesPath = path.resolve(__dirname, 'eslint-rules/index.cjs');
|
|
39
39
|
if (fs.existsSync(sourceRulesPath)) {
|
|
40
40
|
paceCoreRules = require(sourceRulesPath).rules;
|
|
41
41
|
} else {
|
|
42
42
|
// Try dist path (for published package)
|
|
43
|
-
const distRulesPath = path.resolve(__dirname, 'dist/eslint-rules/
|
|
43
|
+
const distRulesPath = path.resolve(__dirname, 'dist/eslint-rules/index.cjs');
|
|
44
44
|
if (fs.existsSync(distRulesPath)) {
|
|
45
45
|
paceCoreRules = require(distRulesPath).rules;
|
|
46
46
|
} else {
|
|
47
47
|
// Try relative to current working directory (for consuming apps)
|
|
48
|
-
const cwdRulesPath = path.resolve(process.cwd(), 'node_modules/@jmruthers/pace-core/dist/eslint-rules/
|
|
48
|
+
const cwdRulesPath = path.resolve(process.cwd(), 'node_modules/@jmruthers/pace-core/dist/eslint-rules/index.cjs');
|
|
49
49
|
if (fs.existsSync(cwdRulesPath)) {
|
|
50
50
|
paceCoreRules = require(cwdRulesPath).rules;
|
|
51
51
|
}
|
|
@@ -77,12 +77,39 @@ module.exports = [
|
|
|
77
77
|
}
|
|
78
78
|
},
|
|
79
79
|
rules: {
|
|
80
|
-
//
|
|
80
|
+
// Standard 1: pace-core Compliance
|
|
81
81
|
'pace-core-compliance/no-restricted-imports': 'error',
|
|
82
82
|
'pace-core-compliance/prefer-pace-core-components': 'warn',
|
|
83
83
|
'pace-core-compliance/prefer-pace-core-hooks': 'warn',
|
|
84
84
|
'pace-core-compliance/prefer-pace-core-utils': 'warn',
|
|
85
85
|
'pace-core-compliance/no-local-component-duplication': 'error',
|
|
86
|
+
'pace-core-compliance/prefer-pace-core-form': 'error',
|
|
87
|
+
|
|
88
|
+
// Standard 4: Code Quality
|
|
89
|
+
'pace-core-compliance/naming-convention': 'warn',
|
|
90
|
+
'pace-core-compliance/component-naming': 'warn',
|
|
91
|
+
'pace-core-compliance/type-naming': 'warn',
|
|
92
|
+
|
|
93
|
+
// Standard 5: Styling
|
|
94
|
+
'pace-core-compliance/no-inline-styles': 'error',
|
|
95
|
+
|
|
96
|
+
// Standard 6: Security & RBAC
|
|
97
|
+
'pace-core-compliance/no-direct-supabase-client': 'error',
|
|
98
|
+
'pace-core-compliance/rbac-permission-loading': 'error',
|
|
99
|
+
'pace-core-compliance/no-direct-rbac-rpc': 'error',
|
|
100
|
+
'pace-core-compliance/no-direct-rbac-table': 'error',
|
|
101
|
+
'pace-core-compliance/no-hardcoded-role-checks': 'error',
|
|
102
|
+
'pace-core-compliance/rbac-use-resource-names-constants': 'error',
|
|
103
|
+
'pace-core-compliance/no-rbac-wrapper-components': 'error',
|
|
104
|
+
'pace-core-compliance/no-rbac-wrapper-functions': 'error',
|
|
105
|
+
|
|
106
|
+
// Standard 7: API & Tech Stack
|
|
107
|
+
'pace-core-compliance/rpc-naming-pattern': 'warn',
|
|
108
|
+
'pace-core-compliance/no-class-components': 'error',
|
|
109
|
+
'pace-core-compliance/prefer-import-meta-env': 'error',
|
|
110
|
+
|
|
111
|
+
// Standard 8: Testing
|
|
112
|
+
'pace-core-compliance/test-file-naming': 'warn',
|
|
86
113
|
|
|
87
114
|
// Also use standard no-restricted-imports (ESLint 9 flat config format)
|
|
88
115
|
// Note: ESLint 9 uses a simpler array format
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jmruthers/pace-core",
|
|
3
|
-
"version": "0.6.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.6.7",
|
|
4
|
+
"description": "React component library with Tailwind v4",
|
|
5
5
|
"private": false,
|
|
6
6
|
"publishConfig": {
|
|
7
7
|
"access": "public"
|
|
@@ -42,6 +42,11 @@
|
|
|
42
42
|
"import": "./dist/utils.js",
|
|
43
43
|
"default": "./dist/utils.js"
|
|
44
44
|
},
|
|
45
|
+
"./icons": {
|
|
46
|
+
"types": "./dist/icons/index.d.ts",
|
|
47
|
+
"import": "./dist/icons/index.js",
|
|
48
|
+
"default": "./dist/icons/index.js"
|
|
49
|
+
},
|
|
45
50
|
"./rbac": {
|
|
46
51
|
"types": "./dist/rbac/index.d.ts",
|
|
47
52
|
"import": "./dist/rbac/index.js",
|
|
@@ -53,9 +58,9 @@
|
|
|
53
58
|
"default": "./dist/rbac/eslint-rules.js"
|
|
54
59
|
},
|
|
55
60
|
"./eslint-rules": {
|
|
56
|
-
"require": "./dist/eslint-rules/
|
|
57
|
-
"import": "./dist/eslint-rules/
|
|
58
|
-
"default": "./dist/eslint-rules/
|
|
61
|
+
"require": "./dist/eslint-rules/index.cjs",
|
|
62
|
+
"import": "./dist/eslint-rules/index.cjs",
|
|
63
|
+
"default": "./dist/eslint-rules/index.cjs"
|
|
59
64
|
},
|
|
60
65
|
"./eslint-config": "./eslint-config-pace-core.cjs",
|
|
61
66
|
"./styles/core.css": "./src/styles/core.css",
|
|
@@ -69,12 +74,11 @@
|
|
|
69
74
|
"default": "./vite-plugin-tailwind-v4.js"
|
|
70
75
|
},
|
|
71
76
|
"./docs": "./docs/README.md",
|
|
77
|
+
"./docs/dependencies": "./docs/getting-started/dependencies.md",
|
|
72
78
|
"./package.json": "./package.json",
|
|
73
79
|
"./core-usage-manifest.json": "./core-usage-manifest.json",
|
|
74
80
|
"./cursor-rules": "./cursor-rules",
|
|
75
81
|
"./scripts/install-cursor-rules": "./scripts/install-cursor-rules.cjs",
|
|
76
|
-
"./scripts/audit": "./scripts/audit/index.cjs",
|
|
77
|
-
"./scripts/audit-consuming-app": "./scripts/audit-consuming-app.cjs",
|
|
78
82
|
"./source": {
|
|
79
83
|
"import": "./src/index.ts",
|
|
80
84
|
"default": "./src/index.ts"
|
|
@@ -95,6 +99,10 @@
|
|
|
95
99
|
"import": "./src/utils/index.ts",
|
|
96
100
|
"default": "./src/utils/index.ts"
|
|
97
101
|
},
|
|
102
|
+
"./source/icons": {
|
|
103
|
+
"import": "./src/icons/index.ts",
|
|
104
|
+
"default": "./src/icons/index.ts"
|
|
105
|
+
},
|
|
98
106
|
"./source/types": {
|
|
99
107
|
"import": "./src/types/index.ts",
|
|
100
108
|
"default": "./src/types/index.ts"
|
|
@@ -143,11 +151,13 @@
|
|
|
143
151
|
"core-usage-manifest.json",
|
|
144
152
|
"eslint-config-pace-core.cjs",
|
|
145
153
|
"scripts",
|
|
146
|
-
"cursor-rules"
|
|
154
|
+
"cursor-rules",
|
|
155
|
+
"audit-tool"
|
|
147
156
|
],
|
|
148
157
|
"scripts": {
|
|
149
158
|
"_comment_build": "Build package and documentation",
|
|
150
159
|
"build": "tsup && node scripts/build-css.js",
|
|
160
|
+
"build:fast": "SKIP_CLEAN=true NODE_ENV=development tsup && node scripts/build-css.js",
|
|
151
161
|
"build:watch": "tsup --watch",
|
|
152
162
|
"build:docs": "node scripts/build-docs-incremental.js",
|
|
153
163
|
"build:docs:force": "node scripts/build-docs-incremental.js --force",
|
|
@@ -187,7 +197,9 @@
|
|
|
187
197
|
"docs:generate": "node scripts/generate-docs.js generate",
|
|
188
198
|
"docs:update-index": "node scripts/generate-docs.js update-index",
|
|
189
199
|
"docs:generate-api": "node scripts/generate-docs.js generate-api",
|
|
190
|
-
"docs:all": "node scripts/generate-docs.js all"
|
|
200
|
+
"docs:all": "node scripts/generate-docs.js all",
|
|
201
|
+
"_comment_audit": "Audit tool for consuming apps",
|
|
202
|
+
"audit:pace-core": "node packages/core/audit-tool/index.cjs"
|
|
191
203
|
},
|
|
192
204
|
"keywords": [
|
|
193
205
|
"react",
|
|
@@ -201,16 +213,11 @@
|
|
|
201
213
|
"author": "PACE Team",
|
|
202
214
|
"license": "MIT",
|
|
203
215
|
"peerDependencies": {
|
|
204
|
-
"@
|
|
205
|
-
"@radix-ui/react-label": "^2.0.0",
|
|
206
|
-
"@radix-ui/react-slot": "^1.0.0",
|
|
207
|
-
"@radix-ui/react-switch": "^1.1.0",
|
|
208
|
-
"@radix-ui/react-tabs": "^1.0.0",
|
|
209
|
-
"@radix-ui/react-toast": "^1.0.0",
|
|
210
|
-
"@radix-ui/react-tooltip": "^1.0.0",
|
|
216
|
+
"@tanstack/react-query": "^5.90.0",
|
|
211
217
|
"@tanstack/react-table": "^8.0.0",
|
|
212
218
|
"clsx": "^2.0.0",
|
|
213
|
-
"
|
|
219
|
+
"date-fns": "^3.0.0",
|
|
220
|
+
"date-fns-tz": "^3.0.0",
|
|
214
221
|
"react": "^19.0.0",
|
|
215
222
|
"react-day-picker": "^9.0.0",
|
|
216
223
|
"react-dom": "^19.0.0",
|
|
@@ -246,14 +253,19 @@
|
|
|
246
253
|
},
|
|
247
254
|
"dependencies": {
|
|
248
255
|
"@hookform/resolvers": "^3.9.0",
|
|
249
|
-
"@
|
|
250
|
-
"@
|
|
251
|
-
"@
|
|
252
|
-
"
|
|
253
|
-
"
|
|
256
|
+
"@radix-ui/react-checkbox": "^1.0.0",
|
|
257
|
+
"@radix-ui/react-label": "^2.0.0",
|
|
258
|
+
"@radix-ui/react-slot": "^1.0.0",
|
|
259
|
+
"@radix-ui/react-switch": "^1.1.0",
|
|
260
|
+
"@radix-ui/react-tabs": "^1.0.0",
|
|
261
|
+
"@radix-ui/react-toast": "^1.0.0",
|
|
262
|
+
"@radix-ui/react-tooltip": "^1.0.0",
|
|
263
|
+
"@supabase/supabase-js": "^2.89.0",
|
|
264
|
+
"@tanstack/react-virtual": "^3.13.16",
|
|
254
265
|
"lodash.debounce": "^4.0.8",
|
|
255
266
|
"lodash.throttle": "^4.1.1",
|
|
267
|
+
"lucide-react": "^0.400.0",
|
|
256
268
|
"papaparse": "^5.5.3",
|
|
257
|
-
"react-is": "^19.2.
|
|
269
|
+
"react-is": "^19.2.3"
|
|
258
270
|
}
|
|
259
271
|
}
|