@jmruthers/pace-core 0.6.6 → 0.6.8
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/{scripts/audit/audit-dependencies.cjs → audit-tool/00-dependencies.cjs} +227 -22
- package/audit-tool/audits/01-pace-core-compliance.cjs +556 -0
- package/audit-tool/audits/02-project-structure.cjs +240 -0
- package/audit-tool/audits/03-architecture.cjs +224 -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 +554 -0
- package/audit-tool/audits/07-api-tech-stack.cjs +355 -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 +295 -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 +380 -0
- package/cursor-rules/00-standards-overview.mdc +156 -0
- package/cursor-rules/{00-pace-core-compliance.mdc → 01-pace-core-compliance.mdc} +187 -34
- package/cursor-rules/02-project-structure.mdc +37 -5
- package/cursor-rules/{03-solid-principles.mdc → 03-architecture.mdc} +125 -11
- package/cursor-rules/04-code-quality.mdc +419 -0
- package/cursor-rules/{08-markup-quality.mdc → 05-styling.mdc} +55 -10
- package/cursor-rules/{09-rbac-compliance.mdc → 06-security-rbac.mdc} +62 -6
- 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/DataTable-6RMSCQJ6.js +15 -0
- package/dist/{DataTable-2N_tqbfq.d.ts → DataTable-DRUIgtUH.d.ts} +1 -1
- package/dist/{PublicPageProvider-BBH6Vqg7.d.ts → PublicPageProvider-CIGSujI2.d.ts} +40 -24
- package/dist/{UnifiedAuthProvider-ZT6TIGM7.js → UnifiedAuthProvider-7SNDOWYD.js} +2 -2
- package/dist/{api-Y4MQWOFW.js → api-7P7DI652.js} +1 -1
- package/dist/{chunk-MAGBIDNS.js → chunk-4DDCYDQ3.js} +8 -7
- package/dist/{chunk-BVP2BCJF.js → chunk-5W2A3DRC.js} +10 -9
- package/dist/{chunk-SD6WQY43.js → chunk-7ILTDCL2.js} +9 -1
- package/dist/{chunk-3QC3KRHK.js → chunk-A3W6LW53.js} +16 -1
- package/dist/{chunk-3O3WHILE.js → chunk-EF2UGZWY.js} +239 -63
- package/dist/{chunk-LAZMKTTF.js → chunk-EURB7QFZ.js} +341 -337
- package/dist/{chunk-2HGJFNAH.js → chunk-FEJLJNWA.js} +1 -15
- package/dist/{chunk-7TYHROIV.js → chunk-GS5672WG.js} +55 -13
- package/dist/{chunk-UIYSCEV7.js → chunk-IUBRCBSY.js} +1 -1
- package/dist/{chunk-ZFYPMX46.js → chunk-LX6U42O3.js} +1 -1
- package/dist/{chunk-FENMYN2U.js → chunk-MPBLMWVR.js} +3 -3
- package/dist/{chunk-ZS5VO5JB.js → chunk-NKHKXPI4.js} +408 -453
- package/dist/{chunk-A55DK444.js → chunk-OJ4SKRSV.js} +1 -7
- package/dist/{chunk-4T7OBVTU.js → chunk-S6ZQKDY6.js} +1 -1
- package/dist/{chunk-FTCRZOG2.js → chunk-T5CVK4R3.js} +5 -5
- package/dist/{chunk-OHIK3MIO.js → chunk-Z2FNRKF3.js} +13 -13
- package/dist/components.d.ts +5 -4
- package/dist/components.js +29 -34
- package/dist/eslint-rules/index.cjs +22 -9
- package/{src/eslint-rules/rules/compliance.cjs → dist/eslint-rules/rules/01-pace-core-compliance.cjs} +184 -23
- package/dist/eslint-rules/rules/04-code-quality.cjs +346 -0
- package/dist/eslint-rules/rules/05-styling.cjs +61 -0
- package/dist/eslint-rules/rules/{rbac.cjs → 06-security-rbac.cjs} +34 -13
- package/dist/eslint-rules/rules/07-api-tech-stack.cjs +385 -0
- package/dist/eslint-rules/rules/08-testing.cjs +94 -0
- package/dist/{functions-DHebl8-F.d.ts → functions-lBy5L2ry.d.ts} +1 -1
- package/dist/hooks.d.ts +5 -5
- package/dist/hooks.js +8 -8
- package/dist/index.d.ts +7 -7
- package/dist/index.js +21 -20
- package/dist/providers.js +2 -2
- package/dist/rbac/index.d.ts +1 -1
- package/dist/rbac/index.js +8 -8
- package/dist/theming/runtime.d.ts +61 -1
- package/dist/theming/runtime.js +1 -1
- package/dist/{types-B-K_5VnO.d.ts → types-DXstZpNI.d.ts} +0 -17
- package/dist/types.d.ts +2 -2
- package/dist/{usePublicRouteParams-COZ28Mvq.d.ts → usePublicRouteParams-MamNgwqe.d.ts} +19 -19
- package/dist/utils.d.ts +2 -2
- package/dist/utils.js +8 -8
- package/docs/README.md +1 -1
- package/docs/api/modules.md +106 -41
- package/docs/api-reference/components.md +18 -20
- package/docs/api-reference/hooks.md +80 -80
- 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/dependencies.md +23 -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/quick-reference.md +4 -4
- package/docs/implementation-guides/app-layout.md +1 -1
- package/docs/implementation-guides/authentication.md +15 -15
- package/docs/implementation-guides/component-styling.md +1 -1
- package/docs/implementation-guides/data-tables.md +127 -34
- 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 +1 -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/README.md +5 -5
- package/docs/rbac/advanced-patterns.md +6 -6
- package/docs/rbac/api-reference.md +20 -20
- 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 -1
- 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/{00-pace-core-compliance.md → 1-pace-core-compliance-standards.md} +241 -185
- package/docs/standards/{02-project-structure.md → 2-project-structure-standards.md} +11 -47
- package/docs/standards/3-architecture-standards.md +606 -0
- package/docs/standards/4-code-quality-standards.md +728 -0
- package/docs/standards/{08-markup-quality.md → 5-styling-standards.md} +12 -9
- package/docs/standards/{09-rbac-compliance.md → 6-security-rbac-standards.md} +126 -18
- 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 +203 -104
- 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/eslint-config-pace-core.cjs +50 -20
- package/package.json +50 -19
- package/scripts/eslint-audit.cjs +123 -0
- package/scripts/install-cursor-rules.cjs +11 -243
- package/scripts/install-eslint-config.cjs +349 -0
- package/scripts/validate-dependencies.cjs +248 -0
- package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +2 -2
- package/src/__tests__/helpers/__tests__/test-providers.test.tsx +2 -2
- package/src/__tests__/helpers/__tests__/test-utils.test.tsx +30 -18
- package/src/__tests__/integration/UserProfile.test.tsx +14 -14
- package/src/__tests__/rbac/PagePermissionGuard.test.tsx +6 -6
- package/src/__tests__/templates/accessibility.test.template.tsx +10 -9
- package/src/__tests__/templates/component.test.template.tsx +18 -15
- package/src/components/AddressField/AddressField.tsx +26 -1
- package/src/components/Alert/Alert.test.tsx +86 -22
- package/src/components/Alert/Alert.tsx +19 -11
- package/src/components/Badge/Badge.tsx +1 -1
- package/src/components/Calendar/Calendar.tsx +201 -47
- package/src/components/Checkbox/Checkbox.test.tsx +2 -1
- package/src/components/ContextSelector/ContextSelector.tsx +108 -126
- package/src/components/DataTable/AUDIT_REPORT.md +293 -0
- package/src/components/DataTable/DataTable.tsx +1 -19
- package/src/components/DataTable/__tests__/DataTableCore.test.tsx +6 -2
- package/src/components/DataTable/__tests__/a11y.basic.test.tsx +21 -6
- package/src/components/DataTable/__tests__/pagination.modes.test.tsx +3 -2
- 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/DataTableErrorBoundary.tsx +9 -11
- package/src/components/DataTable/components/DataTableLayout.tsx +5 -16
- package/src/components/DataTable/components/EditableRow.tsx +5 -7
- package/src/components/DataTable/components/EmptyState.tsx +11 -10
- 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/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 +45 -27
- package/src/components/DataTable/components/index.ts +2 -1
- package/src/components/DataTable/types.ts +0 -18
- package/src/components/DataTable/utils/a11yUtils.ts +17 -0
- package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +1 -1
- package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.tsx +11 -15
- package/src/components/DateTimeField/DateTimeField.tsx +7 -8
- package/src/components/Dialog/Dialog.test.tsx +1 -0
- package/src/components/Dialog/Dialog.tsx +25 -8
- package/src/components/ErrorBoundary/ErrorBoundary.tsx +77 -79
- package/src/components/FileUpload/FileUpload.test.tsx +45 -16
- package/src/components/FileUpload/FileUpload.tsx +141 -130
- package/src/components/NavigationMenu/NavigationMenu.test.tsx +48 -12
- package/src/components/PaceAppLayout/PaceAppLayout.performance.test.tsx +9 -9
- package/src/components/PaceAppLayout/PaceAppLayout.security.test.tsx +30 -30
- package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +4 -4
- package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +7 -1
- package/src/components/Progress/Progress.tsx +2 -4
- package/src/components/ProtectedRoute/ProtectedRoute.tsx +8 -8
- package/src/components/Select/Select.tsx +86 -77
- package/src/components/Select/types.ts +3 -0
- package/src/hooks/__tests__/ServiceHooks.test.tsx +16 -16
- package/src/hooks/__tests__/hooks.integration.test.tsx +49 -49
- package/src/hooks/__tests__/useDataTablePerformance.unit.test.ts +8 -5
- package/src/hooks/__tests__/useFileUrl.unit.test.ts +4 -0
- package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +99 -99
- package/src/hooks/__tests__/useInactivityTracker.unit.test.ts +45 -8
- package/src/hooks/__tests__/usePerformanceMonitor.unit.test.ts +22 -2
- package/src/hooks/public/usePublicEvent.ts +5 -5
- package/src/hooks/public/usePublicEventLogo.ts +5 -5
- package/src/hooks/public/usePublicFileDisplay.ts +2 -2
- package/src/hooks/public/usePublicRouteParams.ts +13 -9
- package/src/hooks/useAddressAutocomplete.test.ts +18 -18
- package/src/hooks/useAppConfig.ts +2 -2
- package/src/hooks/useEventTheme.test.ts +7 -7
- package/src/hooks/useEventTheme.ts +2 -1
- package/src/hooks/useFileDisplay.ts +2 -2
- package/src/hooks/useFileUrl.ts +52 -8
- package/src/hooks/useOrganisationSecurity.test.ts +2 -1
- 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 +38 -38
- package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +103 -103
- package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +7 -7
- package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +10 -10
- package/src/rbac/__tests__/auth-rbac.e2e.test.tsx +15 -6
- package/src/rbac/__tests__/rbac-functions.test.ts +3 -3
- package/src/rbac/api.test.ts +104 -0
- package/src/rbac/engine.ts +1 -1
- package/src/rbac/hooks/useCan.test.ts +2 -2
- package/src/rbac/secureClient.ts +1 -1
- package/src/rbac/types/functions.ts +1 -1
- package/src/styles/core.css +7 -0
- package/src/theming/__tests__/parseEventColours.test.ts +118 -3
- package/src/theming/parseEventColours.ts +77 -11
- package/src/types/supabase.ts +2 -3
- package/src/utils/__tests__/bundleAnalysis.unit.test.ts +9 -9
- package/src/utils/__tests__/lazyLoad.unit.test.tsx +42 -39
- package/src/utils/file-reference/__tests__/file-reference.test.ts +4 -0
- package/src/utils/formatting/formatDate.test.ts +3 -2
- package/src/utils/formatting/formatDateTime.test.ts +2 -2
- package/src/utils/google-places/googlePlacesUtils.test.ts +36 -24
- package/src/utils/storage/README.md +1 -1
- package/src/utils/storage/__tests__/helpers.unit.test.ts +19 -12
- package/src/utils/storage/helpers.test.ts +69 -3
- package/cursor-rules/01-standards-compliance.mdc +0 -285
- package/cursor-rules/04-testing-standards.mdc +0 -270
- package/cursor-rules/05-bug-reports-and-features.mdc +0 -248
- package/cursor-rules/06-code-quality.mdc +0 -311
- package/cursor-rules/07-tech-stack-compliance.mdc +0 -216
- package/cursor-rules/10-error-handling-patterns.mdc +0 -179
- package/cursor-rules/11-performance-optimization.mdc +0 -169
- package/cursor-rules/12-ci-cd-integration.mdc +0 -150
- package/dist/DataTable-LRJL4IRV.js +0 -15
- package/dist/eslint-rules/rules/compliance.cjs +0 -348
- package/dist/eslint-rules/rules/components.cjs +0 -113
- package/dist/eslint-rules/rules/imports.cjs +0 -102
- package/docs/best-practices/README.md +0 -472
- package/docs/best-practices/accessibility.md +0 -604
- 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-standards-compliance.md +0 -188
- package/docs/standards/03-solid-principles.md +0 -39
- package/docs/standards/04-testing-standards.md +0 -36
- package/docs/standards/05-bug-reports-and-features.md +0 -27
- package/docs/standards/06-code-quality.md +0 -34
- package/docs/standards/07-tech-stack-compliance.md +0 -30
- package/docs/standards/10-error-handling-patterns.md +0 -401
- package/docs/standards/11-performance-optimization.md +0 -348
- package/docs/standards/12-ci-cd-integration.md +0 -370
- package/docs/standards/ALIGNMENT_REVIEW_SUMMARY.md +0 -192
- package/scripts/audit/audit-compliance.cjs +0 -1295
- package/scripts/audit/audit-components.cjs +0 -260
- package/scripts/audit/audit-rbac.cjs +0 -954
- package/scripts/audit/audit-standards.cjs +0 -1268
- package/scripts/audit/index.cjs +0 -1927
- package/src/components/DataTable/components/DataTableBody.tsx +0 -478
- 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/index.cjs +0 -22
- package/src/eslint-rules/rules/components.cjs +0 -113
- package/src/eslint-rules/rules/imports.cjs +0 -102
- package/src/eslint-rules/rules/rbac.cjs +0 -790
- package/src/eslint-rules/utils/helpers.cjs +0 -42
- package/src/eslint-rules/utils/manifest-loader.cjs +0 -75
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# pace-core Compliance
|
|
1
|
+
# pace-core Compliance Standards
|
|
2
2
|
|
|
3
|
-
**🤖 Cursor Rule**: See [
|
|
3
|
+
**🤖 Cursor Rule**: See [01-pace-core-compliance.mdc](../../cursor-rules/01-pace-core-compliance.mdc) for AI-optimized directives that automatically enforce these standards.
|
|
4
4
|
|
|
5
5
|
This guide explains how to enforce pace-core usage patterns in consuming apps to ensure consistent design, reduce duplication, and maintain high code quality.
|
|
6
6
|
|
|
@@ -8,8 +8,8 @@ This guide explains how to enforce pace-core usage patterns in consuming apps to
|
|
|
8
8
|
|
|
9
9
|
pace-core provides a comprehensive enforcement system that includes:
|
|
10
10
|
|
|
11
|
-
1. **ESLint Rules** - Real-time linting during development (
|
|
12
|
-
2. **
|
|
11
|
+
1. **ESLint Rules** - Real-time linting during development (organized by standards: 01, 04, 05, 06, 07, 08)
|
|
12
|
+
2. **Audit Tool** - Comprehensive system-level analysis organized by standards (01-09)
|
|
13
13
|
3. **ESLint Config Preset** - Easy setup for consuming apps
|
|
14
14
|
4. **Cursor Rules Integration** - AI-assisted enforcement via Cursor IDE
|
|
15
15
|
|
|
@@ -63,16 +63,17 @@ npm install @jmruthers/pace-core
|
|
|
63
63
|
|
|
64
64
|
### Step 2: Setup ESLint (Recommended)
|
|
65
65
|
|
|
66
|
-
**
|
|
66
|
+
**Automated Setup (Easiest)**
|
|
67
67
|
|
|
68
|
-
Use the installation script to set up
|
|
68
|
+
Use the installation script to set up ESLint:
|
|
69
69
|
|
|
70
70
|
```bash
|
|
71
|
-
|
|
71
|
+
npm run setup:eslint
|
|
72
|
+
# or
|
|
73
|
+
node node_modules/@jmruthers/pace-core/scripts/install-eslint-config.cjs
|
|
72
74
|
```
|
|
73
75
|
|
|
74
76
|
This script will:
|
|
75
|
-
- ✅ Install Cursor rules to `.cursor/rules/`
|
|
76
77
|
- ✅ Configure ESLint to use pace-core rules
|
|
77
78
|
- ✅ Create `eslint.config.js` if it doesn't exist
|
|
78
79
|
- ✅ Add pace-core config to existing ESLint config
|
|
@@ -80,8 +81,6 @@ This script will:
|
|
|
80
81
|
|
|
81
82
|
**Options:**
|
|
82
83
|
- `--force` - Force update even if already configured
|
|
83
|
-
- `--skip-cursor` - Skip Cursor rules installation
|
|
84
|
-
- `--skip-eslint` - Skip ESLint config setup
|
|
85
84
|
|
|
86
85
|
**Option B: Manual Setup**
|
|
87
86
|
|
|
@@ -132,9 +131,41 @@ export default [
|
|
|
132
131
|
];
|
|
133
132
|
```
|
|
134
133
|
|
|
134
|
+
**Example with `tseslint.config()` wrapper:**
|
|
135
|
+
```javascript
|
|
136
|
+
// eslint.config.js
|
|
137
|
+
import tseslint from 'typescript-eslint';
|
|
138
|
+
import paceCoreConfig from '@jmruthers/pace-core/eslint-config';
|
|
139
|
+
|
|
140
|
+
export default tseslint.config(
|
|
141
|
+
...paceCoreConfig, // Spread pace-core config as first arguments
|
|
142
|
+
// your other config objects
|
|
143
|
+
);
|
|
144
|
+
```
|
|
145
|
+
|
|
135
146
|
### Step 3: Setup Cursor Rules (Optional but Recommended)
|
|
136
147
|
|
|
137
|
-
|
|
148
|
+
**Automated Setup (Easiest)**
|
|
149
|
+
|
|
150
|
+
Use the installation script to set up Cursor rules:
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
npm run setup:cursor-rules
|
|
154
|
+
# or
|
|
155
|
+
node node_modules/@jmruthers/pace-core/scripts/install-cursor-rules.cjs
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
This script will:
|
|
159
|
+
- ✅ Install Cursor rules to `.cursor/rules/`
|
|
160
|
+
- ✅ Create backups before updating existing rules
|
|
161
|
+
- ✅ Automatically update pace-core rules when they change
|
|
162
|
+
|
|
163
|
+
**Options:**
|
|
164
|
+
- `--force` - Force update even if already configured
|
|
165
|
+
|
|
166
|
+
**Manual Setup (Alternative)**
|
|
167
|
+
|
|
168
|
+
To manually enable AI-assisted enforcement in Cursor IDE, copy the pace-core cursor rules to your project:
|
|
138
169
|
|
|
139
170
|
```bash
|
|
140
171
|
# Create .cursor/rules directory if it doesn't exist
|
|
@@ -144,7 +175,7 @@ mkdir -p .cursor/rules
|
|
|
144
175
|
cp node_modules/@jmruthers/pace-core/cursor-rules/*.mdc .cursor/rules/
|
|
145
176
|
```
|
|
146
177
|
|
|
147
|
-
Or manually create `.cursor/rules/
|
|
178
|
+
Or manually create `.cursor/rules/01-pace-core-compliance.mdc` and reference the pace-core rules:
|
|
148
179
|
|
|
149
180
|
```markdown
|
|
150
181
|
---
|
|
@@ -155,7 +186,7 @@ alwaysApply: false
|
|
|
155
186
|
|
|
156
187
|
# pace-core Compliance
|
|
157
188
|
|
|
158
|
-
**📚 Full Documentation**: See [pace-core compliance docs](node_modules/@jmruthers/pace-core/docs/standards/
|
|
189
|
+
**📚 Full Documentation**: See [pace-core compliance docs](node_modules/@jmruthers/pace-core/docs/standards/1-pace-core-compliance-standards.md)
|
|
159
190
|
|
|
160
191
|
**🔧 ESLint Setup**: Ensure ESLint is configured with `@jmruthers/pace-core/eslint-config`
|
|
161
192
|
|
|
@@ -179,63 +210,32 @@ See the full documentation for complete rules and examples.
|
|
|
179
210
|
- Works alongside ESLint for comprehensive enforcement
|
|
180
211
|
- Provides explanations and examples in real-time
|
|
181
212
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
If you prefer more control, you can import the rules directly. Note: The rules are CommonJS, so use `createRequire` in ES modules:
|
|
213
|
+
## ESLint Rules
|
|
185
214
|
|
|
186
|
-
|
|
187
|
-
```javascript
|
|
188
|
-
// eslint.config.js
|
|
189
|
-
import { createRequire } from 'module';
|
|
190
|
-
const require = createRequire(import.meta.url);
|
|
191
|
-
const paceCoreRules = require('@jmruthers/pace-core/eslint-rules').rules;
|
|
215
|
+
pace-core provides ESLint rules organized by standards (01, 04, 05, 06, 07, 08). Rules are organized to match the 10-file standards structure:
|
|
192
216
|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
},
|
|
200
|
-
rules: {
|
|
201
|
-
'pace-core-compliance/no-restricted-imports': 'error',
|
|
202
|
-
'pace-core-compliance/prefer-pace-core-components': 'warn',
|
|
203
|
-
'pace-core-compliance/prefer-pace-core-hooks': 'warn',
|
|
204
|
-
'pace-core-compliance/prefer-pace-core-utils': 'warn',
|
|
205
|
-
'pace-core-compliance/no-local-component-duplication': 'error'
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
];
|
|
209
|
-
```
|
|
217
|
+
- **Standard 1 (pace-core Compliance)**: 6 rules
|
|
218
|
+
- **Standard 4 (Code Quality)**: 3 rules
|
|
219
|
+
- **Standard 5 (Styling)**: 1 rule
|
|
220
|
+
- **Standard 6 (Security & RBAC)**: 8 rules
|
|
221
|
+
- **Standard 7 (API & Tech Stack)**: 3 rules
|
|
222
|
+
- **Standard 8 (Testing)**: 1 rule
|
|
210
223
|
|
|
211
|
-
**
|
|
212
|
-
```javascript
|
|
213
|
-
// eslint.config.cjs
|
|
214
|
-
const paceCoreRules = require('@jmruthers/pace-core/eslint-rules').rules;
|
|
224
|
+
**Total: 22 rules** organized across 6 standards files.
|
|
215
225
|
|
|
216
|
-
|
|
217
|
-
{
|
|
218
|
-
plugins: {
|
|
219
|
-
'pace-core-compliance': {
|
|
220
|
-
rules: paceCoreRules
|
|
221
|
-
}
|
|
222
|
-
},
|
|
223
|
-
rules: {
|
|
224
|
-
'pace-core-compliance/no-restricted-imports': 'error',
|
|
225
|
-
'pace-core-compliance/prefer-pace-core-components': 'warn',
|
|
226
|
-
'pace-core-compliance/prefer-pace-core-hooks': 'warn',
|
|
227
|
-
'pace-core-compliance/prefer-pace-core-utils': 'warn',
|
|
228
|
-
'pace-core-compliance/no-local-component-duplication': 'error'
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
];
|
|
232
|
-
```
|
|
226
|
+
### Rule Organization
|
|
233
227
|
|
|
234
|
-
|
|
228
|
+
Rules are organized in `packages/core/eslint-rules/rules/`:
|
|
229
|
+
- `01-pace-core-compliance.cjs` - pace-core usage patterns
|
|
230
|
+
- `04-code-quality.cjs` - Naming conventions, component/type naming
|
|
231
|
+
- `05-styling.cjs` - Inline styles
|
|
232
|
+
- `06-security-rbac.cjs` - Security and RBAC patterns
|
|
233
|
+
- `07-api-tech-stack.cjs` - RPC naming, React 19+, import.meta.env
|
|
234
|
+
- `08-testing.cjs` - Test file naming
|
|
235
235
|
|
|
236
|
-
|
|
236
|
+
### Detailed Rule Descriptions
|
|
237
237
|
|
|
238
|
-
|
|
238
|
+
#### Import Rules
|
|
239
239
|
|
|
240
240
|
#### no-restricted-imports
|
|
241
241
|
|
|
@@ -603,25 +603,6 @@ The script generates a color-coded terminal report showing:
|
|
|
603
603
|
- 💡 **Suggestions** - Recommendations for improvement
|
|
604
604
|
- ✅ **Summary** - Overall compliance status
|
|
605
605
|
|
|
606
|
-
Example output:
|
|
607
|
-
```
|
|
608
|
-
═══════════════════════════════════════════════════════════
|
|
609
|
-
pace-core Compliance Report
|
|
610
|
-
═══════════════════════════════════════════════════════════
|
|
611
|
-
|
|
612
|
-
❌ Restricted Imports Found: 3
|
|
613
|
-
|
|
614
|
-
• src/components/CustomDialog.tsx:5
|
|
615
|
-
Import: @radix-ui/react-dialog
|
|
616
|
-
Reason: Use Dialog component from pace-core instead
|
|
617
|
-
|
|
618
|
-
Summary:
|
|
619
|
-
Total Issues: 3
|
|
620
|
-
- Restricted Imports: 3
|
|
621
|
-
- Duplicate Components/Hooks/Utils: 0
|
|
622
|
-
- Suggestions: 0
|
|
623
|
-
```
|
|
624
|
-
|
|
625
606
|
## Best Practices
|
|
626
607
|
|
|
627
608
|
### 1. Always Import from pace-core
|
|
@@ -683,116 +664,93 @@ Before creating a new component, check if pace-core already provides it:
|
|
|
683
664
|
2. Check `core-usage-manifest.json` for available components
|
|
684
665
|
3. Search pace-core exports
|
|
685
666
|
|
|
686
|
-
##
|
|
687
|
-
|
|
688
|
-
### ESLint Rules Not Working
|
|
689
|
-
|
|
690
|
-
1. **Verify plugin is loaded**: Check that the config is imported correctly:
|
|
691
|
-
```javascript
|
|
692
|
-
// In your eslint.config.js, add temporarily:
|
|
693
|
-
import paceCoreConfig from '@jmruthers/pace-core/eslint-config';
|
|
694
|
-
console.log('Config:', paceCoreConfig);
|
|
695
|
-
console.log('Has plugins:', paceCoreConfig[0]?.plugins);
|
|
696
|
-
```
|
|
697
|
-
|
|
698
|
-
2. **Check rule names**: Rules must be prefixed with `pace-core-compliance/`
|
|
667
|
+
## MUST: Provider Nesting Order
|
|
699
668
|
|
|
700
|
-
|
|
669
|
+
**⚠️ CRITICAL: Provider nesting order matters!** Incorrect nesting causes React context errors.
|
|
701
670
|
|
|
702
|
-
|
|
703
|
-
- Ensure you're using the config preset (Option 1) which handles this automatically
|
|
704
|
-
- Or use `createRequire` when importing rules directly (Option 2)
|
|
671
|
+
**MUST** nest providers in this exact order (outermost to innermost):
|
|
705
672
|
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
673
|
+
1. `QueryClientProvider` (outermost)
|
|
674
|
+
2. `BrowserRouter`
|
|
675
|
+
3. `UnifiedAuthProvider`
|
|
676
|
+
4. `OrganisationProvider`
|
|
677
|
+
5. `App` (innermost)
|
|
710
678
|
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
### Static Analysis Script Errors
|
|
718
|
-
|
|
719
|
-
1. **Manifest not found**: Ensure `core-usage-manifest.json` exists in pace-core package
|
|
720
|
-
2. **No files scanned**: Check that you're running from the project root
|
|
721
|
-
3. **Permission errors**: Ensure script has read access to source files
|
|
722
|
-
|
|
723
|
-
### False Positives
|
|
724
|
-
|
|
725
|
-
If you encounter false positives:
|
|
726
|
-
|
|
727
|
-
1. **Component name conflicts**: If you have a legitimate reason to create a local component with a pace-core name, consider:
|
|
728
|
-
- Renaming your component
|
|
729
|
-
- Using a namespace/prefix
|
|
730
|
-
- Documenting why pace-core doesn't meet your needs
|
|
731
|
-
|
|
732
|
-
2. **Hook/Util patterns**: The pattern matching may flag similar names. Review the suggestion and decide if migration makes sense.
|
|
733
|
-
|
|
734
|
-
## Integration with CI/CD
|
|
735
|
-
|
|
736
|
-
While CI/CD integration is not included in the initial release, you can easily add it:
|
|
737
|
-
|
|
738
|
-
```yaml
|
|
739
|
-
# .github/workflows/pace-core-compliance.yml
|
|
740
|
-
name: pace-core Compliance
|
|
679
|
+
```tsx
|
|
680
|
+
// ✅ CORRECT: main.tsx
|
|
681
|
+
import { BrowserRouter } from 'react-router-dom';
|
|
682
|
+
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
|
|
683
|
+
import { UnifiedAuthProvider, OrganisationProvider } from '@jmruthers/pace-core';
|
|
684
|
+
import { createClient } from '@supabase/supabase-js';
|
|
741
685
|
|
|
742
|
-
|
|
686
|
+
const queryClient = new QueryClient();
|
|
687
|
+
const supabase = createClient(
|
|
688
|
+
import.meta.env.VITE_SUPABASE_URL,
|
|
689
|
+
import.meta.env.VITE_SUPABASE_PUBLISHABLE_KEY
|
|
690
|
+
);
|
|
743
691
|
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
692
|
+
createRoot(document.getElementById("root")!).render(
|
|
693
|
+
<QueryClientProvider client={queryClient}>
|
|
694
|
+
<BrowserRouter>
|
|
695
|
+
<UnifiedAuthProvider supabaseClient={supabase} appName="YourApp">
|
|
696
|
+
<OrganisationProvider>
|
|
697
|
+
<App />
|
|
698
|
+
</OrganisationProvider>
|
|
699
|
+
</UnifiedAuthProvider>
|
|
700
|
+
</BrowserRouter>
|
|
701
|
+
</QueryClientProvider>
|
|
702
|
+
);
|
|
753
703
|
```
|
|
754
704
|
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
1. **Check ESLint can load the config**:
|
|
760
|
-
```bash
|
|
761
|
-
npx eslint --print-config src/App.tsx
|
|
762
|
-
```
|
|
763
|
-
Look for `pace-core-compliance` in the plugins section.
|
|
764
|
-
|
|
765
|
-
2. **Test with a violation**: Create a test file that imports a restricted library:
|
|
766
|
-
```typescript
|
|
767
|
-
// test-violation.ts
|
|
768
|
-
import { Dialog } from '@radix-ui/react-dialog'; // Should trigger error
|
|
769
|
-
```
|
|
770
|
-
Run ESLint and verify it reports the violation.
|
|
705
|
+
**Common mistakes to avoid:**
|
|
706
|
+
- ❌ `BrowserRouter` inside `UnifiedAuthProvider` (causes Router context errors)
|
|
707
|
+
- ❌ `UnifiedAuthProvider` wrapping `BrowserRouter` (causes context errors)
|
|
708
|
+
- ❌ Missing `BrowserRouter` (causes `useNavigate` errors)
|
|
771
709
|
|
|
772
|
-
|
|
773
|
-
```bash
|
|
774
|
-
npm run check:pace-core
|
|
775
|
-
```
|
|
710
|
+
## MUST: Vite Configuration
|
|
776
711
|
|
|
777
|
-
|
|
712
|
+
**⚠️ CRITICAL: Vite configuration prevents React context mismatches!**
|
|
778
713
|
|
|
779
|
-
|
|
780
|
-
- **Issues**: Report false positives or rule issues
|
|
781
|
-
- **Manifest**: Check `core-usage-manifest.json` for available exports
|
|
782
|
-
- **ESLint Config**: The config file is at `@jmruthers/pace-core/eslint-config` (CommonJS)
|
|
783
|
-
- **ESLint Rules**: The rules are at `@jmruthers/pace-core/eslint-rules` (CommonJS)
|
|
714
|
+
**MUST** configure Vite to exclude `@jmruthers/pace-core` and `react-router-dom` from pre-bundling:
|
|
784
715
|
|
|
785
|
-
|
|
716
|
+
```typescript
|
|
717
|
+
// vite.config.ts
|
|
718
|
+
import { defineConfig } from 'vite';
|
|
719
|
+
import react from '@vitejs/plugin-react';
|
|
720
|
+
import path from 'path';
|
|
721
|
+
|
|
722
|
+
export default defineConfig({
|
|
723
|
+
plugins: [react()],
|
|
724
|
+
resolve: {
|
|
725
|
+
alias: {
|
|
726
|
+
'@': path.resolve(__dirname, './src'),
|
|
727
|
+
},
|
|
728
|
+
// CRITICAL: Dedupe React dependencies
|
|
729
|
+
dedupe: ['react', 'react-dom', 'react-router-dom'],
|
|
730
|
+
},
|
|
731
|
+
optimizeDeps: {
|
|
732
|
+
include: [
|
|
733
|
+
'react',
|
|
734
|
+
'react-dom',
|
|
735
|
+
'react/jsx-runtime',
|
|
736
|
+
],
|
|
737
|
+
// CRITICAL: Exclude pace-core to prevent React context mismatches
|
|
738
|
+
exclude: ['@jmruthers/pace-core', 'react-router-dom'],
|
|
739
|
+
},
|
|
740
|
+
});
|
|
741
|
+
```
|
|
786
742
|
|
|
787
|
-
|
|
743
|
+
**Why this matters:**
|
|
744
|
+
- Pre-bundling `@jmruthers/pace-core` creates separate React instances
|
|
745
|
+
- This causes "useUnifiedAuth must be used within a UnifiedAuthProvider" errors
|
|
746
|
+
- Excluding it ensures pace-core uses the same React instance as your app
|
|
747
|
+
- `react-router-dom` must also be excluded and deduped to prevent Router context errors
|
|
788
748
|
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
- **Manifest**: `node_modules/@jmruthers/pace-core/core-usage-manifest.json`
|
|
795
|
-
- **Cursor Rules**: `node_modules/@jmruthers/pace-core/cursor-rules/*.mdc`
|
|
749
|
+
**If you encounter context errors:**
|
|
750
|
+
1. Verify `@jmruthers/pace-core` is in `optimizeDeps.exclude`
|
|
751
|
+
2. Verify `react-router-dom` is in both `resolve.dedupe` and `optimizeDeps.exclude`
|
|
752
|
+
3. Clear Vite cache: `rm -rf node_modules/.vite`
|
|
753
|
+
4. Restart dev server
|
|
796
754
|
|
|
797
755
|
## MUST: Use Secure Supabase Client
|
|
798
756
|
|
|
@@ -906,7 +864,23 @@ function useSecureSupabase(
|
|
|
906
864
|
|
|
907
865
|
**NO OTHER EXCEPTIONS ARE PERMITTED** - All other uses of `createClient()` are security violations and MUST be fixed.
|
|
908
866
|
|
|
909
|
-
### Detection / Audit
|
|
867
|
+
### Detection / Audit Tool
|
|
868
|
+
|
|
869
|
+
The audit tool (`npm run audit:pace-core`) performs comprehensive system-level analysis organized by standards:
|
|
870
|
+
|
|
871
|
+
- **Standard 1 (pace-core Compliance)**: Provider nesting, core styles import, RBAC setup, Vite aliases, secure Supabase client location, Cursor rules, ESLint config
|
|
872
|
+
- **Standard 2 (Project Structure)**: Directory structure, config files, import paths, test colocation, Supabase structure
|
|
873
|
+
- **Standard 3 (Architecture)**: Component boundaries, ApiResult usage
|
|
874
|
+
- **Standard 4 (Code Quality)**: TypeScript config, test coverage config
|
|
875
|
+
- **Standard 5 (Styling)**: app.css structure, Tailwind v4 config
|
|
876
|
+
- **Standard 6 (Security & RBAC)**: RLS policies, PagePermissionGuard coverage, Edge Functions RBAC
|
|
877
|
+
- **Standard 7 (API & Tech Stack)**: RPC naming in SQL, tech stack versions, Vite config
|
|
878
|
+
- **Standard 8 (Testing & Documentation)**: Test timeout config, testing tools, test structure
|
|
879
|
+
- **Standard 9 (Operations)**: Error handling patterns, CI/CD config, error boundaries
|
|
880
|
+
|
|
881
|
+
**Reference**: See [packages/core/audit-tool/](../../audit-tool/) for audit tool implementation.
|
|
882
|
+
|
|
883
|
+
### Detection / Audit (Legacy)
|
|
910
884
|
|
|
911
885
|
- `rg "createClient\(" src` must return **exactly ONE match** in the file that creates the base client for `UnifiedAuthProvider`.
|
|
912
886
|
- That file MUST be one of: `main.tsx`, `App.tsx`, or `lib/supabase.ts` (or `.jsx`/`.js` equivalents).
|
|
@@ -938,8 +912,10 @@ If you encounter a situation where a rule seems to conflict with a legitimate re
|
|
|
938
912
|
**Example of proper documentation:**
|
|
939
913
|
```tsx
|
|
940
914
|
// @pace-core-compliance-exception: Legacy integration requires direct Supabase client
|
|
941
|
-
//
|
|
942
|
-
//
|
|
915
|
+
// Reason: Third-party service requires unauthenticated client for initial handshake
|
|
916
|
+
// Migration plan: Migrate to useSecureSupabase() when legacy system is updated (Q2 2025)
|
|
917
|
+
// Tracking issue: https://github.com/your-org/pace-core/issues/123
|
|
918
|
+
// Expected removal date: Q2 2025
|
|
943
919
|
const legacyClient = createClient(...);
|
|
944
920
|
```
|
|
945
921
|
|
|
@@ -958,10 +934,90 @@ During audits, documented exceptions will be:
|
|
|
958
934
|
|
|
959
935
|
**Invalid exceptions** (undocumented, unnecessary, or security-related) will be flagged as violations requiring remediation.
|
|
960
936
|
|
|
937
|
+
## Troubleshooting
|
|
938
|
+
|
|
939
|
+
### ESLint Setup Issues
|
|
940
|
+
|
|
941
|
+
**Error: "Could not find 'no-restricted-imports' in plugin 'pace-core-compliance'"**
|
|
942
|
+
- **Cause**: This rule was removed from the plugin (it's now handled by standard ESLint `no-restricted-imports`)
|
|
943
|
+
- **Fix**: Update to the latest version of `@jmruthers/pace-core` and run `npm run setup:eslint --force`
|
|
944
|
+
|
|
945
|
+
**Error: "TypeError: Unexpected array" when using `tseslint.config()`**
|
|
946
|
+
- **Cause**: Incorrect spreading of `paceCoreConfig` in `tseslint.config()` wrapper
|
|
947
|
+
- **Fix**: Run `npm run setup:eslint --force` to fix the config structure, or manually ensure `paceCoreConfig` is spread correctly:
|
|
948
|
+
```javascript
|
|
949
|
+
import paceCoreConfig from '@jmruthers/pace-core/eslint-config';
|
|
950
|
+
|
|
951
|
+
export default tseslint.config(
|
|
952
|
+
...paceCoreConfig, // Spread here, not nested
|
|
953
|
+
// your other config
|
|
954
|
+
);
|
|
955
|
+
```
|
|
956
|
+
|
|
957
|
+
**ESLint rules not loading**
|
|
958
|
+
- **Cause**: Path resolution issues or rules not copied to `dist/`
|
|
959
|
+
- **Fix**:
|
|
960
|
+
1. Ensure `@jmruthers/pace-core` is built: `npm run build` in pace-core
|
|
961
|
+
2. Check that `node_modules/@jmruthers/pace-core/dist/eslint-rules/` exists
|
|
962
|
+
3. Run `npm run setup:eslint --force` to regenerate config
|
|
963
|
+
|
|
964
|
+
### ESLint Rules Not Working
|
|
965
|
+
|
|
966
|
+
1. **Verify plugin is loaded**: Check that the config is imported correctly
|
|
967
|
+
2. **Check rule names**: Rules must be prefixed with `pace-core-compliance/`
|
|
968
|
+
3. **Verify manifest exists**: Rules load from `core-usage-manifest.json` in the pace-core package
|
|
969
|
+
4. **CommonJS/ES Module issues**: If you're using ES modules and rules aren't loading, ensure you're using the config preset which handles this automatically
|
|
970
|
+
5. **Verify rules are available**: Check that the rules file exists
|
|
971
|
+
6. **Check rule count**: Verify all rules are loaded
|
|
972
|
+
|
|
973
|
+
### Static Analysis Script Errors
|
|
974
|
+
|
|
975
|
+
1. **Manifest not found**: Ensure `core-usage-manifest.json` exists in pace-core package
|
|
976
|
+
2. **No files scanned**: Check that you're running from the project root
|
|
977
|
+
3. **Permission errors**: Ensure script has read access to source files
|
|
978
|
+
|
|
979
|
+
### False Positives
|
|
980
|
+
|
|
981
|
+
If you encounter false positives:
|
|
982
|
+
|
|
983
|
+
1. **Component name conflicts**: If you have a legitimate reason to create a local component with a pace-core name, consider:
|
|
984
|
+
- Renaming your component
|
|
985
|
+
- Using a namespace/prefix
|
|
986
|
+
- Documenting why pace-core doesn't meet your needs
|
|
987
|
+
|
|
988
|
+
2. **Hook/Util patterns**: The pattern matching may flag similar names. Review the suggestion and decide if migration makes sense.
|
|
989
|
+
|
|
990
|
+
## Verification
|
|
991
|
+
|
|
992
|
+
After setting up the ESLint config, verify it's working:
|
|
993
|
+
|
|
994
|
+
1. **Check ESLint can load the config**:
|
|
995
|
+
```bash
|
|
996
|
+
npx eslint --print-config src/App.tsx
|
|
997
|
+
```
|
|
998
|
+
Look for `pace-core-compliance` in the plugins section.
|
|
999
|
+
|
|
1000
|
+
2. **Test with a violation**: Create a test file that imports a restricted library:
|
|
1001
|
+
```typescript
|
|
1002
|
+
// test-violation.ts
|
|
1003
|
+
import { Dialog } from '@radix-ui/react-dialog'; // Should trigger error
|
|
1004
|
+
```
|
|
1005
|
+
Run ESLint and verify it reports the violation.
|
|
1006
|
+
|
|
1007
|
+
3. **Run static analysis**: Use the compliance script to get a full report:
|
|
1008
|
+
```bash
|
|
1009
|
+
npm run check:pace-core
|
|
1010
|
+
```
|
|
1011
|
+
|
|
961
1012
|
## Related Documentation
|
|
962
1013
|
|
|
963
|
-
- [
|
|
964
|
-
- [
|
|
965
|
-
- [
|
|
966
|
-
- [
|
|
1014
|
+
- [Standards Overview](./0-standards-overview.md) - Standards system overview
|
|
1015
|
+
- [Project Structure](./2-project-structure-standards.md) - Project structure and organization
|
|
1016
|
+
- [Security & RBAC](./6-security-rbac-standards.md) - RBAC and security standards
|
|
1017
|
+
- [API & Tech Stack](./7-api-tech-stack-standards.md) - API and tech stack standards
|
|
1018
|
+
|
|
1019
|
+
---
|
|
967
1020
|
|
|
1021
|
+
**Last Updated:** 2025-01-28
|
|
1022
|
+
**Version:** 2.0.0
|
|
1023
|
+
**Applies to:** All consuming apps using `@jmruthers/pace-core`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Project Structure
|
|
1
|
+
# Project Structure Standards
|
|
2
2
|
|
|
3
3
|
**🤖 Cursor Rule**: See [02-project-structure.mdc](../../cursor-rules/02-project-structure.mdc) for AI-optimized directives that automatically enforce this structure.
|
|
4
4
|
|
|
@@ -37,8 +37,8 @@ Every consuming app **MUST** follow this base structure:
|
|
|
37
37
|
your-app/
|
|
38
38
|
├── .cursor/
|
|
39
39
|
│ └── rules/ # Cursor rules (pace-core + local)
|
|
40
|
-
│ ├── 00-
|
|
41
|
-
│ ├── 01-
|
|
40
|
+
│ ├── 00-standards-overview.mdc
|
|
41
|
+
│ ├── 01-pace-core-compliance.mdc
|
|
42
42
|
│ ├── 02-project-structure.mdc
|
|
43
43
|
│ └── [local-rules].mdc
|
|
44
44
|
│
|
|
@@ -79,7 +79,7 @@ your-app/
|
|
|
79
79
|
│ │
|
|
80
80
|
│ ├── App.tsx # Main app component
|
|
81
81
|
│ ├── main.tsx # Application entry point
|
|
82
|
-
│ └── app.css # Global styles (MUST follow
|
|
82
|
+
│ └── app.css # Global styles (MUST follow 5-styling-standards.md)
|
|
83
83
|
│
|
|
84
84
|
├── supabase/ # Supabase configuration
|
|
85
85
|
│ ├── migrations/ # Database migrations
|
|
@@ -762,12 +762,6 @@ your-app/
|
|
|
762
762
|
find src -type f -name "*.tsx" -exec sed -i '' 's|from.*EventCard|from "@/components/events/EventCard"|g' {} +
|
|
763
763
|
```
|
|
764
764
|
|
|
765
|
-
Or use a script:
|
|
766
|
-
```typescript
|
|
767
|
-
// scripts/update-imports.ts
|
|
768
|
-
// Update imports programmatically
|
|
769
|
-
```
|
|
770
|
-
|
|
771
765
|
#### Phase 4: Cleanup
|
|
772
766
|
|
|
773
767
|
1. **Remove Duplicate pace-core Components**
|
|
@@ -796,7 +790,6 @@ your-app/
|
|
|
796
790
|
```bash
|
|
797
791
|
# Check pace-core compliance
|
|
798
792
|
node node_modules/@jmruthers/pace-core/scripts/check-pace-core-compliance.cjs
|
|
799
|
-
|
|
800
793
|
```
|
|
801
794
|
|
|
802
795
|
3. **Verify Build**
|
|
@@ -849,26 +842,6 @@ your-app/
|
|
|
849
842
|
- Ensure path aliases work in test environment
|
|
850
843
|
- Update test setup files
|
|
851
844
|
|
|
852
|
-
### Migration Tools
|
|
853
|
-
|
|
854
|
-
**Automated Import Updates:**
|
|
855
|
-
```bash
|
|
856
|
-
# Using jscodeshift (if available)
|
|
857
|
-
npx jscodeshift -t transform-imports src/
|
|
858
|
-
```
|
|
859
|
-
|
|
860
|
-
**Manual Find-and-Replace:**
|
|
861
|
-
```bash
|
|
862
|
-
# Update specific import patterns
|
|
863
|
-
find src -type f -name "*.tsx" -exec sed -i '' 's|old/path|new/path|g' {} +
|
|
864
|
-
```
|
|
865
|
-
|
|
866
|
-
**TypeScript Compiler:**
|
|
867
|
-
```bash
|
|
868
|
-
# Check for import errors
|
|
869
|
-
npx tsc --noEmit
|
|
870
|
-
```
|
|
871
|
-
|
|
872
845
|
---
|
|
873
846
|
|
|
874
847
|
## Structure Checklist
|
|
@@ -960,26 +933,17 @@ import { Button } from '@jmruthers/pace-core';
|
|
|
960
933
|
|
|
961
934
|
---
|
|
962
935
|
|
|
963
|
-
## Getting Help
|
|
964
|
-
|
|
965
|
-
- **Documentation**: See [pace-core documentation](../../README.md)
|
|
966
|
-
- **Standards**: Review other standards in this directory
|
|
967
|
-
- **Cursor Rules**: Check `.cursor/rules/` for automated enforcement
|
|
968
|
-
|
|
969
|
-
---
|
|
970
|
-
|
|
971
936
|
## Related Documentation
|
|
972
937
|
|
|
973
|
-
- [
|
|
974
|
-
- [
|
|
975
|
-
- [
|
|
976
|
-
- [
|
|
977
|
-
- [
|
|
978
|
-
- [
|
|
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
|
|
979
944
|
|
|
980
945
|
---
|
|
981
946
|
|
|
982
947
|
**Last Updated:** 2025-01-28
|
|
983
|
-
**Version:**
|
|
948
|
+
**Version:** 2.0.0
|
|
984
949
|
**Applies to:** All consuming apps using `@jmruthers/pace-core`
|
|
985
|
-
|