@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
|
@@ -0,0 +1,949 @@
|
|
|
1
|
+
# Project Structure Standards
|
|
2
|
+
|
|
3
|
+
**🤖 Cursor Rule**: See [02-project-structure.mdc](../../cursor-rules/02-project-structure.mdc) for AI-optimized directives that automatically enforce this structure.
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
This guide defines the standard project structure and file organization patterns that all apps consuming `@jmruthers/pace-core` **MUST** follow. Adhering to this structure ensures:
|
|
8
|
+
|
|
9
|
+
- **Consistency** across all PACE suite applications
|
|
10
|
+
- **Maintainability** through predictable organization
|
|
11
|
+
- **Developer Experience** with clear patterns and conventions
|
|
12
|
+
- **Compatibility** with pace-core tooling and automation
|
|
13
|
+
- **Scalability** as your app grows
|
|
14
|
+
|
|
15
|
+
## Table of Contents
|
|
16
|
+
|
|
17
|
+
1. [Standard Directory Structure](#standard-directory-structure)
|
|
18
|
+
2. [File Organization Patterns](#file-organization-patterns)
|
|
19
|
+
3. [Naming Conventions](#naming-conventions)
|
|
20
|
+
4. [Import Path Configuration](#import-path-configuration)
|
|
21
|
+
5. [Component Organization](#component-organization)
|
|
22
|
+
6. [Testing Structure](#testing-structure)
|
|
23
|
+
7. [Database & Supabase Structure](#database--supabase-structure)
|
|
24
|
+
8. [Configuration Files](#configuration-files)
|
|
25
|
+
9. [Migration from Existing Projects](#migration-from-existing-projects)
|
|
26
|
+
10. [Structure Checklist](#structure-checklist)
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Standard Directory Structure
|
|
31
|
+
|
|
32
|
+
### Complete Project Structure
|
|
33
|
+
|
|
34
|
+
Every consuming app **MUST** follow this base structure:
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
your-app/
|
|
38
|
+
├── .cursor/
|
|
39
|
+
│ └── rules/ # Cursor rules (pace-core + local)
|
|
40
|
+
│ ├── 00-standards-overview.mdc
|
|
41
|
+
│ ├── 01-pace-core-compliance.mdc
|
|
42
|
+
│ ├── 02-project-structure.mdc
|
|
43
|
+
│ └── [local-rules].mdc
|
|
44
|
+
│
|
|
45
|
+
├── .vscode/ # VS Code settings (optional)
|
|
46
|
+
│ └── settings.json
|
|
47
|
+
│
|
|
48
|
+
├── public/ # Static assets
|
|
49
|
+
│ ├── favicon.ico
|
|
50
|
+
│ ├── robots.txt
|
|
51
|
+
│ └── [other-static-assets]/
|
|
52
|
+
│
|
|
53
|
+
├── src/ # Source code
|
|
54
|
+
│ ├── components/ # App-specific components
|
|
55
|
+
│ │ ├── [feature-name]/ # Organized by feature
|
|
56
|
+
│ │ └── shared/ # Shared app components
|
|
57
|
+
│ │
|
|
58
|
+
│ ├── hooks/ # App-specific hooks
|
|
59
|
+
│ │ ├── [feature-name]/ # Feature-specific hooks
|
|
60
|
+
│ │ └── [hook-name].ts
|
|
61
|
+
│ │
|
|
62
|
+
│ ├── services/ # App-specific services (if using service pattern)
|
|
63
|
+
│ │ └── [service-name].ts
|
|
64
|
+
│ │
|
|
65
|
+
│ ├── pages/ # Page components (route components)
|
|
66
|
+
│ │ ├── [PageName].tsx
|
|
67
|
+
│ │ └── [feature]/ # Feature-based pages
|
|
68
|
+
│ │
|
|
69
|
+
│ ├── types/ # TypeScript type definitions
|
|
70
|
+
│ │ ├── [domain].ts # Domain-specific types
|
|
71
|
+
│ │ └── index.ts # Re-export barrel file
|
|
72
|
+
│ │
|
|
73
|
+
│ ├── utils/ # App-specific utilities
|
|
74
|
+
│ │ ├── [utility-name].ts
|
|
75
|
+
│ │ └── index.ts # Re-export barrel file
|
|
76
|
+
│ │
|
|
77
|
+
│ ├── lib/ # Third-party library configurations
|
|
78
|
+
│ │ └── supabase.ts # Supabase client setup
|
|
79
|
+
│ │
|
|
80
|
+
│ ├── App.tsx # Main app component
|
|
81
|
+
│ ├── main.tsx # Application entry point
|
|
82
|
+
│ └── app.css # Global styles (MUST follow 5-styling-standards.md)
|
|
83
|
+
│
|
|
84
|
+
├── supabase/ # Supabase configuration
|
|
85
|
+
│ ├── migrations/ # Database migrations
|
|
86
|
+
│ │ └── YYYYMMDDHHMMSS_description.sql
|
|
87
|
+
│ ├── functions/ # Edge functions (if used)
|
|
88
|
+
│ │ └── [function-name]/
|
|
89
|
+
│ └── config.toml # Supabase config
|
|
90
|
+
│
|
|
91
|
+
├── tests/ # Integration/E2E tests (optional)
|
|
92
|
+
│ └── [test-files].test.ts
|
|
93
|
+
│
|
|
94
|
+
├── audit/ # Audit reports (generated, gitignored)
|
|
95
|
+
│ └── audit-*.md
|
|
96
|
+
│
|
|
97
|
+
├── .gitignore
|
|
98
|
+
├── .eslintrc.js # ESLint config (or eslint.config.js)
|
|
99
|
+
├── package.json
|
|
100
|
+
├── tsconfig.json # TypeScript config
|
|
101
|
+
├── tsconfig.app.json # App-specific TS config (if needed)
|
|
102
|
+
├── vite.config.ts # Vite configuration
|
|
103
|
+
├── vitest.config.ts # Vitest configuration
|
|
104
|
+
├── README.md
|
|
105
|
+
└── CHANGELOG.md # (optional but recommended)
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Directory Purpose Reference
|
|
109
|
+
|
|
110
|
+
| Directory | Purpose | Required? |
|
|
111
|
+
|-----------|---------|-----------|
|
|
112
|
+
| `.cursor/rules/` | Cursor AI rules for code generation | ✅ Yes |
|
|
113
|
+
| `public/` | Static assets served directly | ✅ Yes |
|
|
114
|
+
| `src/` | All source code | ✅ Yes |
|
|
115
|
+
| `src/components/` | App-specific React components | ✅ Yes |
|
|
116
|
+
| `src/hooks/` | Custom React hooks | ✅ Yes |
|
|
117
|
+
| `src/pages/` | Route/page components | ✅ Yes |
|
|
118
|
+
| `src/types/` | TypeScript type definitions | ✅ Yes |
|
|
119
|
+
| `src/utils/` | Utility functions | ✅ Yes |
|
|
120
|
+
| `src/lib/` | Library configurations | ✅ Yes |
|
|
121
|
+
| `supabase/` | Supabase config and migrations | ✅ Yes |
|
|
122
|
+
| `supabase/migrations/` | Database migration files | ✅ Yes |
|
|
123
|
+
| `tests/` | Integration/E2E tests | ⚠️ Optional |
|
|
124
|
+
| `audit/` | Generated audit reports | ✅ Yes (gitignored) |
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## File Organization Patterns
|
|
129
|
+
|
|
130
|
+
### Pattern 1: Feature-Based Organization (Recommended for Small-Medium Apps)
|
|
131
|
+
|
|
132
|
+
Organize components, hooks, and related code by feature/domain:
|
|
133
|
+
|
|
134
|
+
```
|
|
135
|
+
src/
|
|
136
|
+
├── components/
|
|
137
|
+
│ ├── events/
|
|
138
|
+
│ │ ├── EventCard.tsx
|
|
139
|
+
│ │ ├── EventList.tsx
|
|
140
|
+
│ │ └── EventForm.tsx
|
|
141
|
+
│ ├── users/
|
|
142
|
+
│ │ ├── UserProfile.tsx
|
|
143
|
+
│ │ └── UserList.tsx
|
|
144
|
+
│ └── shared/
|
|
145
|
+
│ ├── AppLayout.tsx
|
|
146
|
+
│ └── Navigation.tsx
|
|
147
|
+
│
|
|
148
|
+
├── hooks/
|
|
149
|
+
│ ├── events/
|
|
150
|
+
│ │ ├── useEventData.ts
|
|
151
|
+
│ │ └── useEventForm.ts
|
|
152
|
+
│ └── users/
|
|
153
|
+
│ └── useUserData.ts
|
|
154
|
+
│
|
|
155
|
+
├── pages/
|
|
156
|
+
│ ├── EventsPage.tsx
|
|
157
|
+
│ ├── EventDetailPage.tsx
|
|
158
|
+
│ ├── UsersPage.tsx
|
|
159
|
+
│ └── UserProfilePage.tsx
|
|
160
|
+
│
|
|
161
|
+
└── types/
|
|
162
|
+
├── events.ts
|
|
163
|
+
└── users.ts
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
**When to use:** Small to medium-sized apps (< 20 features)
|
|
167
|
+
|
|
168
|
+
### Pattern 2: Domain-Driven Organization (Recommended for Large Apps)
|
|
169
|
+
|
|
170
|
+
For larger applications, organize by domain with internal structure:
|
|
171
|
+
|
|
172
|
+
```
|
|
173
|
+
src/
|
|
174
|
+
├── domains/
|
|
175
|
+
│ ├── events/
|
|
176
|
+
│ │ ├── components/
|
|
177
|
+
│ │ │ ├── EventCard.tsx
|
|
178
|
+
│ │ │ └── EventList.tsx
|
|
179
|
+
│ │ ├── hooks/
|
|
180
|
+
│ │ │ └── useEventData.ts
|
|
181
|
+
│ │ ├── services/
|
|
182
|
+
│ │ │ └── EventService.ts
|
|
183
|
+
│ │ ├── types.ts
|
|
184
|
+
│ │ └── index.ts # Domain barrel export
|
|
185
|
+
│ │
|
|
186
|
+
│ └── users/
|
|
187
|
+
│ ├── components/
|
|
188
|
+
│ ├── hooks/
|
|
189
|
+
│ ├── services/
|
|
190
|
+
│ ├── types.ts
|
|
191
|
+
│ └── index.ts
|
|
192
|
+
│
|
|
193
|
+
├── shared/ # Shared across domains
|
|
194
|
+
│ ├── components/
|
|
195
|
+
│ │ ├── Layout.tsx
|
|
196
|
+
│ │ └── Navigation.tsx
|
|
197
|
+
│ ├── hooks/
|
|
198
|
+
│ │ └── useAppConfig.ts
|
|
199
|
+
│ └── utils/
|
|
200
|
+
│ └── formatDate.ts
|
|
201
|
+
│
|
|
202
|
+
└── pages/
|
|
203
|
+
├── events/
|
|
204
|
+
│ ├── EventsListPage.tsx
|
|
205
|
+
│ └── EventDetailPage.tsx
|
|
206
|
+
└── users/
|
|
207
|
+
└── UsersPage.tsx
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
**When to use:** Large apps with multiple distinct domains (> 20 features, clear domain boundaries)
|
|
211
|
+
|
|
212
|
+
### Pattern 3: Hybrid Organization
|
|
213
|
+
|
|
214
|
+
Combine feature-based and domain-based as needed:
|
|
215
|
+
|
|
216
|
+
```
|
|
217
|
+
src/
|
|
218
|
+
├── components/
|
|
219
|
+
│ ├── events/ # Feature-based (simple features)
|
|
220
|
+
│ └── shared/ # Shared components
|
|
221
|
+
│
|
|
222
|
+
├── domains/
|
|
223
|
+
│ └── complex-feature/ # Domain-based (complex features)
|
|
224
|
+
│ ├── components/
|
|
225
|
+
│ ├── hooks/
|
|
226
|
+
│ └── services/
|
|
227
|
+
│
|
|
228
|
+
└── pages/
|
|
229
|
+
└── [pages organized by route]
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
**When to use:** Apps with mixed complexity levels
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
## Naming Conventions
|
|
237
|
+
|
|
238
|
+
### Files
|
|
239
|
+
|
|
240
|
+
| Type | Convention | Example | Notes |
|
|
241
|
+
|------|------------|---------|-------|
|
|
242
|
+
| **Components** | `PascalCase.tsx` | `EventCard.tsx` | React components |
|
|
243
|
+
| **Hooks** | `camelCase.ts` with `use` prefix | `useEventData.ts` | Custom hooks |
|
|
244
|
+
| **Utilities** | `camelCase.ts` | `formatEvent.ts` | Helper functions |
|
|
245
|
+
| **Types** | `camelCase.ts` or `types.ts` | `eventTypes.ts` | Type definitions |
|
|
246
|
+
| **Services** | `PascalCase.ts` | `EventService.ts` | Service classes |
|
|
247
|
+
| **Tests** | `*.test.ts` or `*.test.tsx` | `EventCard.test.tsx` | Test files |
|
|
248
|
+
| **Config** | `kebab-case.config.js` | `vite.config.ts` | Config files |
|
|
249
|
+
| **Pages** | `PascalCase.tsx` with `Page` suffix | `EventsPage.tsx` | Route components |
|
|
250
|
+
|
|
251
|
+
### Directories
|
|
252
|
+
|
|
253
|
+
| Type | Convention | Example | Notes |
|
|
254
|
+
|------|------------|---------|-------|
|
|
255
|
+
| **Feature directories** | `kebab-case` | `event-management/` | Feature/domain names |
|
|
256
|
+
| **Component directories** | `kebab-case` | `event-card/` | When component has multiple files |
|
|
257
|
+
| **Shared directories** | `kebab-case` | `shared/` | Shared across features |
|
|
258
|
+
|
|
259
|
+
### Code Naming
|
|
260
|
+
|
|
261
|
+
```typescript
|
|
262
|
+
// ✅ CORRECT - Components
|
|
263
|
+
export function EventCard() { }
|
|
264
|
+
export const UserProfile = () => { };
|
|
265
|
+
|
|
266
|
+
// ✅ CORRECT - Hooks
|
|
267
|
+
export function useEventData() { }
|
|
268
|
+
export function useUserProfile() { }
|
|
269
|
+
|
|
270
|
+
// ✅ CORRECT - Utilities
|
|
271
|
+
export function formatEvent() { }
|
|
272
|
+
export function validateUserInput() { }
|
|
273
|
+
|
|
274
|
+
// ✅ CORRECT - Types
|
|
275
|
+
export type Event = { };
|
|
276
|
+
export interface UserProfile { }
|
|
277
|
+
|
|
278
|
+
// ✅ CORRECT - Services
|
|
279
|
+
export class EventService { }
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
## Import Path Configuration
|
|
285
|
+
|
|
286
|
+
### Path Aliases Setup
|
|
287
|
+
|
|
288
|
+
**MUST** configure path aliases in `tsconfig.json`:
|
|
289
|
+
|
|
290
|
+
```json
|
|
291
|
+
{
|
|
292
|
+
"compilerOptions": {
|
|
293
|
+
"baseUrl": ".",
|
|
294
|
+
"paths": {
|
|
295
|
+
"@/*": ["./src/*"],
|
|
296
|
+
"@/components/*": ["./src/components/*"],
|
|
297
|
+
"@/hooks/*": ["./src/hooks/*"],
|
|
298
|
+
"@/pages/*": ["./src/pages/*"],
|
|
299
|
+
"@/types/*": ["./src/types/*"],
|
|
300
|
+
"@/utils/*": ["./src/utils/*"],
|
|
301
|
+
"@/lib/*": ["./src/lib/*"]
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
**MUST** also configure in `vite.config.ts`:
|
|
308
|
+
|
|
309
|
+
```typescript
|
|
310
|
+
import { defineConfig } from 'vite';
|
|
311
|
+
import react from '@vitejs/plugin-react';
|
|
312
|
+
import path from 'path';
|
|
313
|
+
|
|
314
|
+
export default defineConfig({
|
|
315
|
+
plugins: [react()],
|
|
316
|
+
resolve: {
|
|
317
|
+
alias: {
|
|
318
|
+
'@': path.resolve(__dirname, './src'),
|
|
319
|
+
'@/components': path.resolve(__dirname, './src/components'),
|
|
320
|
+
'@/hooks': path.resolve(__dirname, './src/hooks'),
|
|
321
|
+
'@/pages': path.resolve(__dirname, './src/pages'),
|
|
322
|
+
'@/types': path.resolve(__dirname, './src/types'),
|
|
323
|
+
'@/utils': path.resolve(__dirname, './src/utils'),
|
|
324
|
+
'@/lib': path.resolve(__dirname, './src/lib'),
|
|
325
|
+
},
|
|
326
|
+
},
|
|
327
|
+
});
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
### Import Patterns
|
|
331
|
+
|
|
332
|
+
```tsx
|
|
333
|
+
// ✅ CORRECT - Absolute imports from src
|
|
334
|
+
import { EventCard } from '@/components/events/EventCard';
|
|
335
|
+
import { useEventData } from '@/hooks/events/useEventData';
|
|
336
|
+
import { formatEvent } from '@/utils/formatEvent';
|
|
337
|
+
import type { Event } from '@/types/events';
|
|
338
|
+
|
|
339
|
+
// ✅ CORRECT - pace-core imports
|
|
340
|
+
import { Button, Card, DataTable } from '@jmruthers/pace-core';
|
|
341
|
+
import { useUnifiedAuth, usePermissions } from '@jmruthers/pace-core';
|
|
342
|
+
import { formatDate, formatCurrency } from '@jmruthers/pace-core';
|
|
343
|
+
|
|
344
|
+
// ✅ CORRECT - Relative imports for nearby files (same directory)
|
|
345
|
+
import { EventCardHeader } from './EventCardHeader';
|
|
346
|
+
import { EventCardFooter } from './EventCardFooter';
|
|
347
|
+
|
|
348
|
+
// ❌ WRONG - Deep relative imports
|
|
349
|
+
import { EventCard } from '../../../components/events/EventCard';
|
|
350
|
+
|
|
351
|
+
// ❌ WRONG - Importing from pace-core source
|
|
352
|
+
import { Button } from '@jmruthers/pace-core/src/components/Button';
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
---
|
|
356
|
+
|
|
357
|
+
## Component Organization
|
|
358
|
+
|
|
359
|
+
### Component Structure
|
|
360
|
+
|
|
361
|
+
**MUST** organize components by feature, not by type:
|
|
362
|
+
|
|
363
|
+
```
|
|
364
|
+
src/components/
|
|
365
|
+
├── events/ # ✅ Feature-based
|
|
366
|
+
│ ├── EventCard.tsx
|
|
367
|
+
│ ├── EventList.tsx
|
|
368
|
+
│ └── EventForm.tsx
|
|
369
|
+
│
|
|
370
|
+
└── shared/ # ✅ Shared app components
|
|
371
|
+
├── AppLayout.tsx
|
|
372
|
+
└── Navigation.tsx
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
```
|
|
376
|
+
src/components/
|
|
377
|
+
├── buttons/ # ❌ WRONG - Type-based
|
|
378
|
+
├── inputs/ # ❌ WRONG - Type-based
|
|
379
|
+
└── cards/ # ❌ WRONG - Type-based
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
**Why?** Use pace-core components for UI primitives (Button, Input, Card, etc.). Your components should be feature-specific compositions.
|
|
383
|
+
|
|
384
|
+
### Component File Structure
|
|
385
|
+
|
|
386
|
+
For simple components (single file):
|
|
387
|
+
|
|
388
|
+
```
|
|
389
|
+
src/components/events/EventCard.tsx
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
For complex components (multiple related files):
|
|
393
|
+
|
|
394
|
+
```
|
|
395
|
+
src/components/events/EventCard/
|
|
396
|
+
├── EventCard.tsx # Main component
|
|
397
|
+
├── EventCardHeader.tsx # Sub-components
|
|
398
|
+
├── EventCardFooter.tsx
|
|
399
|
+
├── EventCard.test.tsx # Tests (colocated)
|
|
400
|
+
├── EventCard.types.ts # Component-specific types
|
|
401
|
+
└── index.ts # Barrel export
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
### Component Composition Example
|
|
405
|
+
|
|
406
|
+
```tsx
|
|
407
|
+
// ✅ CORRECT - Use pace-core components
|
|
408
|
+
import { Button, Card, Input } from '@jmruthers/pace-core';
|
|
409
|
+
import { useEventData } from '@/hooks/events/useEventData';
|
|
410
|
+
|
|
411
|
+
export function EventCard({ eventId }: { eventId: string }) {
|
|
412
|
+
const { event } = useEventData(eventId);
|
|
413
|
+
|
|
414
|
+
return (
|
|
415
|
+
<Card>
|
|
416
|
+
<h2>{event.title}</h2>
|
|
417
|
+
<p>{event.description}</p>
|
|
418
|
+
<Button>View Details</Button>
|
|
419
|
+
</Card>
|
|
420
|
+
);
|
|
421
|
+
}
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
---
|
|
425
|
+
|
|
426
|
+
## Testing Structure
|
|
427
|
+
|
|
428
|
+
### Test Colocation
|
|
429
|
+
|
|
430
|
+
**MUST** colocate tests with source files:
|
|
431
|
+
|
|
432
|
+
```
|
|
433
|
+
src/
|
|
434
|
+
├── components/
|
|
435
|
+
│ └── events/
|
|
436
|
+
│ ├── EventCard.tsx
|
|
437
|
+
│ └── EventCard.test.tsx # ✅ Colocated
|
|
438
|
+
│
|
|
439
|
+
├── hooks/
|
|
440
|
+
│ ├── useEventData.ts
|
|
441
|
+
│ └── useEventData.test.ts # ✅ Colocated
|
|
442
|
+
│
|
|
443
|
+
└── utils/
|
|
444
|
+
├── formatEvent.ts
|
|
445
|
+
└── formatEvent.test.ts # ✅ Colocated
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
### Test File Naming
|
|
449
|
+
|
|
450
|
+
- Unit tests: `*.test.ts` or `*.test.tsx`
|
|
451
|
+
- Integration tests: `*.integration.test.ts`
|
|
452
|
+
- E2E tests: Place in `tests/` directory
|
|
453
|
+
|
|
454
|
+
### Test Organization Example
|
|
455
|
+
|
|
456
|
+
```typescript
|
|
457
|
+
// src/components/events/EventCard.test.tsx
|
|
458
|
+
import { render, screen } from '@testing-library/react';
|
|
459
|
+
import { EventCard } from './EventCard';
|
|
460
|
+
|
|
461
|
+
describe('EventCard', () => {
|
|
462
|
+
it('renders event title', () => {
|
|
463
|
+
// Test implementation
|
|
464
|
+
});
|
|
465
|
+
});
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
---
|
|
469
|
+
|
|
470
|
+
## Database & Supabase Structure
|
|
471
|
+
|
|
472
|
+
### Migration Files
|
|
473
|
+
|
|
474
|
+
**MUST** place all migrations in `supabase/migrations/`:
|
|
475
|
+
|
|
476
|
+
```
|
|
477
|
+
supabase/
|
|
478
|
+
└── migrations/
|
|
479
|
+
├── 20250115143022_add_user_preferences.sql
|
|
480
|
+
├── 20250116120000_create_events_table.sql
|
|
481
|
+
└── 20250117150000_add_rls_policies.sql
|
|
482
|
+
```
|
|
483
|
+
|
|
484
|
+
**MUST** follow naming convention: `YYYYMMDDHHMMSS_description.sql`
|
|
485
|
+
|
|
486
|
+
### Edge Functions (if used)
|
|
487
|
+
|
|
488
|
+
```
|
|
489
|
+
supabase/
|
|
490
|
+
└── functions/
|
|
491
|
+
├── send-email/
|
|
492
|
+
│ ├── index.ts
|
|
493
|
+
│ └── package.json
|
|
494
|
+
└── process-payment/
|
|
495
|
+
├── index.ts
|
|
496
|
+
└── package.json
|
|
497
|
+
```
|
|
498
|
+
|
|
499
|
+
### Supabase Client Setup
|
|
500
|
+
|
|
501
|
+
**MUST** place Supabase client in `src/lib/supabase.ts`:
|
|
502
|
+
|
|
503
|
+
```typescript
|
|
504
|
+
// src/lib/supabase.ts
|
|
505
|
+
import { createClient } from '@supabase/supabase-js';
|
|
506
|
+
import type { Database } from '@/types/database';
|
|
507
|
+
|
|
508
|
+
const supabaseUrl = import.meta.env.VITE_SUPABASE_URL;
|
|
509
|
+
const supabaseAnonKey = import.meta.env.VITE_SUPABASE_ANON_KEY;
|
|
510
|
+
|
|
511
|
+
export const supabaseClient = createClient<Database>(
|
|
512
|
+
supabaseUrl,
|
|
513
|
+
supabaseAnonKey
|
|
514
|
+
);
|
|
515
|
+
```
|
|
516
|
+
|
|
517
|
+
---
|
|
518
|
+
|
|
519
|
+
## Configuration Files
|
|
520
|
+
|
|
521
|
+
### Required Configuration Files
|
|
522
|
+
|
|
523
|
+
**MUST** have these configuration files in the root:
|
|
524
|
+
|
|
525
|
+
| File | Purpose | Required? |
|
|
526
|
+
|------|---------|-----------|
|
|
527
|
+
| `package.json` | Dependencies and scripts | ✅ Yes |
|
|
528
|
+
| `tsconfig.json` | TypeScript configuration | ✅ Yes |
|
|
529
|
+
| `vite.config.ts` | Vite build configuration | ✅ Yes |
|
|
530
|
+
| `vitest.config.ts` | Vitest test configuration | ✅ Yes |
|
|
531
|
+
| `.gitignore` | Git ignore patterns | ✅ Yes |
|
|
532
|
+
| `.eslintrc.js` or `eslint.config.js` | ESLint configuration | ✅ Yes |
|
|
533
|
+
|
|
534
|
+
### Root Directory Rules
|
|
535
|
+
|
|
536
|
+
**MUST** keep root directory clean:
|
|
537
|
+
|
|
538
|
+
✅ **Allowed in root:**
|
|
539
|
+
- Configuration files (`package.json`, `tsconfig.json`, etc.)
|
|
540
|
+
- Documentation (`README.md`, `CHANGELOG.md`)
|
|
541
|
+
- Build tool configs (`vite.config.ts`, etc.)
|
|
542
|
+
- `.cursor/` directory
|
|
543
|
+
- `.gitignore`, `.env.example`, etc.
|
|
544
|
+
|
|
545
|
+
❌ **NOT allowed in root:**
|
|
546
|
+
- Source files (`*.ts`, `*.tsx`)
|
|
547
|
+
- Component files
|
|
548
|
+
- Test files
|
|
549
|
+
- Utility files
|
|
550
|
+
|
|
551
|
+
---
|
|
552
|
+
|
|
553
|
+
## Migration from Existing Projects
|
|
554
|
+
|
|
555
|
+
### Common Migration Scenarios
|
|
556
|
+
|
|
557
|
+
This section provides patterns for migrating common project structures to the standard pace-core structure.
|
|
558
|
+
|
|
559
|
+
### Scenario 1: Flat Component Structure
|
|
560
|
+
|
|
561
|
+
**Before:**
|
|
562
|
+
```
|
|
563
|
+
src/
|
|
564
|
+
├── Button.tsx
|
|
565
|
+
├── Card.tsx
|
|
566
|
+
├── EventCard.tsx
|
|
567
|
+
├── UserCard.tsx
|
|
568
|
+
└── utils.ts
|
|
569
|
+
```
|
|
570
|
+
|
|
571
|
+
**After:**
|
|
572
|
+
```
|
|
573
|
+
src/
|
|
574
|
+
├── components/
|
|
575
|
+
│ ├── events/
|
|
576
|
+
│ │ └── EventCard.tsx
|
|
577
|
+
│ ├── users/
|
|
578
|
+
│ │ └── UserCard.tsx
|
|
579
|
+
│ └── shared/ # If Button/Card are app-specific (otherwise use pace-core)
|
|
580
|
+
├── utils/
|
|
581
|
+
│ └── index.ts
|
|
582
|
+
```
|
|
583
|
+
|
|
584
|
+
**Migration Steps:**
|
|
585
|
+
1. Group components by feature/domain
|
|
586
|
+
2. Move to `src/components/[feature]/`
|
|
587
|
+
3. Remove duplicate pace-core components (use pace-core instead)
|
|
588
|
+
4. Update imports to use path aliases
|
|
589
|
+
|
|
590
|
+
### Scenario 2: Type-Based Organization
|
|
591
|
+
|
|
592
|
+
**Before:**
|
|
593
|
+
```
|
|
594
|
+
src/
|
|
595
|
+
├── components/
|
|
596
|
+
│ ├── buttons/
|
|
597
|
+
│ ├── inputs/
|
|
598
|
+
│ └── cards/
|
|
599
|
+
└── hooks/
|
|
600
|
+
├── useButton.ts
|
|
601
|
+
└── useInput.ts
|
|
602
|
+
```
|
|
603
|
+
|
|
604
|
+
**After:**
|
|
605
|
+
```
|
|
606
|
+
src/
|
|
607
|
+
├── components/
|
|
608
|
+
│ ├── events/ # Feature-based
|
|
609
|
+
│ └── users/ # Feature-based
|
|
610
|
+
└── hooks/
|
|
611
|
+
├── events/
|
|
612
|
+
└── users/
|
|
613
|
+
```
|
|
614
|
+
|
|
615
|
+
**Migration Steps:**
|
|
616
|
+
1. Identify features/domains in your app
|
|
617
|
+
2. Reorganize by feature, not type
|
|
618
|
+
3. Use pace-core for UI primitives (Button, Input, Card)
|
|
619
|
+
4. Keep only feature-specific components
|
|
620
|
+
|
|
621
|
+
### Scenario 3: Monolithic File Structure
|
|
622
|
+
|
|
623
|
+
**Before:**
|
|
624
|
+
```
|
|
625
|
+
src/
|
|
626
|
+
├── App.tsx
|
|
627
|
+
├── components.tsx # All components in one file
|
|
628
|
+
├── hooks.ts # All hooks in one file
|
|
629
|
+
└── utils.ts # All utilities in one file
|
|
630
|
+
```
|
|
631
|
+
|
|
632
|
+
**After:**
|
|
633
|
+
```
|
|
634
|
+
src/
|
|
635
|
+
├── App.tsx
|
|
636
|
+
├── components/
|
|
637
|
+
│ ├── events/
|
|
638
|
+
│ └── users/
|
|
639
|
+
├── hooks/
|
|
640
|
+
│ ├── events/
|
|
641
|
+
│ └── users/
|
|
642
|
+
└── utils/
|
|
643
|
+
└── index.ts
|
|
644
|
+
```
|
|
645
|
+
|
|
646
|
+
**Migration Steps:**
|
|
647
|
+
1. Split monolithic files by feature
|
|
648
|
+
2. Create feature directories
|
|
649
|
+
3. Move related code together
|
|
650
|
+
4. Update imports
|
|
651
|
+
|
|
652
|
+
### Scenario 4: Mixed Root/Src Structure
|
|
653
|
+
|
|
654
|
+
**Before:**
|
|
655
|
+
```
|
|
656
|
+
your-app/
|
|
657
|
+
├── components/ # In root
|
|
658
|
+
├── src/
|
|
659
|
+
│ └── pages/
|
|
660
|
+
└── utils.ts # In root
|
|
661
|
+
```
|
|
662
|
+
|
|
663
|
+
**After:**
|
|
664
|
+
```
|
|
665
|
+
your-app/
|
|
666
|
+
└── src/
|
|
667
|
+
├── components/
|
|
668
|
+
├── pages/
|
|
669
|
+
└── utils/
|
|
670
|
+
```
|
|
671
|
+
|
|
672
|
+
**Migration Steps:**
|
|
673
|
+
1. Move all source files to `src/`
|
|
674
|
+
2. Consolidate into standard structure
|
|
675
|
+
3. Update all import paths
|
|
676
|
+
4. Update configuration files
|
|
677
|
+
|
|
678
|
+
### Step-by-Step Migration Process
|
|
679
|
+
|
|
680
|
+
#### Phase 1: Preparation
|
|
681
|
+
|
|
682
|
+
1. **Audit Current Structure**
|
|
683
|
+
```bash
|
|
684
|
+
# Review your current structure
|
|
685
|
+
tree -L 3 -I 'node_modules' src/
|
|
686
|
+
|
|
687
|
+
# Find all imports
|
|
688
|
+
grep -r "import.*from" src/ | grep -E "\.\./|\.\.\/\.\." | head -20
|
|
689
|
+
```
|
|
690
|
+
|
|
691
|
+
2. **Create Backup Branch**
|
|
692
|
+
```bash
|
|
693
|
+
git checkout -b migrate-project-structure
|
|
694
|
+
git commit -am "Backup before structure migration"
|
|
695
|
+
```
|
|
696
|
+
|
|
697
|
+
3. **Identify Features/Domains**
|
|
698
|
+
- List all features in your app
|
|
699
|
+
- Group related components/hooks/utils
|
|
700
|
+
- Identify pace-core duplicates
|
|
701
|
+
|
|
702
|
+
#### Phase 2: Structure Creation
|
|
703
|
+
|
|
704
|
+
1. **Create New Structure**
|
|
705
|
+
```bash
|
|
706
|
+
mkdir -p src/{components,hooks,pages,types,utils,lib}
|
|
707
|
+
mkdir -p src/components/{events,users,shared} # Your features
|
|
708
|
+
mkdir -p supabase/migrations
|
|
709
|
+
mkdir -p .cursor/rules
|
|
710
|
+
mkdir -p audit
|
|
711
|
+
```
|
|
712
|
+
|
|
713
|
+
2. **Move Files Incrementally**
|
|
714
|
+
- Start with one feature at a time
|
|
715
|
+
- Move components → `src/components/[feature]/`
|
|
716
|
+
- Move hooks → `src/hooks/[feature]/`
|
|
717
|
+
- Move pages → `src/pages/`
|
|
718
|
+
- Move types → `src/types/`
|
|
719
|
+
- Move utils → `src/utils/`
|
|
720
|
+
|
|
721
|
+
#### Phase 3: Import Updates
|
|
722
|
+
|
|
723
|
+
1. **Configure Path Aliases**
|
|
724
|
+
|
|
725
|
+
Update `tsconfig.json`:
|
|
726
|
+
```json
|
|
727
|
+
{
|
|
728
|
+
"compilerOptions": {
|
|
729
|
+
"baseUrl": ".",
|
|
730
|
+
"paths": {
|
|
731
|
+
"@/*": ["./src/*"],
|
|
732
|
+
"@/components/*": ["./src/components/*"],
|
|
733
|
+
"@/hooks/*": ["./src/hooks/*"],
|
|
734
|
+
"@/pages/*": ["./src/pages/*"],
|
|
735
|
+
"@/types/*": ["./src/types/*"],
|
|
736
|
+
"@/utils/*": ["./src/utils/*"]
|
|
737
|
+
}
|
|
738
|
+
}
|
|
739
|
+
}
|
|
740
|
+
```
|
|
741
|
+
|
|
742
|
+
Update `vite.config.ts`:
|
|
743
|
+
```typescript
|
|
744
|
+
import path from 'path';
|
|
745
|
+
|
|
746
|
+
export default defineConfig({
|
|
747
|
+
resolve: {
|
|
748
|
+
alias: {
|
|
749
|
+
'@': path.resolve(__dirname, './src'),
|
|
750
|
+
'@/components': path.resolve(__dirname, './src/components'),
|
|
751
|
+
// ... other aliases
|
|
752
|
+
},
|
|
753
|
+
},
|
|
754
|
+
});
|
|
755
|
+
```
|
|
756
|
+
|
|
757
|
+
2. **Update Imports**
|
|
758
|
+
|
|
759
|
+
Use find-and-replace (one feature at a time):
|
|
760
|
+
```bash
|
|
761
|
+
# Example: Update EventCard imports
|
|
762
|
+
find src -type f -name "*.tsx" -exec sed -i '' 's|from.*EventCard|from "@/components/events/EventCard"|g' {} +
|
|
763
|
+
```
|
|
764
|
+
|
|
765
|
+
#### Phase 4: Cleanup
|
|
766
|
+
|
|
767
|
+
1. **Remove Duplicate pace-core Components**
|
|
768
|
+
```bash
|
|
769
|
+
# Check for pace-core duplicates
|
|
770
|
+
node node_modules/@jmruthers/pace-core/scripts/check-pace-core-compliance.cjs
|
|
771
|
+
```
|
|
772
|
+
|
|
773
|
+
2. **Remove Empty Directories**
|
|
774
|
+
```bash
|
|
775
|
+
find src -type d -empty -delete
|
|
776
|
+
```
|
|
777
|
+
|
|
778
|
+
3. **Update Tests**
|
|
779
|
+
- Update test imports to match new structure
|
|
780
|
+
- Ensure tests still pass
|
|
781
|
+
|
|
782
|
+
#### Phase 5: Verification
|
|
783
|
+
|
|
784
|
+
1. **Install Cursor Rules**
|
|
785
|
+
```bash
|
|
786
|
+
node node_modules/@jmruthers/pace-core/scripts/install-cursor-rules.cjs
|
|
787
|
+
```
|
|
788
|
+
|
|
789
|
+
2. **Run Compliance Checks**
|
|
790
|
+
```bash
|
|
791
|
+
# Check pace-core compliance
|
|
792
|
+
node node_modules/@jmruthers/pace-core/scripts/check-pace-core-compliance.cjs
|
|
793
|
+
```
|
|
794
|
+
|
|
795
|
+
3. **Verify Build**
|
|
796
|
+
```bash
|
|
797
|
+
npm run build
|
|
798
|
+
npm run test
|
|
799
|
+
```
|
|
800
|
+
|
|
801
|
+
### Migration Checklist
|
|
802
|
+
|
|
803
|
+
- [ ] Current structure audited
|
|
804
|
+
- [ ] Backup branch created
|
|
805
|
+
- [ ] Features/domains identified
|
|
806
|
+
- [ ] New structure created
|
|
807
|
+
- [ ] Files moved incrementally
|
|
808
|
+
- [ ] Path aliases configured
|
|
809
|
+
- [ ] Imports updated
|
|
810
|
+
- [ ] Duplicate pace-core components removed
|
|
811
|
+
- [ ] Tests updated and passing
|
|
812
|
+
- [ ] Cursor rules installed
|
|
813
|
+
- [ ] Compliance checks passing
|
|
814
|
+
- [ ] Build successful
|
|
815
|
+
|
|
816
|
+
### Common Migration Issues
|
|
817
|
+
|
|
818
|
+
#### Issue: Circular Dependencies
|
|
819
|
+
|
|
820
|
+
**Problem:** Moving files creates circular imports
|
|
821
|
+
|
|
822
|
+
**Solution:**
|
|
823
|
+
- Identify circular dependencies
|
|
824
|
+
- Extract shared code to `src/utils/` or `src/types/`
|
|
825
|
+
- Use barrel exports carefully
|
|
826
|
+
|
|
827
|
+
#### Issue: Deep Relative Imports
|
|
828
|
+
|
|
829
|
+
**Problem:** Many `../../../` imports
|
|
830
|
+
|
|
831
|
+
**Solution:**
|
|
832
|
+
- Use path aliases (`@/components/...`)
|
|
833
|
+
- Update imports systematically
|
|
834
|
+
- Use find-and-replace or script
|
|
835
|
+
|
|
836
|
+
#### Issue: Test Failures
|
|
837
|
+
|
|
838
|
+
**Problem:** Tests fail after moving files
|
|
839
|
+
|
|
840
|
+
**Solution:**
|
|
841
|
+
- Update test imports
|
|
842
|
+
- Ensure path aliases work in test environment
|
|
843
|
+
- Update test setup files
|
|
844
|
+
|
|
845
|
+
---
|
|
846
|
+
|
|
847
|
+
## Structure Checklist
|
|
848
|
+
|
|
849
|
+
Before committing code, verify your project structure:
|
|
850
|
+
|
|
851
|
+
### Directory Structure
|
|
852
|
+
- [ ] Standard directory structure followed
|
|
853
|
+
- [ ] Root directory contains only config files
|
|
854
|
+
- [ ] All source code in `src/`
|
|
855
|
+
- [ ] Migrations in `supabase/migrations/`
|
|
856
|
+
- [ ] Cursor rules installed in `.cursor/rules/`
|
|
857
|
+
|
|
858
|
+
### File Organization
|
|
859
|
+
- [ ] Components organized by feature, not type
|
|
860
|
+
- [ ] Tests colocated with source files
|
|
861
|
+
- [ ] Naming conventions followed
|
|
862
|
+
- [ ] No duplicate pace-core components
|
|
863
|
+
|
|
864
|
+
### Imports
|
|
865
|
+
- [ ] Path aliases configured (`@/` prefix)
|
|
866
|
+
- [ ] Absolute imports used (no deep relative paths)
|
|
867
|
+
- [ ] pace-core imported from package, not source
|
|
868
|
+
- [ ] No restricted imports (e.g., `@radix-ui/*`)
|
|
869
|
+
|
|
870
|
+
### Configuration
|
|
871
|
+
- [ ] `tsconfig.json` has path aliases
|
|
872
|
+
- [ ] `vite.config.ts` has path aliases
|
|
873
|
+
- [ ] ESLint configured with pace-core rules
|
|
874
|
+
- [ ] All required config files present
|
|
875
|
+
|
|
876
|
+
### Documentation
|
|
877
|
+
- [ ] `README.md` documents project structure
|
|
878
|
+
- [ ] Non-standard decisions documented
|
|
879
|
+
- [ ] Migration notes (if applicable)
|
|
880
|
+
|
|
881
|
+
---
|
|
882
|
+
|
|
883
|
+
## Common Mistakes to Avoid
|
|
884
|
+
|
|
885
|
+
### ❌ Don't: Organize by Component Type
|
|
886
|
+
|
|
887
|
+
```
|
|
888
|
+
src/components/
|
|
889
|
+
├── buttons/ # ❌ Use pace-core Button instead
|
|
890
|
+
├── inputs/ # ❌ Use pace-core Input instead
|
|
891
|
+
└── cards/ # ❌ Use pace-core Card instead
|
|
892
|
+
```
|
|
893
|
+
|
|
894
|
+
### ❌ Don't: Create Duplicate Components
|
|
895
|
+
|
|
896
|
+
```tsx
|
|
897
|
+
// ❌ WRONG - Don't create local Button
|
|
898
|
+
// src/components/Button.tsx
|
|
899
|
+
export function Button() { }
|
|
900
|
+
|
|
901
|
+
// ✅ CORRECT - Use pace-core
|
|
902
|
+
import { Button } from '@jmruthers/pace-core';
|
|
903
|
+
```
|
|
904
|
+
|
|
905
|
+
### ❌ Don't: Use Deep Relative Imports
|
|
906
|
+
|
|
907
|
+
```tsx
|
|
908
|
+
// ❌ WRONG
|
|
909
|
+
import { EventCard } from '../../../components/events/EventCard';
|
|
910
|
+
|
|
911
|
+
// ✅ CORRECT
|
|
912
|
+
import { EventCard } from '@/components/events/EventCard';
|
|
913
|
+
```
|
|
914
|
+
|
|
915
|
+
### ❌ Don't: Place Source Files in Root
|
|
916
|
+
|
|
917
|
+
```
|
|
918
|
+
your-app/
|
|
919
|
+
├── App.tsx # ❌ WRONG - Should be in src/
|
|
920
|
+
├── components/ # ❌ WRONG - Should be in src/components/
|
|
921
|
+
└── utils.ts # ❌ WRONG - Should be in src/utils/
|
|
922
|
+
```
|
|
923
|
+
|
|
924
|
+
### ❌ Don't: Modify pace-core Code
|
|
925
|
+
|
|
926
|
+
```tsx
|
|
927
|
+
// ❌ WRONG - Don't import from pace-core source
|
|
928
|
+
import { Button } from '@jmruthers/pace-core/src/components/Button';
|
|
929
|
+
|
|
930
|
+
// ✅ CORRECT - Import from package
|
|
931
|
+
import { Button } from '@jmruthers/pace-core';
|
|
932
|
+
```
|
|
933
|
+
|
|
934
|
+
---
|
|
935
|
+
|
|
936
|
+
## Related Documentation
|
|
937
|
+
|
|
938
|
+
- [Standards Overview](./0-standards-overview.md) - Standards system overview
|
|
939
|
+
- [pace-core Compliance](./1-pace-core-compliance-standards.md) - pace-core usage patterns
|
|
940
|
+
- [Styling Standards](./5-styling-standards.md) - **CRITICAL: Required CSS configuration**
|
|
941
|
+
- [Code Quality](./4-code-quality-standards.md) - Code style and TypeScript standards
|
|
942
|
+
- [API & Tech Stack](./7-api-tech-stack-standards.md) - Tech stack requirements
|
|
943
|
+
- [Architecture](./3-architecture-standards.md) - Architecture principles
|
|
944
|
+
|
|
945
|
+
---
|
|
946
|
+
|
|
947
|
+
**Last Updated:** 2025-01-28
|
|
948
|
+
**Version:** 2.0.0
|
|
949
|
+
**Applies to:** All consuming apps using `@jmruthers/pace-core`
|