@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.
Files changed (292) hide show
  1. package/{scripts/audit/audit-dependencies.cjs → audit-tool/00-dependencies.cjs} +227 -22
  2. package/audit-tool/audits/01-pace-core-compliance.cjs +556 -0
  3. package/audit-tool/audits/02-project-structure.cjs +240 -0
  4. package/audit-tool/audits/03-architecture.cjs +224 -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 +554 -0
  8. package/audit-tool/audits/07-api-tech-stack.cjs +355 -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 +295 -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 +380 -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-6RMSCQJ6.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-CIGSujI2.d.ts} +40 -24
  28. package/dist/{UnifiedAuthProvider-ZT6TIGM7.js → UnifiedAuthProvider-7SNDOWYD.js} +2 -2
  29. package/dist/{api-Y4MQWOFW.js → api-7P7DI652.js} +1 -1
  30. package/dist/{chunk-MAGBIDNS.js → chunk-4DDCYDQ3.js} +8 -7
  31. package/dist/{chunk-BVP2BCJF.js → chunk-5W2A3DRC.js} +10 -9
  32. package/dist/{chunk-SD6WQY43.js → chunk-7ILTDCL2.js} +9 -1
  33. package/dist/{chunk-3QC3KRHK.js → chunk-A3W6LW53.js} +16 -1
  34. package/dist/{chunk-3O3WHILE.js → chunk-EF2UGZWY.js} +239 -63
  35. package/dist/{chunk-LAZMKTTF.js → chunk-EURB7QFZ.js} +341 -337
  36. package/dist/{chunk-2HGJFNAH.js → chunk-FEJLJNWA.js} +1 -15
  37. package/dist/{chunk-7TYHROIV.js → chunk-GS5672WG.js} +55 -13
  38. package/dist/{chunk-UIYSCEV7.js → chunk-IUBRCBSY.js} +1 -1
  39. package/dist/{chunk-ZFYPMX46.js → chunk-LX6U42O3.js} +1 -1
  40. package/dist/{chunk-FENMYN2U.js → chunk-MPBLMWVR.js} +3 -3
  41. package/dist/{chunk-ZS5VO5JB.js → chunk-NKHKXPI4.js} +408 -453
  42. package/dist/{chunk-A55DK444.js → chunk-OJ4SKRSV.js} +1 -7
  43. package/dist/{chunk-4T7OBVTU.js → chunk-S6ZQKDY6.js} +1 -1
  44. package/dist/{chunk-FTCRZOG2.js → chunk-T5CVK4R3.js} +5 -5
  45. package/dist/{chunk-OHIK3MIO.js → chunk-Z2FNRKF3.js} +13 -13
  46. package/dist/components.d.ts +5 -4
  47. package/dist/components.js +29 -34
  48. package/dist/eslint-rules/index.cjs +22 -9
  49. package/{src/eslint-rules/rules/compliance.cjs → dist/eslint-rules/rules/01-pace-core-compliance.cjs} +184 -23
  50. package/dist/eslint-rules/rules/04-code-quality.cjs +346 -0
  51. package/dist/eslint-rules/rules/05-styling.cjs +61 -0
  52. package/dist/eslint-rules/rules/{rbac.cjs → 06-security-rbac.cjs} +34 -13
  53. package/dist/eslint-rules/rules/07-api-tech-stack.cjs +385 -0
  54. package/dist/eslint-rules/rules/08-testing.cjs +94 -0
  55. package/dist/{functions-DHebl8-F.d.ts → functions-lBy5L2ry.d.ts} +1 -1
  56. package/dist/hooks.d.ts +5 -5
  57. package/dist/hooks.js +8 -8
  58. package/dist/index.d.ts +7 -7
  59. package/dist/index.js +21 -20
  60. package/dist/providers.js +2 -2
  61. package/dist/rbac/index.d.ts +1 -1
  62. package/dist/rbac/index.js +8 -8
  63. package/dist/theming/runtime.d.ts +61 -1
  64. package/dist/theming/runtime.js +1 -1
  65. package/dist/{types-B-K_5VnO.d.ts → types-DXstZpNI.d.ts} +0 -17
  66. package/dist/types.d.ts +2 -2
  67. package/dist/{usePublicRouteParams-COZ28Mvq.d.ts → usePublicRouteParams-MamNgwqe.d.ts} +19 -19
  68. package/dist/utils.d.ts +2 -2
  69. package/dist/utils.js +8 -8
  70. package/docs/README.md +1 -1
  71. package/docs/api/modules.md +106 -41
  72. package/docs/api-reference/components.md +18 -20
  73. package/docs/api-reference/hooks.md +80 -80
  74. package/docs/api-reference/types.md +1 -1
  75. package/docs/api-reference/utilities.md +1 -1
  76. package/docs/architecture/README.md +1 -1
  77. package/docs/core-concepts/events.md +3 -3
  78. package/docs/core-concepts/organisations.md +6 -6
  79. package/docs/core-concepts/permissions.md +6 -6
  80. package/docs/documentation-index.md +12 -18
  81. package/docs/getting-started/dependencies.md +23 -0
  82. package/docs/getting-started/documentation-index.md +1 -1
  83. package/docs/getting-started/examples/README.md +4 -4
  84. package/docs/getting-started/examples/full-featured-app.md +1 -1
  85. package/docs/getting-started/faq.md +2 -2
  86. package/docs/getting-started/quick-reference.md +4 -4
  87. package/docs/implementation-guides/app-layout.md +1 -1
  88. package/docs/implementation-guides/authentication.md +15 -15
  89. package/docs/implementation-guides/component-styling.md +1 -1
  90. package/docs/implementation-guides/data-tables.md +127 -34
  91. package/docs/implementation-guides/datatable-rbac-usage.md +1 -1
  92. package/docs/implementation-guides/dynamic-colors.md +3 -3
  93. package/docs/implementation-guides/file-upload-storage.md +2 -2
  94. package/docs/implementation-guides/hierarchical-datatable.md +40 -60
  95. package/docs/implementation-guides/inactivity-tracking.md +3 -3
  96. package/docs/implementation-guides/large-datasets.md +3 -2
  97. package/docs/implementation-guides/organisation-security.md +2 -2
  98. package/docs/implementation-guides/performance.md +2 -2
  99. package/docs/implementation-guides/permission-enforcement.md +1 -1
  100. package/docs/migration/V0.3.44_organisation-context-timing-fix.md +1 -1
  101. package/docs/migration/V0.4.0_rbac-migration.md +6 -6
  102. package/docs/rbac/README.md +5 -5
  103. package/docs/rbac/advanced-patterns.md +6 -6
  104. package/docs/rbac/api-reference.md +20 -20
  105. package/docs/rbac/event-based-apps.md +3 -3
  106. package/docs/rbac/examples.md +41 -41
  107. package/docs/rbac/getting-started.md +37 -37
  108. package/docs/rbac/performance.md +1 -1
  109. package/docs/rbac/quick-start.md +52 -52
  110. package/docs/rbac/secure-client-protection.md +1 -1
  111. package/docs/rbac/troubleshooting.md +1 -1
  112. package/docs/security/README.md +5 -5
  113. package/docs/standards/0-standards-overview.md +220 -0
  114. package/docs/standards/{00-pace-core-compliance.md → 1-pace-core-compliance-standards.md} +241 -185
  115. package/docs/standards/{02-project-structure.md → 2-project-structure-standards.md} +11 -47
  116. package/docs/standards/3-architecture-standards.md +606 -0
  117. package/docs/standards/4-code-quality-standards.md +728 -0
  118. package/docs/standards/{08-markup-quality.md → 5-styling-standards.md} +12 -9
  119. package/docs/standards/{09-rbac-compliance.md → 6-security-rbac-standards.md} +126 -18
  120. package/docs/standards/7-api-tech-stack-standards.md +662 -0
  121. package/docs/standards/8-testing-documentation-standards.md +401 -0
  122. package/docs/standards/9-operations-standards.md +1102 -0
  123. package/docs/standards/README.md +203 -104
  124. package/docs/troubleshooting/README.md +4 -4
  125. package/docs/troubleshooting/common-issues.md +2 -2
  126. package/docs/troubleshooting/debugging.md +9 -9
  127. package/docs/troubleshooting/migration.md +4 -4
  128. package/eslint-config-pace-core.cjs +50 -20
  129. package/package.json +50 -19
  130. package/scripts/eslint-audit.cjs +123 -0
  131. package/scripts/install-cursor-rules.cjs +11 -243
  132. package/scripts/install-eslint-config.cjs +349 -0
  133. package/scripts/validate-dependencies.cjs +248 -0
  134. package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +2 -2
  135. package/src/__tests__/helpers/__tests__/test-providers.test.tsx +2 -2
  136. package/src/__tests__/helpers/__tests__/test-utils.test.tsx +30 -18
  137. package/src/__tests__/integration/UserProfile.test.tsx +14 -14
  138. package/src/__tests__/rbac/PagePermissionGuard.test.tsx +6 -6
  139. package/src/__tests__/templates/accessibility.test.template.tsx +10 -9
  140. package/src/__tests__/templates/component.test.template.tsx +18 -15
  141. package/src/components/AddressField/AddressField.tsx +26 -1
  142. package/src/components/Alert/Alert.test.tsx +86 -22
  143. package/src/components/Alert/Alert.tsx +19 -11
  144. package/src/components/Badge/Badge.tsx +1 -1
  145. package/src/components/Calendar/Calendar.tsx +201 -47
  146. package/src/components/Checkbox/Checkbox.test.tsx +2 -1
  147. package/src/components/ContextSelector/ContextSelector.tsx +108 -126
  148. package/src/components/DataTable/AUDIT_REPORT.md +293 -0
  149. package/src/components/DataTable/DataTable.tsx +1 -19
  150. package/src/components/DataTable/__tests__/DataTableCore.test.tsx +6 -2
  151. package/src/components/DataTable/__tests__/a11y.basic.test.tsx +21 -6
  152. package/src/components/DataTable/__tests__/pagination.modes.test.tsx +3 -2
  153. package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +9 -9
  154. package/src/components/DataTable/components/ColumnFilter.tsx +63 -74
  155. package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +43 -41
  156. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +9 -11
  157. package/src/components/DataTable/components/DataTableLayout.tsx +5 -16
  158. package/src/components/DataTable/components/EditableRow.tsx +5 -7
  159. package/src/components/DataTable/components/EmptyState.tsx +11 -10
  160. package/src/components/DataTable/components/FilterRow.tsx +2 -4
  161. package/src/components/DataTable/components/ImportModal.tsx +124 -126
  162. package/src/components/DataTable/components/LoadingState.tsx +5 -6
  163. package/src/components/DataTable/components/SortIndicator.tsx +50 -0
  164. package/src/components/DataTable/components/__tests__/COVERAGE_NOTE.md +4 -4
  165. package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +23 -82
  166. package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +37 -9
  167. package/src/components/DataTable/components/__tests__/EmptyState.test.tsx +7 -4
  168. package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +12 -4
  169. package/src/components/DataTable/components/__tests__/LoadingState.test.tsx +45 -27
  170. package/src/components/DataTable/components/index.ts +2 -1
  171. package/src/components/DataTable/types.ts +0 -18
  172. package/src/components/DataTable/utils/a11yUtils.ts +17 -0
  173. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +1 -1
  174. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.tsx +11 -15
  175. package/src/components/DateTimeField/DateTimeField.tsx +7 -8
  176. package/src/components/Dialog/Dialog.test.tsx +1 -0
  177. package/src/components/Dialog/Dialog.tsx +25 -8
  178. package/src/components/ErrorBoundary/ErrorBoundary.tsx +77 -79
  179. package/src/components/FileUpload/FileUpload.test.tsx +45 -16
  180. package/src/components/FileUpload/FileUpload.tsx +141 -130
  181. package/src/components/NavigationMenu/NavigationMenu.test.tsx +48 -12
  182. package/src/components/PaceAppLayout/PaceAppLayout.performance.test.tsx +9 -9
  183. package/src/components/PaceAppLayout/PaceAppLayout.security.test.tsx +30 -30
  184. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +4 -4
  185. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +7 -1
  186. package/src/components/Progress/Progress.tsx +2 -4
  187. package/src/components/ProtectedRoute/ProtectedRoute.tsx +8 -8
  188. package/src/components/Select/Select.tsx +86 -77
  189. package/src/components/Select/types.ts +3 -0
  190. package/src/hooks/__tests__/ServiceHooks.test.tsx +16 -16
  191. package/src/hooks/__tests__/hooks.integration.test.tsx +49 -49
  192. package/src/hooks/__tests__/useDataTablePerformance.unit.test.ts +8 -5
  193. package/src/hooks/__tests__/useFileUrl.unit.test.ts +4 -0
  194. package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +99 -99
  195. package/src/hooks/__tests__/useInactivityTracker.unit.test.ts +45 -8
  196. package/src/hooks/__tests__/usePerformanceMonitor.unit.test.ts +22 -2
  197. package/src/hooks/public/usePublicEvent.ts +5 -5
  198. package/src/hooks/public/usePublicEventLogo.ts +5 -5
  199. package/src/hooks/public/usePublicFileDisplay.ts +2 -2
  200. package/src/hooks/public/usePublicRouteParams.ts +13 -9
  201. package/src/hooks/useAddressAutocomplete.test.ts +18 -18
  202. package/src/hooks/useAppConfig.ts +2 -2
  203. package/src/hooks/useEventTheme.test.ts +7 -7
  204. package/src/hooks/useEventTheme.ts +2 -1
  205. package/src/hooks/useFileDisplay.ts +2 -2
  206. package/src/hooks/useFileUrl.ts +52 -8
  207. package/src/hooks/useOrganisationSecurity.test.ts +2 -1
  208. package/src/providers/UnifiedAuthProvider.smoke.test.tsx +21 -21
  209. package/src/providers/__tests__/AuthProvider.test.tsx +21 -21
  210. package/src/providers/__tests__/EventProvider.test.tsx +61 -61
  211. package/src/providers/__tests__/InactivityProvider.test.tsx +56 -56
  212. package/src/providers/__tests__/OrganisationProvider.test.tsx +75 -75
  213. package/src/providers/__tests__/ProviderLifecycle.test.tsx +38 -38
  214. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +103 -103
  215. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +7 -7
  216. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +10 -10
  217. package/src/rbac/__tests__/auth-rbac.e2e.test.tsx +15 -6
  218. package/src/rbac/__tests__/rbac-functions.test.ts +3 -3
  219. package/src/rbac/api.test.ts +104 -0
  220. package/src/rbac/engine.ts +1 -1
  221. package/src/rbac/hooks/useCan.test.ts +2 -2
  222. package/src/rbac/secureClient.ts +1 -1
  223. package/src/rbac/types/functions.ts +1 -1
  224. package/src/styles/core.css +7 -0
  225. package/src/theming/__tests__/parseEventColours.test.ts +118 -3
  226. package/src/theming/parseEventColours.ts +77 -11
  227. package/src/types/supabase.ts +2 -3
  228. package/src/utils/__tests__/bundleAnalysis.unit.test.ts +9 -9
  229. package/src/utils/__tests__/lazyLoad.unit.test.tsx +42 -39
  230. package/src/utils/file-reference/__tests__/file-reference.test.ts +4 -0
  231. package/src/utils/formatting/formatDate.test.ts +3 -2
  232. package/src/utils/formatting/formatDateTime.test.ts +2 -2
  233. package/src/utils/google-places/googlePlacesUtils.test.ts +36 -24
  234. package/src/utils/storage/README.md +1 -1
  235. package/src/utils/storage/__tests__/helpers.unit.test.ts +19 -12
  236. package/src/utils/storage/helpers.test.ts +69 -3
  237. package/cursor-rules/01-standards-compliance.mdc +0 -285
  238. package/cursor-rules/04-testing-standards.mdc +0 -270
  239. package/cursor-rules/05-bug-reports-and-features.mdc +0 -248
  240. package/cursor-rules/06-code-quality.mdc +0 -311
  241. package/cursor-rules/07-tech-stack-compliance.mdc +0 -216
  242. package/cursor-rules/10-error-handling-patterns.mdc +0 -179
  243. package/cursor-rules/11-performance-optimization.mdc +0 -169
  244. package/cursor-rules/12-ci-cd-integration.mdc +0 -150
  245. package/dist/DataTable-LRJL4IRV.js +0 -15
  246. package/dist/eslint-rules/rules/compliance.cjs +0 -348
  247. package/dist/eslint-rules/rules/components.cjs +0 -113
  248. package/dist/eslint-rules/rules/imports.cjs +0 -102
  249. package/docs/best-practices/README.md +0 -472
  250. package/docs/best-practices/accessibility.md +0 -604
  251. package/docs/best-practices/common-patterns.md +0 -516
  252. package/docs/best-practices/deployment.md +0 -1103
  253. package/docs/best-practices/performance.md +0 -1328
  254. package/docs/best-practices/security.md +0 -940
  255. package/docs/best-practices/testing.md +0 -1034
  256. package/docs/rbac/compliance/compliance-guide.md +0 -544
  257. package/docs/standards/01-standards-compliance.md +0 -188
  258. package/docs/standards/03-solid-principles.md +0 -39
  259. package/docs/standards/04-testing-standards.md +0 -36
  260. package/docs/standards/05-bug-reports-and-features.md +0 -27
  261. package/docs/standards/06-code-quality.md +0 -34
  262. package/docs/standards/07-tech-stack-compliance.md +0 -30
  263. package/docs/standards/10-error-handling-patterns.md +0 -401
  264. package/docs/standards/11-performance-optimization.md +0 -348
  265. package/docs/standards/12-ci-cd-integration.md +0 -370
  266. package/docs/standards/ALIGNMENT_REVIEW_SUMMARY.md +0 -192
  267. package/scripts/audit/audit-compliance.cjs +0 -1295
  268. package/scripts/audit/audit-components.cjs +0 -260
  269. package/scripts/audit/audit-rbac.cjs +0 -954
  270. package/scripts/audit/audit-standards.cjs +0 -1268
  271. package/scripts/audit/index.cjs +0 -1927
  272. package/src/components/DataTable/components/DataTableBody.tsx +0 -478
  273. package/src/components/DataTable/components/DraggableColumnHeader.tsx +0 -156
  274. package/src/components/DataTable/components/ExpandButton.tsx +0 -113
  275. package/src/components/DataTable/components/GroupHeader.tsx +0 -54
  276. package/src/components/DataTable/components/ViewRowModal.tsx +0 -68
  277. package/src/components/DataTable/components/VirtualizedDataTable.tsx +0 -525
  278. package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +0 -462
  279. package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +0 -393
  280. package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +0 -476
  281. package/src/components/DataTable/components/__tests__/VirtualizedDataTable.test.tsx +0 -128
  282. package/src/components/DataTable/core/DataTableContext.tsx +0 -216
  283. package/src/components/DataTable/core/__tests__/DataTableContext.test.tsx +0 -136
  284. package/src/components/DataTable/hooks/__tests__/useColumnReordering.test.ts +0 -570
  285. package/src/components/DataTable/hooks/useColumnReordering.ts +0 -123
  286. package/src/components/DataTable/utils/debugTools.ts +0 -514
  287. package/src/eslint-rules/index.cjs +0 -22
  288. package/src/eslint-rules/rules/components.cjs +0 -113
  289. package/src/eslint-rules/rules/imports.cjs +0 -102
  290. package/src/eslint-rules/rules/rbac.cjs +0 -790
  291. package/src/eslint-rules/utils/helpers.cjs +0 -42
  292. package/src/eslint-rules/utils/manifest-loader.cjs +0 -75
@@ -1,248 +0,0 @@
1
- ---
2
- description: Standardized templates for bug reports and feature requests for pace-core
3
- globs: []
4
- alwaysApply: false
5
- paceCoreVersion: "0.6.x"
6
- rulesVersion: "2025-01-28"
7
- ---
8
- # Bug Reports and Feature Requests Guide
9
-
10
- **📚 Human-Readable Standard**: See [05-bug-reports-and-features.md](../../packages/core/docs/standards/05-bug-reports-and-features.md) for complete documentation.
11
-
12
- This guide provides standardized templates for reporting bugs and requesting features in pace-core. This is a reference guide - Cursor will use this for context when helping with issue reporting.
13
-
14
- ## Identifying Issues
15
-
16
- ### Is This a pace-core Issue?
17
-
18
- **Before reporting, determine if the issue is in pace-core or your consuming app:**
19
-
20
- 1. **Check pace-core documentation** - Is the behavior documented?
21
- 2. **Check pace-core source** - Can you find the relevant code?
22
- 3. **Test in isolation** - Can you reproduce with minimal pace-core usage?
23
- 4. **Check similar issues** - Has this been reported before?
24
-
25
- **If the issue is in your consuming app:**
26
- - Fix it locally
27
- - Don't file a pace-core issue
28
-
29
- **If the issue is in pace-core:**
30
- - Use the templates below to file an issue
31
-
32
- ## Bug Report Template
33
-
34
- ### Required Information
35
-
36
- ```markdown
37
- ## Bug Description
38
- [Clear, concise description of the bug]
39
-
40
- ## Expected Behavior
41
- [What should happen]
42
-
43
- ## Actual Behavior
44
- [What actually happens]
45
-
46
- ## Steps to Reproduce
47
- 1. [First step]
48
- 2. [Second step]
49
- 3. [Third step]
50
- ...
51
-
52
- ## Minimal Reproduction
53
- [Link to minimal reproduction or code snippet]
54
-
55
- ## Environment
56
- - pace-core version: [e.g., 0.5.193]
57
- - React version: [e.g., 19.2.3]
58
- - Node version: [e.g., 20.10.0]
59
- - Browser: [e.g., Chrome 120]
60
- - OS: [e.g., macOS 14.2]
61
-
62
- ## Code Example
63
- \`\`\`tsx
64
- // Minimal code that reproduces the issue
65
- import { Component } from '@jmruthers/pace-core';
66
-
67
- function App() {
68
- return <Component />;
69
- }
70
- \`\`\`
71
-
72
- ## Error Messages
73
- [Any error messages or console output]
74
-
75
- ## Additional Context
76
- [Screenshots, videos, or other relevant information]
77
- ```
78
-
79
- ### Example Bug Report
80
-
81
- ```markdown
82
- ## Bug Description
83
- DataTable component throws error when `rbac` prop is missing, but error message is unclear.
84
-
85
- ## Expected Behavior
86
- DataTable should either:
87
- 1. Work without rbac prop (if not required), OR
88
- 2. Show clear error message explaining rbac is required
89
-
90
- ## Actual Behavior
91
- DataTable throws: "Cannot read property 'pageId' of undefined" with no context about missing rbac prop.
92
-
93
- ## Steps to Reproduce
94
- 1. Import DataTable from pace-core
95
- 2. Use DataTable without rbac prop
96
- 3. See error in console
97
-
98
- ## Minimal Reproduction
99
- \`\`\`tsx
100
- import { DataTable } from '@jmruthers/pace-core';
101
-
102
- function App() {
103
- return (
104
- <DataTable
105
- data={[]}
106
- columns={[]}
107
- // Missing rbac prop
108
- />
109
- );
110
- }
111
- \`\`\`
112
-
113
- ## Environment
114
- - pace-core version: 0.5.193
115
- - React version: 19.2.3
116
- - Node version: 20.10.0
117
- - Browser: Chrome 120
118
- - OS: macOS 14.2
119
-
120
- ## Error Messages
121
- ```
122
- Uncaught TypeError: Cannot read property 'pageId' of undefined
123
- at DataTable (DataTable.tsx:123)
124
- ```
125
-
126
- ## Additional Context
127
- The error occurs immediately on render. The documentation mentions rbac is required, but the error doesn't reference this.
128
- ```
129
-
130
- ## Feature Request Template
131
-
132
- ### Required Information
133
-
134
- ```markdown
135
- ## Feature Description
136
- [Clear, concise description of the feature]
137
-
138
- ## Problem Statement
139
- [What problem does this solve? Why is it needed?]
140
-
141
- ## Proposed Solution
142
- [How should this work? What would the API look like?]
143
-
144
- ## Use Case
145
- [Real-world scenario where this would be useful]
146
-
147
- ## Alternatives Considered
148
- [Other approaches you've considered]
149
-
150
- ## Code Example
151
- \`\`\`tsx
152
- // How you would use this feature
153
- import { NewFeature } from '@jmruthers/pace-core';
154
-
155
- function App() {
156
- return <NewFeature prop="value" />;
157
- }
158
- \`\`\`
159
-
160
- ## Additional Context
161
- [Screenshots, mockups, or other relevant information]
162
- ```
163
-
164
- ### Example Feature Request
165
-
166
- ```markdown
167
- ## Feature Description
168
- Add `onRowDoubleClick` prop to DataTable component for double-click row interactions.
169
-
170
- ## Problem Statement
171
- Currently, DataTable only supports single-click row selection. Many users expect double-click to open/edit a row, which is a common pattern in data tables.
172
-
173
- ## Proposed Solution
174
- Add optional `onRowDoubleClick` callback prop:
175
- - Fires when user double-clicks a row
176
- - Receives row data and event
177
- - Works alongside existing selection behavior
178
-
179
- ## Use Case
180
- In an event management app, users want to double-click an event row to open the event details modal, while single-click selects the row for bulk operations.
181
-
182
- ## Alternatives Considered
183
- 1. Using `onRowClick` and detecting double-clicks - but this conflicts with selection
184
- 2. Custom row component - but this loses DataTable features
185
- 3. External double-click handler - but this is less integrated
186
-
187
- ## Code Example
188
- \`\`\`tsx
189
- import { DataTable } from '@jmruthers/pace-core';
190
-
191
- function EventList() {
192
- const handleRowDoubleClick = (row: Event) => {
193
- openEventDetails(row.id);
194
- };
195
-
196
- return (
197
- <DataTable
198
- data={events}
199
- columns={columns}
200
- rbac={{ pageName: 'events' }}
201
- onRowDoubleClick={handleRowDoubleClick}
202
- />
203
- );
204
- }
205
- \`\`\`
206
-
207
- ## Additional Context
208
- This is a common pattern in enterprise data tables. Many similar libraries support this.
209
- ```
210
-
211
- ## Where to File Issues
212
-
213
- **File issues in the pace-core repository:**
214
- - GitHub Issues: [Repository URL]
215
- - Include all required information from templates
216
- - Use appropriate labels if available
217
-
218
- ## Before Filing
219
-
220
- **Check:**
221
- - [ ] Issue hasn't been reported already
222
- - [ ] You're using the latest pace-core version
223
- - [ ] Issue is actually in pace-core (not your app)
224
- - [ ] You've checked documentation
225
- - [ ] You have a minimal reproduction
226
- - [ ] You've included all required information
227
-
228
- ## After Filing
229
-
230
- **Be prepared to:**
231
- - Provide additional information if requested
232
- - Test fixes in development versions
233
- - Verify the fix works in your app
234
- - Close the issue if resolved
235
-
236
- ## Tips for Effective Reports
237
-
238
- 1. **Be specific** - Vague descriptions waste time
239
- 2. **Include reproduction** - Minimal code that shows the issue
240
- 3. **Check existing issues** - Don't duplicate reports
241
- 4. **Be patient** - Maintainers are volunteers
242
- 5. **Be respectful** - Constructive feedback helps
243
-
244
- ## Reference
245
-
246
- - pace-core Documentation: `packages/core/docs/`
247
- - pace-core Source: `packages/core/src/`
248
- - GitHub Issues: [Repository URL]
@@ -1,311 +0,0 @@
1
- ---
2
- description: Enforce code quality standards including TypeScript, ESLint, formatting, performance, and accessibility
3
- globs: ["src/**/*.{ts,tsx,js,jsx}"]
4
- alwaysApply: false
5
- paceCoreVersion: "0.6.x"
6
- rulesVersion: "2025-01-28"
7
- ---
8
- # Code Quality Guide
9
-
10
- **📚 Human-Readable Standard**: See [06-code-quality.md](../../packages/core/docs/standards/06-code-quality.md) for complete documentation.
11
-
12
- This guide enforces code quality standards to ensure maintainable, performant, and accessible code.
13
-
14
- ## TypeScript Standards
15
-
16
- ### MUST: Use Strict Mode
17
-
18
- **TypeScript MUST use strict mode:**
19
-
20
- ```json
21
- // tsconfig.json
22
- {
23
- "compilerOptions": {
24
- "strict": true,
25
- "noImplicitAny": true,
26
- "strictNullChecks": true,
27
- "strictFunctionTypes": true,
28
- "strictBindCallApply": true,
29
- "strictPropertyInitialization": true,
30
- "noImplicitThis": true,
31
- "alwaysStrict": true
32
- }
33
- }
34
- ```
35
-
36
- ### MUST NOT: Use `any`
37
-
38
- **MUST NOT use `any` type. Use `unknown` if type is truly unknown:**
39
-
40
- ```tsx
41
- // ❌ WRONG: Using any
42
- function processData(data: any) { return data.value; }
43
-
44
- // ✅ CORRECT: Using unknown with type guard or proper types
45
- function processData(data: unknown) {
46
- if (typeof data === 'object' && data !== null && 'value' in data) {
47
- return (data as { value: string }).value;
48
- }
49
- throw new Error('Invalid data');
50
- }
51
- // Or: interface Data { value: string; } function processData(data: Data) { return data.value; }
52
- ```
53
-
54
- ### MUST: Use Discriminated Unions
55
-
56
- **MUST use discriminated unions instead of boolean flags:**
57
-
58
- ```tsx
59
- // ❌ WRONG: Boolean flags (confusing: what if both are true?)
60
- interface User { isAdmin: boolean; isGuest: boolean; }
61
-
62
- // ✅ CORRECT: Discriminated union
63
- type User = { type: 'admin'; permissions: Permission[] } | { type: 'guest'; limitedAccess: boolean } | { type: 'user'; role: UserRole };
64
- ```
65
-
66
- ### SHOULD: Use ReadonlyArray
67
-
68
- **SHOULD use ReadonlyArray for immutable arrays:**
69
-
70
- ```tsx
71
- // ✅ CORRECT - ReadonlyArray
72
- function processItems(items: ReadonlyArray<Item>) {
73
- // Can't mutate items
74
- return items.map(item => transform(item));
75
- }
76
- ```
77
-
78
- ## ESLint Configuration
79
-
80
- ### MUST: Use pace-core ESLint Config
81
-
82
- **MUST extend pace-core ESLint configuration:**
83
-
84
- ```javascript
85
- // eslint.config.js
86
- import paceCoreConfig from '@jmruthers/pace-core/eslint-config';
87
-
88
- export default [
89
- ...paceCoreConfig,
90
- // Your additional config
91
- ];
92
- ```
93
-
94
- ### MUST: Fix ESLint Errors
95
-
96
- **MUST fix all ESLint errors before committing:**
97
-
98
- ```bash
99
- npm run lint
100
- npm run lint:fix # Auto-fix where possible
101
- ```
102
-
103
- ## Code Formatting
104
-
105
- ### MUST: Use Consistent Formatting
106
-
107
- **MUST use Prettier or equivalent for consistent formatting:**
108
-
109
- ```json
110
- // .prettierrc
111
- {
112
- "semi": true,
113
- "singleQuote": true,
114
- "tabWidth": 2,
115
- "trailingComma": "es5",
116
- "printWidth": 100
117
- }
118
- ```
119
-
120
- ### MUST: Format Before Committing
121
-
122
- **MUST format code before committing:**
123
-
124
- ```bash
125
- npm run format
126
- # Or use pre-commit hook
127
- ```
128
-
129
- ## Performance Considerations
130
-
131
- ### SHOULD: Optimize Re-renders
132
-
133
- **SHOULD use React.memo, useMemo, useCallback appropriately:**
134
-
135
- ```tsx
136
- // ✅ CORRECT: Memoize expensive computations, callbacks, and components
137
- const expensiveValue = useMemo(() => computeExpensiveValue(data), [data]);
138
- const handleClick = useCallback(() => doSomething(id), [id]);
139
- const ExpensiveComponent = React.memo(({ data }) => <div>{/* ... */}</div>);
140
- ```
141
-
142
- ### SHOULD: Avoid Unnecessary Re-renders
143
-
144
- **SHOULD avoid causing unnecessary re-renders:**
145
-
146
- ```tsx
147
- // ❌ WRONG: New object on every render (causes unnecessary re-renders)
148
- function Component({ items }) { const config = { items, enabled: true }; return <Child config={config} />; }
149
-
150
- // ✅ CORRECT: Memoize object
151
- function Component({ items }) {
152
- const config = useMemo(() => ({ items, enabled: true }), [items]);
153
- return <Child config={config} />;
154
- }
155
- ```
156
-
157
- ### SHOULD: Lazy Load Heavy Components
158
-
159
- **SHOULD lazy load heavy components:**
160
-
161
- ```tsx
162
- // ✅ CORRECT: Lazy load heavy components
163
- import { lazy, Suspense } from 'react';
164
- const HeavyComponent = lazy(() => import('./HeavyComponent'));
165
- function App() {
166
- return <Suspense fallback={<Loading />}><HeavyComponent /></Suspense>;
167
- }
168
- ```
169
-
170
- ## Accessibility Requirements
171
-
172
- ### MUST: Use Semantic HTML
173
-
174
- **MUST use semantic HTML elements:**
175
-
176
- ```tsx
177
- // ❌ WRONG: Non-semantic (<div onClick={...}>)
178
- // ✅ CORRECT: Semantic HTML (<button onClick={...}>)
179
- ```
180
-
181
- ### MUST: Provide ARIA Labels
182
-
183
- **MUST provide ARIA labels for interactive elements:**
184
-
185
- ```tsx
186
- // ✅ CORRECT: Provide ARIA labels for interactive elements
187
- <button aria-label="Close dialog">×</button>
188
- <input aria-label="Search" type="search" />
189
- ```
190
-
191
- ### MUST: Ensure Keyboard Navigation
192
-
193
- **MUST ensure all interactive elements are keyboard accessible:**
194
-
195
- ```tsx
196
- // ✅ CORRECT: Ensure keyboard navigation (Enter or Space key)
197
- <button onClick={handleClick} onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') handleClick(); }}>Click me</button>
198
- ```
199
-
200
- ### MUST: Provide Focus Indicators
201
-
202
- **MUST provide visible focus indicators:**
203
-
204
- ```tsx
205
- // ✅ CORRECT: Provide visible focus indicators
206
- <button className="focus:outline-none focus:ring-2 focus:ring-main-500">Click me</button>
207
- ```
208
-
209
- ## Code Review Checklist
210
-
211
- **Before submitting code for review, verify:**
212
-
213
- - [ ] TypeScript strict mode enabled
214
- - [ ] No `any` types used
215
- - [ ] ESLint passes with no errors
216
- - [ ] Code is formatted consistently
217
- - [ ] Performance optimizations applied where needed
218
- - [ ] Accessibility requirements met
219
- - [ ] Semantic HTML used
220
- - [ ] ARIA labels provided
221
- - [ ] Keyboard navigation works
222
- - [ ] Focus indicators visible
223
- - [ ] Code is readable and maintainable
224
- - [ ] Comments explain "why", not "what"
225
-
226
- ## Code Complexity
227
-
228
- ### SHOULD: Keep Functions Small
229
-
230
- **Functions SHOULD be small and focused:**
231
-
232
- ```tsx
233
- // ❌ WRONG: Large function (100+ lines, multiple responsibilities)
234
- function processUserData(user) { /* 100+ lines of logic */ }
235
-
236
- // ✅ CORRECT: Small, focused functions
237
- function validateUser(user: User): ValidationResult { /* Validation logic */ }
238
- function transformUser(user: User): TransformedUser { /* Transformation logic */ }
239
- function processUserData(user: User) {
240
- const validation = validateUser(user);
241
- if (!validation.valid) return validation;
242
- return transformUser(user);
243
- }
244
- ```
245
-
246
- ### SHOULD: Limit Cyclomatic Complexity
247
-
248
- **Functions SHOULD have low cyclomatic complexity (< 10):**
249
-
250
- ```tsx
251
- // ❌ WRONG: High complexity (many nested conditions)
252
- function processData(data) { if (condition1) { if (condition2) { if (condition3) { /* ... */ } } } }
253
-
254
- // ✅ CORRECT: Lower complexity (early returns)
255
- function processData(data) { if (!condition1) return; if (!condition2) return; if (!condition3) return; /* Process */ }
256
- ```
257
-
258
- ## Error Handling
259
-
260
- ### MUST: Handle Errors Gracefully
261
-
262
- **MUST handle errors and provide user feedback:**
263
-
264
- ```tsx
265
- // ✅ CORRECT: Handle errors gracefully with user feedback
266
- try {
267
- const data = await fetchData();
268
- setData(data);
269
- } catch (error) {
270
- logger.error('Failed to fetch data', error);
271
- toast.error('Failed to load data. Please try again.');
272
- }
273
- ```
274
-
275
- ### MUST: Use Type-Safe Error Handling
276
-
277
- **MUST use type-safe error handling:**
278
-
279
- ```tsx
280
- // ✅ CORRECT: Type-safe error handling
281
- function isApiError(error: unknown): error is ApiError {
282
- return typeof error === 'object' && error !== null && 'code' in error && 'message' in error;
283
- }
284
- try {
285
- await apiCall();
286
- } catch (error) {
287
- if (isApiError(error)) handleApiError(error);
288
- else handleUnknownError(error);
289
- }
290
- ```
291
-
292
- ## Code Quality Checklist
293
-
294
- Before committing, verify:
295
- - [ ] TypeScript strict mode enabled
296
- - [ ] No `any` types
297
- - [ ] ESLint passes
298
- - [ ] Code formatted
299
- - [ ] Performance optimized
300
- - [ ] Accessible (semantic HTML, ARIA, keyboard)
301
- - [ ] Functions are small and focused
302
- - [ ] Error handling in place
303
- - [ ] Code is readable
304
- - [ ] Comments explain "why"
305
-
306
- ## Reference
307
-
308
- - TypeScript Handbook: https://www.typescriptlang.org/docs/
309
- - ESLint Rules: pace-core eslint-config
310
- - React Performance: https://react.dev/learn/render-and-commit
311
- - Web Accessibility: https://www.w3.org/WAI/