@jmruthers/pace-core 0.6.6 → 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.
Files changed (246) hide show
  1. package/{scripts/audit/audit-dependencies.cjs → audit-tool/00-dependencies.cjs} +12 -13
  2. package/audit-tool/audits/01-pace-core-compliance.cjs +556 -0
  3. package/audit-tool/audits/02-project-structure.cjs +255 -0
  4. package/audit-tool/audits/03-architecture.cjs +196 -0
  5. package/audit-tool/audits/04-code-quality.cjs +149 -0
  6. package/audit-tool/audits/05-styling.cjs +224 -0
  7. package/audit-tool/audits/06-security-rbac.cjs +544 -0
  8. package/audit-tool/audits/07-api-tech-stack.cjs +301 -0
  9. package/audit-tool/audits/08-testing-documentation.cjs +202 -0
  10. package/audit-tool/audits/09-operations.cjs +208 -0
  11. package/audit-tool/index.cjs +291 -0
  12. package/audit-tool/utils/code-utils.cjs +218 -0
  13. package/audit-tool/utils/file-utils.cjs +230 -0
  14. package/audit-tool/utils/report-utils.cjs +241 -0
  15. package/cursor-rules/00-standards-overview.mdc +156 -0
  16. package/cursor-rules/{00-pace-core-compliance.mdc → 01-pace-core-compliance.mdc} +187 -34
  17. package/cursor-rules/02-project-structure.mdc +37 -5
  18. package/cursor-rules/{03-solid-principles.mdc → 03-architecture.mdc} +125 -11
  19. package/cursor-rules/04-code-quality.mdc +419 -0
  20. package/cursor-rules/{08-markup-quality.mdc → 05-styling.mdc} +55 -10
  21. package/cursor-rules/{09-rbac-compliance.mdc → 06-security-rbac.mdc} +62 -6
  22. package/cursor-rules/07-api-tech-stack.mdc +377 -0
  23. package/cursor-rules/08-testing-documentation.mdc +324 -0
  24. package/cursor-rules/09-operations.mdc +365 -0
  25. package/dist/DataTable-7PMH7XN7.js +15 -0
  26. package/dist/{DataTable-2N_tqbfq.d.ts → DataTable-DRUIgtUH.d.ts} +1 -1
  27. package/dist/{PublicPageProvider-BBH6Vqg7.d.ts → PublicPageProvider-DlsCaR5v.d.ts} +26 -16
  28. package/dist/{chunk-FENMYN2U.js → chunk-5X4QLXRG.js} +1 -3
  29. package/dist/{chunk-4T7OBVTU.js → chunk-6F3IILHI.js} +1 -1
  30. package/dist/{chunk-SD6WQY43.js → chunk-7ILTDCL2.js} +9 -1
  31. package/dist/{chunk-3QC3KRHK.js → chunk-A3W6LW53.js} +16 -1
  32. package/dist/{chunk-7TYHROIV.js → chunk-BM4CQ5P3.js} +50 -8
  33. package/dist/{chunk-2HGJFNAH.js → chunk-FEJLJNWA.js} +1 -15
  34. package/dist/{chunk-OHIK3MIO.js → chunk-GHYHJTYV.js} +2 -2
  35. package/dist/{chunk-UIYSCEV7.js → chunk-IUBRCBSY.js} +1 -1
  36. package/dist/{chunk-LAZMKTTF.js → chunk-JGWDVX64.js} +281 -347
  37. package/dist/{chunk-MAGBIDNS.js → chunk-L4XMVJKY.js} +2 -2
  38. package/dist/{chunk-A55DK444.js → chunk-OJ4SKRSV.js} +1 -7
  39. package/dist/{chunk-ZS5VO5JB.js → chunk-Q7Q7V5NV.js} +406 -451
  40. package/dist/{chunk-3O3WHILE.js → chunk-VBCS3DUA.js} +236 -60
  41. package/dist/{chunk-BVP2BCJF.js → chunk-ZKAWKYT4.js} +8 -8
  42. package/dist/components.d.ts +5 -4
  43. package/dist/components.js +27 -32
  44. package/dist/eslint-rules/index.cjs +22 -9
  45. package/{src/eslint-rules/rules/compliance.cjs → dist/eslint-rules/rules/01-pace-core-compliance.cjs} +184 -23
  46. package/dist/eslint-rules/rules/04-code-quality.cjs +290 -0
  47. package/dist/eslint-rules/rules/05-styling.cjs +61 -0
  48. package/dist/eslint-rules/rules/{rbac.cjs → 06-security-rbac.cjs} +26 -10
  49. package/dist/eslint-rules/rules/07-api-tech-stack.cjs +263 -0
  50. package/dist/eslint-rules/rules/08-testing.cjs +94 -0
  51. package/dist/hooks.d.ts +5 -5
  52. package/dist/hooks.js +6 -6
  53. package/dist/index.d.ts +6 -6
  54. package/dist/index.js +18 -17
  55. package/dist/rbac/index.js +6 -6
  56. package/dist/theming/runtime.d.ts +14 -1
  57. package/dist/theming/runtime.js +1 -1
  58. package/dist/{types-B-K_5VnO.d.ts → types-DXstZpNI.d.ts} +0 -17
  59. package/dist/{usePublicRouteParams-COZ28Mvq.d.ts → usePublicRouteParams-MamNgwqe.d.ts} +19 -19
  60. package/dist/utils.d.ts +2 -2
  61. package/dist/utils.js +8 -8
  62. package/docs/README.md +1 -1
  63. package/docs/api/modules.md +47 -31
  64. package/docs/api-reference/components.md +18 -20
  65. package/docs/api-reference/hooks.md +80 -80
  66. package/docs/api-reference/types.md +1 -1
  67. package/docs/api-reference/utilities.md +1 -1
  68. package/docs/architecture/README.md +1 -1
  69. package/docs/core-concepts/events.md +3 -3
  70. package/docs/core-concepts/organisations.md +6 -6
  71. package/docs/core-concepts/permissions.md +6 -6
  72. package/docs/documentation-index.md +12 -18
  73. package/docs/getting-started/documentation-index.md +1 -1
  74. package/docs/getting-started/examples/README.md +4 -4
  75. package/docs/getting-started/examples/full-featured-app.md +1 -1
  76. package/docs/getting-started/faq.md +2 -2
  77. package/docs/getting-started/quick-reference.md +4 -4
  78. package/docs/implementation-guides/authentication.md +15 -15
  79. package/docs/implementation-guides/component-styling.md +1 -1
  80. package/docs/implementation-guides/data-tables.md +126 -33
  81. package/docs/implementation-guides/datatable-rbac-usage.md +1 -1
  82. package/docs/implementation-guides/dynamic-colors.md +3 -3
  83. package/docs/implementation-guides/file-upload-storage.md +2 -2
  84. package/docs/implementation-guides/hierarchical-datatable.md +40 -60
  85. package/docs/implementation-guides/inactivity-tracking.md +3 -3
  86. package/docs/implementation-guides/large-datasets.md +3 -2
  87. package/docs/implementation-guides/organisation-security.md +2 -2
  88. package/docs/implementation-guides/performance.md +2 -2
  89. package/docs/implementation-guides/permission-enforcement.md +1 -1
  90. package/docs/migration/V0.3.44_organisation-context-timing-fix.md +1 -1
  91. package/docs/migration/V0.4.0_rbac-migration.md +6 -6
  92. package/docs/rbac/README.md +5 -5
  93. package/docs/rbac/advanced-patterns.md +6 -6
  94. package/docs/rbac/api-reference.md +20 -20
  95. package/docs/rbac/event-based-apps.md +3 -3
  96. package/docs/rbac/examples.md +41 -41
  97. package/docs/rbac/getting-started.md +37 -37
  98. package/docs/rbac/performance.md +1 -1
  99. package/docs/rbac/quick-start.md +52 -52
  100. package/docs/rbac/secure-client-protection.md +1 -1
  101. package/docs/rbac/troubleshooting.md +1 -1
  102. package/docs/security/README.md +5 -5
  103. package/docs/standards/0-standards-overview.md +220 -0
  104. package/docs/standards/{00-pace-core-compliance.md → 1-pace-core-compliance-standards.md} +204 -185
  105. package/docs/standards/{02-project-structure.md → 2-project-structure-standards.md} +11 -47
  106. package/docs/standards/3-architecture-standards.md +606 -0
  107. package/docs/standards/4-code-quality-standards.md +728 -0
  108. package/docs/standards/{08-markup-quality.md → 5-styling-standards.md} +12 -9
  109. package/docs/standards/{09-rbac-compliance.md → 6-security-rbac-standards.md} +126 -18
  110. package/docs/standards/7-api-tech-stack-standards.md +662 -0
  111. package/docs/standards/8-testing-documentation-standards.md +401 -0
  112. package/docs/standards/9-operations-standards.md +1102 -0
  113. package/docs/standards/README.md +203 -104
  114. package/docs/troubleshooting/README.md +4 -4
  115. package/docs/troubleshooting/common-issues.md +2 -2
  116. package/docs/troubleshooting/debugging.md +9 -9
  117. package/docs/troubleshooting/migration.md +4 -4
  118. package/eslint-config-pace-core.cjs +21 -10
  119. package/package.json +6 -5
  120. package/scripts/install-cursor-rules.cjs +11 -243
  121. package/scripts/install-eslint-config.cjs +284 -0
  122. package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +2 -2
  123. package/src/__tests__/helpers/__tests__/test-providers.test.tsx +2 -2
  124. package/src/__tests__/helpers/__tests__/test-utils.test.tsx +10 -10
  125. package/src/__tests__/integration/UserProfile.test.tsx +14 -14
  126. package/src/__tests__/rbac/PagePermissionGuard.test.tsx +6 -6
  127. package/src/__tests__/templates/accessibility.test.template.tsx +9 -9
  128. package/src/__tests__/templates/component.test.template.tsx +18 -15
  129. package/src/components/Calendar/Calendar.tsx +201 -47
  130. package/src/components/ContextSelector/ContextSelector.tsx +137 -153
  131. package/src/components/DataTable/AUDIT_REPORT.md +293 -0
  132. package/src/components/DataTable/__tests__/DataTableCore.test.tsx +10 -2
  133. package/src/components/DataTable/__tests__/a11y.basic.test.tsx +10 -4
  134. package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +9 -9
  135. package/src/components/DataTable/components/ColumnFilter.tsx +63 -74
  136. package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +43 -41
  137. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +9 -11
  138. package/src/components/DataTable/components/DataTableLayout.tsx +5 -16
  139. package/src/components/DataTable/components/EditableRow.tsx +5 -7
  140. package/src/components/DataTable/components/EmptyState.tsx +10 -9
  141. package/src/components/DataTable/components/FilterRow.tsx +2 -4
  142. package/src/components/DataTable/components/ImportModal.tsx +124 -126
  143. package/src/components/DataTable/components/LoadingState.tsx +5 -6
  144. package/src/components/DataTable/components/SortIndicator.tsx +50 -0
  145. package/src/components/DataTable/components/__tests__/COVERAGE_NOTE.md +4 -4
  146. package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +23 -82
  147. package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +37 -9
  148. package/src/components/DataTable/components/__tests__/EmptyState.test.tsx +7 -4
  149. package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +12 -4
  150. package/src/components/DataTable/components/__tests__/LoadingState.test.tsx +41 -27
  151. package/src/components/DataTable/components/index.ts +2 -1
  152. package/src/components/DataTable/types.ts +0 -18
  153. package/src/components/DataTable/utils/a11yUtils.ts +17 -0
  154. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +2 -1
  155. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.tsx +11 -15
  156. package/src/components/DateTimeField/DateTimeField.tsx +7 -8
  157. package/src/components/Dialog/Dialog.test.tsx +1 -0
  158. package/src/components/Dialog/Dialog.tsx +25 -8
  159. package/src/components/ErrorBoundary/ErrorBoundary.tsx +77 -79
  160. package/src/components/FileUpload/FileUpload.test.tsx +52 -14
  161. package/src/components/FileUpload/FileUpload.tsx +112 -130
  162. package/src/components/Progress/Progress.tsx +2 -4
  163. package/src/components/ProtectedRoute/ProtectedRoute.tsx +8 -8
  164. package/src/components/Select/Select.tsx +86 -77
  165. package/src/components/Select/types.ts +3 -0
  166. package/src/hooks/__tests__/ServiceHooks.test.tsx +16 -16
  167. package/src/hooks/__tests__/hooks.integration.test.tsx +49 -49
  168. package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +97 -97
  169. package/src/hooks/public/usePublicEvent.ts +5 -5
  170. package/src/hooks/public/usePublicEventLogo.ts +5 -5
  171. package/src/hooks/public/usePublicFileDisplay.ts +2 -2
  172. package/src/hooks/public/usePublicRouteParams.ts +5 -5
  173. package/src/hooks/useAppConfig.ts +2 -2
  174. package/src/hooks/useEventTheme.test.ts +7 -7
  175. package/src/hooks/useEventTheme.ts +1 -4
  176. package/src/hooks/useFileDisplay.ts +2 -2
  177. package/src/providers/UnifiedAuthProvider.smoke.test.tsx +21 -21
  178. package/src/providers/__tests__/AuthProvider.test.tsx +21 -21
  179. package/src/providers/__tests__/EventProvider.test.tsx +61 -61
  180. package/src/providers/__tests__/InactivityProvider.test.tsx +56 -56
  181. package/src/providers/__tests__/OrganisationProvider.test.tsx +75 -75
  182. package/src/providers/__tests__/ProviderLifecycle.test.tsx +37 -37
  183. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +103 -103
  184. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +7 -7
  185. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +10 -10
  186. package/src/styles/core.css +7 -0
  187. package/src/theming/__tests__/parseEventColours.test.ts +9 -3
  188. package/src/theming/parseEventColours.ts +22 -10
  189. package/src/utils/__tests__/lazyLoad.unit.test.tsx +42 -39
  190. package/src/utils/storage/README.md +1 -1
  191. package/cursor-rules/01-standards-compliance.mdc +0 -285
  192. package/cursor-rules/04-testing-standards.mdc +0 -270
  193. package/cursor-rules/05-bug-reports-and-features.mdc +0 -248
  194. package/cursor-rules/06-code-quality.mdc +0 -311
  195. package/cursor-rules/07-tech-stack-compliance.mdc +0 -216
  196. package/cursor-rules/10-error-handling-patterns.mdc +0 -179
  197. package/cursor-rules/11-performance-optimization.mdc +0 -169
  198. package/cursor-rules/12-ci-cd-integration.mdc +0 -150
  199. package/dist/DataTable-LRJL4IRV.js +0 -15
  200. package/dist/eslint-rules/rules/compliance.cjs +0 -348
  201. package/dist/eslint-rules/rules/components.cjs +0 -113
  202. package/dist/eslint-rules/rules/imports.cjs +0 -102
  203. package/docs/best-practices/README.md +0 -472
  204. package/docs/best-practices/accessibility.md +0 -604
  205. package/docs/best-practices/common-patterns.md +0 -516
  206. package/docs/best-practices/deployment.md +0 -1103
  207. package/docs/best-practices/performance.md +0 -1328
  208. package/docs/best-practices/security.md +0 -940
  209. package/docs/best-practices/testing.md +0 -1034
  210. package/docs/rbac/compliance/compliance-guide.md +0 -544
  211. package/docs/standards/01-standards-compliance.md +0 -188
  212. package/docs/standards/03-solid-principles.md +0 -39
  213. package/docs/standards/04-testing-standards.md +0 -36
  214. package/docs/standards/05-bug-reports-and-features.md +0 -27
  215. package/docs/standards/06-code-quality.md +0 -34
  216. package/docs/standards/07-tech-stack-compliance.md +0 -30
  217. package/docs/standards/10-error-handling-patterns.md +0 -401
  218. package/docs/standards/11-performance-optimization.md +0 -348
  219. package/docs/standards/12-ci-cd-integration.md +0 -370
  220. package/docs/standards/ALIGNMENT_REVIEW_SUMMARY.md +0 -192
  221. package/scripts/audit/audit-compliance.cjs +0 -1295
  222. package/scripts/audit/audit-components.cjs +0 -260
  223. package/scripts/audit/audit-rbac.cjs +0 -954
  224. package/scripts/audit/audit-standards.cjs +0 -1268
  225. package/scripts/audit/index.cjs +0 -1927
  226. package/src/components/DataTable/components/DataTableBody.tsx +0 -478
  227. package/src/components/DataTable/components/DraggableColumnHeader.tsx +0 -156
  228. package/src/components/DataTable/components/ExpandButton.tsx +0 -113
  229. package/src/components/DataTable/components/GroupHeader.tsx +0 -54
  230. package/src/components/DataTable/components/ViewRowModal.tsx +0 -68
  231. package/src/components/DataTable/components/VirtualizedDataTable.tsx +0 -525
  232. package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +0 -462
  233. package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +0 -393
  234. package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +0 -476
  235. package/src/components/DataTable/components/__tests__/VirtualizedDataTable.test.tsx +0 -128
  236. package/src/components/DataTable/core/DataTableContext.tsx +0 -216
  237. package/src/components/DataTable/core/__tests__/DataTableContext.test.tsx +0 -136
  238. package/src/components/DataTable/hooks/__tests__/useColumnReordering.test.ts +0 -570
  239. package/src/components/DataTable/hooks/useColumnReordering.ts +0 -123
  240. package/src/components/DataTable/utils/debugTools.ts +0 -514
  241. package/src/eslint-rules/index.cjs +0 -22
  242. package/src/eslint-rules/rules/components.cjs +0 -113
  243. package/src/eslint-rules/rules/imports.cjs +0 -102
  244. package/src/eslint-rules/rules/rbac.cjs +0 -790
  245. package/src/eslint-rules/utils/helpers.cjs +0 -42
  246. package/src/eslint-rules/utils/manifest-loader.cjs +0 -75
@@ -1,6 +1,6 @@
1
- # pace-core Compliance Enforcement
1
+ # pace-core Compliance Standards
2
2
 
3
- **🤖 Cursor Rule**: See [00-pace-core-compliance.mdc](../../cursor-rules/00-pace-core-compliance.mdc) for AI-optimized directives that automatically enforce these standards.
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 (15 rules)
12
- 2. **Static Analysis Script** - Comprehensive codebase scanning for file-system and config checks
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
- **Option A: Automated Setup (Easiest)**
66
+ **Automated Setup (Easiest)**
67
67
 
68
- Use the installation script to set up both Cursor rules and ESLint:
68
+ Use the installation script to set up ESLint:
69
69
 
70
70
  ```bash
71
- node node_modules/@jmruthers/pace-core/scripts/install-cursor-rules.cjs
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
 
@@ -134,7 +133,27 @@ export default [
134
133
 
135
134
  ### Step 3: Setup Cursor Rules (Optional but Recommended)
136
135
 
137
- To enable AI-assisted enforcement in Cursor IDE, copy the pace-core cursor rules to your project:
136
+ **Automated Setup (Easiest)**
137
+
138
+ Use the installation script to set up Cursor rules:
139
+
140
+ ```bash
141
+ npm run setup:cursor-rules
142
+ # or
143
+ node node_modules/@jmruthers/pace-core/scripts/install-cursor-rules.cjs
144
+ ```
145
+
146
+ This script will:
147
+ - ✅ Install Cursor rules to `.cursor/rules/`
148
+ - ✅ Create backups before updating existing rules
149
+ - ✅ Automatically update pace-core rules when they change
150
+
151
+ **Options:**
152
+ - `--force` - Force update even if already configured
153
+
154
+ **Manual Setup (Alternative)**
155
+
156
+ To manually enable AI-assisted enforcement in Cursor IDE, copy the pace-core cursor rules to your project:
138
157
 
139
158
  ```bash
140
159
  # Create .cursor/rules directory if it doesn't exist
@@ -144,7 +163,7 @@ mkdir -p .cursor/rules
144
163
  cp node_modules/@jmruthers/pace-core/cursor-rules/*.mdc .cursor/rules/
145
164
  ```
146
165
 
147
- Or manually create `.cursor/rules/00-pace-core-compliance.mdc` and reference the pace-core rules:
166
+ Or manually create `.cursor/rules/01-pace-core-compliance.mdc` and reference the pace-core rules:
148
167
 
149
168
  ```markdown
150
169
  ---
@@ -155,7 +174,7 @@ alwaysApply: false
155
174
 
156
175
  # pace-core Compliance
157
176
 
158
- **📚 Full Documentation**: See [pace-core compliance docs](node_modules/@jmruthers/pace-core/docs/standards/00-pace-core-compliance.md)
177
+ **📚 Full Documentation**: See [pace-core compliance docs](node_modules/@jmruthers/pace-core/docs/standards/1-pace-core-compliance-standards.md)
159
178
 
160
179
  **🔧 ESLint Setup**: Ensure ESLint is configured with `@jmruthers/pace-core/eslint-config`
161
180
 
@@ -179,63 +198,32 @@ See the full documentation for complete rules and examples.
179
198
  - Works alongside ESLint for comprehensive enforcement
180
199
  - Provides explanations and examples in real-time
181
200
 
182
- ### Option 2: Manual ESLint Rules Setup
201
+ ## ESLint Rules
183
202
 
184
- If you prefer more control, you can import the rules directly. Note: The rules are CommonJS, so use `createRequire` in ES modules:
203
+ pace-core provides ESLint rules organized by standards (01, 04, 05, 06, 07, 08). Rules are organized to match the 10-file standards structure:
185
204
 
186
- **For ES Module ESLint Config:**
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;
192
-
193
- export default [
194
- {
195
- plugins: {
196
- 'pace-core-compliance': {
197
- rules: paceCoreRules
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
- ```
205
+ - **Standard 1 (pace-core Compliance)**: 6 rules
206
+ - **Standard 4 (Code Quality)**: 3 rules
207
+ - **Standard 5 (Styling)**: 1 rule
208
+ - **Standard 6 (Security & RBAC)**: 8 rules
209
+ - **Standard 7 (API & Tech Stack)**: 3 rules
210
+ - **Standard 8 (Testing)**: 1 rule
210
211
 
211
- **For CommonJS ESLint Config:**
212
- ```javascript
213
- // eslint.config.cjs
214
- const paceCoreRules = require('@jmruthers/pace-core/eslint-rules').rules;
212
+ **Total: 22 rules** organized across 6 standards files.
215
213
 
216
- module.exports = [
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
- ```
214
+ ### Rule Organization
233
215
 
234
- ## ESLint Rules
216
+ Rules are organized in `packages/core/eslint-rules/rules/`:
217
+ - `01-pace-core-compliance.cjs` - pace-core usage patterns
218
+ - `04-code-quality.cjs` - Naming conventions, component/type naming
219
+ - `05-styling.cjs` - Inline styles
220
+ - `06-security-rbac.cjs` - Security and RBAC patterns
221
+ - `07-api-tech-stack.cjs` - RPC naming, React 19+, import.meta.env
222
+ - `08-testing.cjs` - Test file naming
235
223
 
236
- pace-core provides **15 ESLint rules** organized into four categories:
224
+ ### Detailed Rule Descriptions
237
225
 
238
- ### Import Rules
226
+ #### Import Rules
239
227
 
240
228
  #### no-restricted-imports
241
229
 
@@ -603,25 +591,6 @@ The script generates a color-coded terminal report showing:
603
591
  - 💡 **Suggestions** - Recommendations for improvement
604
592
  - ✅ **Summary** - Overall compliance status
605
593
 
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
594
  ## Best Practices
626
595
 
627
596
  ### 1. Always Import from pace-core
@@ -683,116 +652,93 @@ Before creating a new component, check if pace-core already provides it:
683
652
  2. Check `core-usage-manifest.json` for available components
684
653
  3. Search pace-core exports
685
654
 
686
- ## Troubleshooting
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/`
699
-
700
- 3. **Verify manifest exists**: Rules load from `core-usage-manifest.json` in the pace-core package
701
-
702
- 4. **CommonJS/ES Module issues**: If you're using ES modules and rules aren't loading:
703
- - Ensure you're using the config preset (Option 1) which handles this automatically
704
- - Or use `createRequire` when importing rules directly (Option 2)
705
-
706
- 5. **Verify rules are available**: Check that the rules file exists:
707
- ```bash
708
- ls node_modules/@jmruthers/pace-core/dist/eslint-rules/index.cjs
709
- ```
710
-
711
- 6. **Check rule count**: Verify all 15 rules are loaded:
712
- ```bash
713
- node -e "const rules = require('@jmruthers/pace-core/eslint-rules'); console.log('Rules:', Object.keys(rules.rules).length);"
714
- ```
715
- Should output: `Rules: 15`
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
655
+ ## MUST: Provider Nesting Order
731
656
 
732
- 2. **Hook/Util patterns**: The pattern matching may flag similar names. Review the suggestion and decide if migration makes sense.
657
+ **⚠️ CRITICAL: Provider nesting order matters!** Incorrect nesting causes React context errors.
733
658
 
734
- ## Integration with CI/CD
659
+ **MUST** nest providers in this exact order (outermost to innermost):
735
660
 
736
- While CI/CD integration is not included in the initial release, you can easily add it:
661
+ 1. `QueryClientProvider` (outermost)
662
+ 2. `BrowserRouter`
663
+ 3. `UnifiedAuthProvider`
664
+ 4. `OrganisationProvider`
665
+ 5. `App` (innermost)
737
666
 
738
- ```yaml
739
- # .github/workflows/pace-core-compliance.yml
740
- name: pace-core Compliance
667
+ ```tsx
668
+ // ✅ CORRECT: main.tsx
669
+ import { BrowserRouter } from 'react-router-dom';
670
+ import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
671
+ import { UnifiedAuthProvider, OrganisationProvider } from '@jmruthers/pace-core';
672
+ import { createClient } from '@supabase/supabase-js';
741
673
 
742
- on: [push, pull_request]
674
+ const queryClient = new QueryClient();
675
+ const supabase = createClient(
676
+ import.meta.env.VITE_SUPABASE_URL,
677
+ import.meta.env.VITE_SUPABASE_PUBLISHABLE_KEY
678
+ );
743
679
 
744
- jobs:
745
- compliance:
746
- runs-on: ubuntu-latest
747
- steps:
748
- - uses: actions/checkout@v3
749
- - uses: actions/setup-node@v3
750
- - run: npm ci
751
- - run: npm run check:pace-core
752
- - run: npm run lint
680
+ createRoot(document.getElementById("root")!).render(
681
+ <QueryClientProvider client={queryClient}>
682
+ <BrowserRouter>
683
+ <UnifiedAuthProvider supabaseClient={supabase} appName="YourApp">
684
+ <OrganisationProvider>
685
+ <App />
686
+ </OrganisationProvider>
687
+ </UnifiedAuthProvider>
688
+ </BrowserRouter>
689
+ </QueryClientProvider>
690
+ );
753
691
  ```
754
692
 
755
- ## Verification
756
-
757
- After setting up the ESLint config, verify it's working:
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.
693
+ **Common mistakes to avoid:**
694
+ - ❌ `BrowserRouter` inside `UnifiedAuthProvider` (causes Router context errors)
695
+ - `UnifiedAuthProvider` wrapping `BrowserRouter` (causes context errors)
696
+ - ❌ Missing `BrowserRouter` (causes `useNavigate` errors)
771
697
 
772
- 3. **Run static analysis**: Use the compliance script to get a full report:
773
- ```bash
774
- npm run check:pace-core
775
- ```
698
+ ## MUST: Vite Configuration
776
699
 
777
- ## Getting Help
700
+ **⚠️ CRITICAL: Vite configuration prevents React context mismatches!**
778
701
 
779
- - **Documentation**: See [pace-core docs](../README.md)
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)
702
+ **MUST** configure Vite to exclude `@jmruthers/pace-core` and `react-router-dom` from pre-bundling:
784
703
 
785
- ## File Locations
704
+ ```typescript
705
+ // vite.config.ts
706
+ import { defineConfig } from 'vite';
707
+ import react from '@vitejs/plugin-react';
708
+ import path from 'path';
709
+
710
+ export default defineConfig({
711
+ plugins: [react()],
712
+ resolve: {
713
+ alias: {
714
+ '@': path.resolve(__dirname, './src'),
715
+ },
716
+ // CRITICAL: Dedupe React dependencies
717
+ dedupe: ['react', 'react-dom', 'react-router-dom'],
718
+ },
719
+ optimizeDeps: {
720
+ include: [
721
+ 'react',
722
+ 'react-dom',
723
+ 'react/jsx-runtime',
724
+ ],
725
+ // CRITICAL: Exclude pace-core to prevent React context mismatches
726
+ exclude: ['@jmruthers/pace-core', 'react-router-dom'],
727
+ },
728
+ });
729
+ ```
786
730
 
787
- When installed in a consuming app, the compliance tools are available at:
731
+ **Why this matters:**
732
+ - Pre-bundling `@jmruthers/pace-core` creates separate React instances
733
+ - This causes "useUnifiedAuth must be used within a UnifiedAuthProvider" errors
734
+ - Excluding it ensures pace-core uses the same React instance as your app
735
+ - `react-router-dom` must also be excluded and deduped to prevent Router context errors
788
736
 
789
- - **ESLint Config**: `node_modules/@jmruthers/pace-core/eslint-config-pace-core.cjs`
790
- - **ESLint Rules**: `node_modules/@jmruthers/pace-core/dist/eslint-rules/index.cjs`
791
- - **Rule Modules**: `node_modules/@jmruthers/pace-core/dist/eslint-rules/rules/*.cjs`
792
- - **Rule Utils**: `node_modules/@jmruthers/pace-core/dist/eslint-rules/utils/*.cjs`
793
- - **Static Analysis Script**: `node_modules/@jmruthers/pace-core/scripts/check-pace-core-compliance.cjs`
794
- - **Manifest**: `node_modules/@jmruthers/pace-core/core-usage-manifest.json`
795
- - **Cursor Rules**: `node_modules/@jmruthers/pace-core/cursor-rules/*.mdc`
737
+ **If you encounter context errors:**
738
+ 1. Verify `@jmruthers/pace-core` is in `optimizeDeps.exclude`
739
+ 2. Verify `react-router-dom` is in both `resolve.dedupe` and `optimizeDeps.exclude`
740
+ 3. Clear Vite cache: `rm -rf node_modules/.vite`
741
+ 4. Restart dev server
796
742
 
797
743
  ## MUST: Use Secure Supabase Client
798
744
 
@@ -906,7 +852,23 @@ function useSecureSupabase(
906
852
 
907
853
  **NO OTHER EXCEPTIONS ARE PERMITTED** - All other uses of `createClient()` are security violations and MUST be fixed.
908
854
 
909
- ### Detection / Audit
855
+ ### Detection / Audit Tool
856
+
857
+ The audit tool (`npm run audit:pace-core`) performs comprehensive system-level analysis organized by standards:
858
+
859
+ - **Standard 1 (pace-core Compliance)**: Provider nesting, core styles import, RBAC setup, Vite aliases, secure Supabase client location, Cursor rules, ESLint config
860
+ - **Standard 2 (Project Structure)**: Directory structure, config files, import paths, test colocation, Supabase structure
861
+ - **Standard 3 (Architecture)**: Component boundaries, ApiResult usage
862
+ - **Standard 4 (Code Quality)**: TypeScript config, test coverage config
863
+ - **Standard 5 (Styling)**: app.css structure, Tailwind v4 config
864
+ - **Standard 6 (Security & RBAC)**: RLS policies, PagePermissionGuard coverage, Edge Functions RBAC
865
+ - **Standard 7 (API & Tech Stack)**: RPC naming in SQL, tech stack versions, Vite config
866
+ - **Standard 8 (Testing & Documentation)**: Test timeout config, testing tools, test structure
867
+ - **Standard 9 (Operations)**: Error handling patterns, CI/CD config, error boundaries
868
+
869
+ **Reference**: See [packages/core/audit-tool/](../../audit-tool/) for audit tool implementation.
870
+
871
+ ### Detection / Audit (Legacy)
910
872
 
911
873
  - `rg "createClient\(" src` must return **exactly ONE match** in the file that creates the base client for `UnifiedAuthProvider`.
912
874
  - That file MUST be one of: `main.tsx`, `App.tsx`, or `lib/supabase.ts` (or `.jsx`/`.js` equivalents).
@@ -938,8 +900,10 @@ If you encounter a situation where a rule seems to conflict with a legitimate re
938
900
  **Example of proper documentation:**
939
901
  ```tsx
940
902
  // @pace-core-compliance-exception: Legacy integration requires direct Supabase client
941
- // TODO: Migrate to useSecureSupabase() when legacy system is updated
942
- // See: https://github.com/your-org/pace-core/issues/123
903
+ // Reason: Third-party service requires unauthenticated client for initial handshake
904
+ // Migration plan: Migrate to useSecureSupabase() when legacy system is updated (Q2 2025)
905
+ // Tracking issue: https://github.com/your-org/pace-core/issues/123
906
+ // Expected removal date: Q2 2025
943
907
  const legacyClient = createClient(...);
944
908
  ```
945
909
 
@@ -958,10 +922,65 @@ During audits, documented exceptions will be:
958
922
 
959
923
  **Invalid exceptions** (undocumented, unnecessary, or security-related) will be flagged as violations requiring remediation.
960
924
 
925
+ ## Troubleshooting
926
+
927
+ ### ESLint Rules Not Working
928
+
929
+ 1. **Verify plugin is loaded**: Check that the config is imported correctly
930
+ 2. **Check rule names**: Rules must be prefixed with `pace-core-compliance/`
931
+ 3. **Verify manifest exists**: Rules load from `core-usage-manifest.json` in the pace-core package
932
+ 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
933
+ 5. **Verify rules are available**: Check that the rules file exists
934
+ 6. **Check rule count**: Verify all 15 rules are loaded
935
+
936
+ ### Static Analysis Script Errors
937
+
938
+ 1. **Manifest not found**: Ensure `core-usage-manifest.json` exists in pace-core package
939
+ 2. **No files scanned**: Check that you're running from the project root
940
+ 3. **Permission errors**: Ensure script has read access to source files
941
+
942
+ ### False Positives
943
+
944
+ If you encounter false positives:
945
+
946
+ 1. **Component name conflicts**: If you have a legitimate reason to create a local component with a pace-core name, consider:
947
+ - Renaming your component
948
+ - Using a namespace/prefix
949
+ - Documenting why pace-core doesn't meet your needs
950
+
951
+ 2. **Hook/Util patterns**: The pattern matching may flag similar names. Review the suggestion and decide if migration makes sense.
952
+
953
+ ## Verification
954
+
955
+ After setting up the ESLint config, verify it's working:
956
+
957
+ 1. **Check ESLint can load the config**:
958
+ ```bash
959
+ npx eslint --print-config src/App.tsx
960
+ ```
961
+ Look for `pace-core-compliance` in the plugins section.
962
+
963
+ 2. **Test with a violation**: Create a test file that imports a restricted library:
964
+ ```typescript
965
+ // test-violation.ts
966
+ import { Dialog } from '@radix-ui/react-dialog'; // Should trigger error
967
+ ```
968
+ Run ESLint and verify it reports the violation.
969
+
970
+ 3. **Run static analysis**: Use the compliance script to get a full report:
971
+ ```bash
972
+ npm run check:pace-core
973
+ ```
974
+
961
975
  ## Related Documentation
962
976
 
963
- - [Component Standards](./03-component-standard.md)
964
- - [API & RPC Standards](./02-api-and-rpc-standard.md)
965
- - [Getting Started Guide](../getting-started/README.md)
966
- - [RBAC Getting Started](../rbac/getting-started.md) - Secure client usage
977
+ - [Standards Overview](./0-standards-overview.md) - Standards system overview
978
+ - [Project Structure](./2-project-structure-standards.md) - Project structure and organization
979
+ - [Security & RBAC](./6-security-rbac-standards.md) - RBAC and security standards
980
+ - [API & Tech Stack](./7-api-tech-stack-standards.md) - API and tech stack standards
981
+
982
+ ---
967
983
 
984
+ **Last Updated:** 2025-01-28
985
+ **Version:** 2.0.0
986
+ **Applies to:** All consuming apps using `@jmruthers/pace-core`
@@ -1,4 +1,4 @@
1
- # Project Structure Guide for Consuming Apps
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-pace-core-compliance.mdc
41
- │ ├── 01-standards-compliance.mdc
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 08-markup-quality.md)
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
- - [pace-core Compliance](./00-pace-core-compliance.md) - pace-core usage patterns
974
- - [Markup Quality](./08-markup-quality.md) - **CRITICAL: Required CSS configuration**
975
- - [Code Quality](./06-code-quality.md) - Code style and TypeScript standards
976
- - [Tech Stack](./07-tech-stack-compliance.md) - Tech stack requirements
977
- - [SOLID Principles](./03-solid-principles.md) - Architecture principles
978
- - [Cursor Rules Documentation](../../getting-started/cursor-rules.md)
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:** 1.0.0
948
+ **Version:** 2.0.0
984
949
  **Applies to:** All consuming apps using `@jmruthers/pace-core`
985
-