@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,270 +0,0 @@
1
- ---
2
- description: Enforce testing framework consistency and standards for consuming apps
3
- globs: ["**/*.{test,spec}.{ts,tsx}"]
4
- alwaysApply: false
5
- paceCoreVersion: "0.6.x"
6
- rulesVersion: "2025-01-28"
7
- ---
8
- # Testing Standards Guide
9
-
10
- **📚 Human-Readable Standard**: See [04-testing-standards.md](../../packages/core/docs/standards/04-testing-standards.md) for complete documentation.
11
-
12
- This guide ensures consistent, high-quality testing across consuming apps in the PACE suite.
13
-
14
- ## MUST: Meet Coverage Requirements
15
-
16
- **MUST achieve minimum coverage:**
17
- - ≥90% coverage for utils & hooks
18
- - ≥70% coverage for components
19
-
20
- **Verify coverage:**
21
- ```bash
22
- npm run test:coverage
23
- ```
24
-
25
- ## MUST: Use React Testing Library
26
-
27
- **MUST use React Testing Library + userEvent for all component tests.**
28
-
29
- ```tsx
30
- // ✅ CORRECT: React Testing Library + userEvent
31
- import { render, screen } from '@testing-library/react';
32
- import userEvent from '@testing-library/user-event';
33
- test('button clicks work', async () => {
34
- const user = userEvent.setup();
35
- const handleClick = vi.fn();
36
- render(<Button onClick={handleClick}>Click me</Button>);
37
- await user.click(screen.getByRole('button', { name: /click me/i }));
38
- expect(handleClick).toHaveBeenCalledTimes(1);
39
- });
40
-
41
- // ❌ WRONG: Enzyme or other testing libraries
42
- ```
43
-
44
- ## MUST: Colocate Tests
45
-
46
- **Tests MUST be colocated with source files:**
47
-
48
- ```
49
- src/
50
- ├── components/
51
- │ └── EventCard/
52
- │ ├── EventCard.tsx
53
- │ └── EventCard.test.tsx
54
- ├── hooks/
55
- │ ├── useEventData.ts
56
- │ └── useEventData.test.ts
57
- └── utils/
58
- ├── formatEvent.ts
59
- └── formatEvent.test.ts
60
- ```
61
-
62
- ## MUST: Use Vitest
63
-
64
- **MUST use Vitest for all testing:**
65
-
66
- ```typescript
67
- // vitest.config.ts
68
- import { defineConfig } from 'vitest/config';
69
-
70
- export default defineConfig({
71
- test: {
72
- environment: 'jsdom',
73
- setupFiles: ['./vitest.setup.ts'],
74
- coverage: {
75
- provider: 'v8',
76
- reporter: ['text', 'json', 'html'],
77
- thresholds: {
78
- lines: 80,
79
- functions: 80,
80
- branches: 80,
81
- statements: 80,
82
- },
83
- },
84
- },
85
- });
86
- ```
87
-
88
- ## MUST: Test User Behavior, Not Implementation
89
-
90
- **Tests MUST focus on what users see and do:**
91
-
92
- ```tsx
93
- // ❌ WRONG: Testing implementation (component.state.count)
94
- test('calls setState', () => { const component = render(<Counter />); expect(component.state.count).toBe(0); });
95
-
96
- // ✅ CORRECT: Testing user behavior (what user sees and does)
97
- test('displays count and increments on button click', async () => {
98
- const user = userEvent.setup();
99
- render(<Counter />);
100
- expect(screen.getByText('Count: 0')).toBeInTheDocument();
101
- await user.click(screen.getByRole('button', { name: /increment/i }));
102
- expect(screen.getByText('Count: 1')).toBeInTheDocument();
103
- });
104
- ```
105
-
106
- ## MUST: Use Accessible Queries
107
-
108
- **MUST prefer accessible queries (byRole, byLabelText, etc.):**
109
-
110
- ```tsx
111
- // ✅ CORRECT: Accessible queries (byRole, byLabelText, byText)
112
- screen.getByRole('button', { name: /submit/i });
113
- screen.getByLabelText(/email address/i);
114
-
115
- // ❌ AVOID: Non-accessible queries (getByTestId, getByClassName - use as last resort)
116
- ```
117
-
118
- ## SHOULD: Test Critical Paths
119
-
120
- **SHOULD test:**
121
- - User workflows and interactions
122
- - Error handling and edge cases
123
- - Form validation
124
- - Permission checks (RBAC)
125
- - Data loading states
126
- - Error states
127
-
128
- ## SHOULD: Use Descriptive Test Names
129
-
130
- **Test names SHOULD describe behavior:**
131
-
132
- ```tsx
133
- // ❌ WRONG - Vague
134
- test('button works', () => { ... });
135
-
136
- // ✅ CORRECT - Descriptive
137
- test('increments counter when increment button is clicked', () => { ... });
138
- test('displays error message when API call fails', () => { ... });
139
- ```
140
-
141
- ## SHOULD: Group Related Tests
142
-
143
- **SHOULD use `describe` blocks to group related tests:**
144
-
145
- ```tsx
146
- describe('EventCard', () => {
147
- describe('rendering', () => {
148
- test('displays event title', () => { ... });
149
- test('displays event date', () => { ... });
150
- });
151
-
152
- describe('interactions', () => {
153
- test('calls onEdit when edit button clicked', () => { ... });
154
- test('calls onDelete when delete button clicked', () => { ... });
155
- });
156
- });
157
- ```
158
-
159
- ## MUST: Avoid Unnecessary Mocks
160
-
161
- **MUST NOT mock unless necessary:**
162
-
163
- ```tsx
164
- // ❌ WRONG: Unnecessary mock (global.fetch = mockFetch)
165
- // ✅ CORRECT: Use real implementation or MSW
166
- import { server } from './mocks/server';
167
- server.use(rest.get('/api/events', (req, res, ctx) => res(ctx.json([{ id: '1', name: 'Event' }]))));
168
- ```
169
-
170
- ## MUST: Test Async Code Properly
171
-
172
- **MUST handle async operations correctly:**
173
-
174
- ```tsx
175
- // ✅ CORRECT: Async testing with waitFor
176
- test('loads and displays events', async () => {
177
- render(<EventList />);
178
- expect(screen.getByText(/loading/i)).toBeInTheDocument();
179
- await waitFor(() => expect(screen.getByText('Event 1')).toBeInTheDocument());
180
- expect(screen.queryByText(/loading/i)).not.toBeInTheDocument();
181
- });
182
- ```
183
-
184
- ## MUST: Clean Up After Tests
185
-
186
- **MUST clean up resources:**
187
-
188
- ```tsx
189
- // ✅ CORRECT: Cleanup after tests
190
- afterEach(() => { cleanup(); vi.clearAllMocks(); });
191
- ```
192
-
193
- ## SHOULD: Use Test Utilities
194
-
195
- **SHOULD create reusable test utilities:**
196
-
197
- ```tsx
198
- // ✅ CORRECT: Reusable test utilities
199
- export function renderWithProviders(ui: React.ReactElement) {
200
- return render(<UnifiedAuthProvider supabaseClient={mockSupabase} appName="Test App">{ui}</UnifiedAuthProvider>);
201
- }
202
- // Usage: renderWithProviders(<MyComponent />);
203
- ```
204
-
205
- ## MUST: Include Timeout Parameters
206
-
207
- **Tests MUST include timeout parameters to prevent hanging:**
208
-
209
- ```tsx
210
- // ✅ CORRECT: Include timeout parameters to prevent hanging
211
- test('async operation completes', async () => {
212
- await waitFor(() => expect(screen.getByText('Loaded')).toBeInTheDocument(), { timeout: 5000 });
213
- }, { timeout: 10000 });
214
- ```
215
-
216
- ## Testing Checklist
217
-
218
- Before committing tests, verify:
219
- - [ ] Coverage meets requirements (≥90% utils, ≥70% components)
220
- - [ ] Using React Testing Library + userEvent
221
- - [ ] Tests are colocated with source files
222
- - [ ] Testing user behavior, not implementation
223
- - [ ] Using accessible queries (byRole, byLabelText)
224
- - [ ] Test names are descriptive
225
- - [ ] Related tests grouped with describe
226
- - [ ] No unnecessary mocks
227
- - [ ] Async code tested properly
228
- - [ ] Cleanup after tests
229
- - [ ] Timeout parameters included
230
-
231
- ## Test Structure Template
232
-
233
- ```tsx
234
- import { describe, test, expect, vi, beforeEach, afterEach } from 'vitest';
235
- import { render, screen, waitFor } from '@testing-library/react';
236
- import userEvent from '@testing-library/user-event';
237
- import { ComponentName } from './ComponentName';
238
-
239
- describe('ComponentName', () => {
240
- beforeEach(() => {
241
- // Setup
242
- });
243
-
244
- afterEach(() => {
245
- // Cleanup
246
- vi.clearAllMocks();
247
- });
248
-
249
- describe('rendering', () => {
250
- test('renders correctly', () => {
251
- render(<ComponentName />);
252
- // Assertions
253
- });
254
- });
255
-
256
- describe('interactions', () => {
257
- test('handles user interaction', async () => {
258
- const user = userEvent.setup();
259
- render(<ComponentName />);
260
- // Test interaction
261
- });
262
- });
263
- });
264
- ```
265
-
266
- ## Reference
267
-
268
- - React Testing Library: https://testing-library.com/react
269
- - Vitest: https://vitest.dev
270
- - Testing Standards: See `06-testing-and-docs-standard.md` in pace-core docs
@@ -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]