@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
@@ -116,15 +116,15 @@ const TestComponent = () => {
116
116
  const org = useOrganisations();
117
117
 
118
118
  return (
119
- <div data-testid="test-component">
120
- <div data-testid="organisations-count">{org.organisations.length}</div>
121
- <div data-testid="isLoading">{org.isLoading ? 'true' : 'false'}</div>
122
- <div data-testid="error">{org.error?.message || 'no-error'}</div>
123
- <div data-testid="selectedOrg">{org.selectedOrganisation?.name || org.selectedOrganisation?.display_name || 'no-org'}</div>
124
- <div data-testid="hasValidContext">{org.hasValidOrganisationContext ? 'true' : 'false'}</div>
125
- <div data-testid="hasSetSelectedOrg">{typeof org.setSelectedOrganisation === 'function' ? 'true' : 'false'}</div>
126
- <div data-testid="hasRefreshOrg">{typeof org.refreshOrganisations === 'function' ? 'true' : 'false'}</div>
127
- </div>
119
+ <section data-testid="test-component">
120
+ <p data-testid="organisations-count">{org.organisations.length}</p>
121
+ <p data-testid="isLoading">{org.isLoading ? 'true' : 'false'}</p>
122
+ <p data-testid="error">{org.error?.message || 'no-error'}</p>
123
+ <p data-testid="selectedOrg">{org.selectedOrganisation?.name || org.selectedOrganisation?.display_name || 'no-org'}</p>
124
+ <p data-testid="hasValidContext">{org.hasValidOrganisationContext ? 'true' : 'false'}</p>
125
+ <p data-testid="hasSetSelectedOrg">{typeof org.setSelectedOrganisation === 'function' ? 'true' : 'false'}</p>
126
+ <p data-testid="hasRefreshOrg">{typeof org.refreshOrganisations === 'function' ? 'true' : 'false'}</p>
127
+ </section>
128
128
  );
129
129
  };
130
130
 
@@ -168,7 +168,7 @@ describe('OrganisationProvider', () => {
168
168
  </TestWrapper>
169
169
  );
170
170
 
171
- expect(screen.getByTestId('test-component')).toBeInTheDocument();
171
+ expect(screen.getByTestId('test-component')).toBeDefined();
172
172
 
173
173
  // Wait for organisations to load - OrganisationService initializes asynchronously
174
174
  // The service calls notify() in finally block, and useOrganisationService has 50ms debounce
@@ -203,7 +203,7 @@ describe('OrganisationProvider', () => {
203
203
  </TestWrapper>
204
204
  );
205
205
 
206
- expect(screen.getByTestId('test-component')).toBeInTheDocument();
206
+ expect(screen.getByTestId('test-component')).toBeDefined();
207
207
  });
208
208
  });
209
209
 
@@ -255,9 +255,9 @@ describe('OrganisationProvider', () => {
255
255
  const TestHookComponent = () => {
256
256
  try {
257
257
  const org = useOrganisations();
258
- return <div data-testid="hook-success">Hook works</div>;
258
+ return <p data-testid="hook-success">Hook works</p>;
259
259
  } catch (error) {
260
- return <div data-testid="hook-error">Hook failed</div>;
260
+ return <p data-testid="hook-error">Hook failed</p>;
261
261
  }
262
262
  };
263
263
 
@@ -267,7 +267,7 @@ describe('OrganisationProvider', () => {
267
267
  </TestWrapper>
268
268
  );
269
269
 
270
- expect(screen.getByTestId('hook-success')).toBeInTheDocument();
270
+ expect(screen.getByTestId('hook-success')).toBeDefined();
271
271
  });
272
272
  });
273
273
 
@@ -279,7 +279,7 @@ describe('OrganisationProvider', () => {
279
279
  </TestWrapper>
280
280
  );
281
281
 
282
- expect(screen.getByTestId('test-component')).toBeInTheDocument();
282
+ expect(screen.getByTestId('test-component')).toBeDefined();
283
283
  // Without supabase client, organisations won't load, so count should be 0
284
284
  expect(screen.getByTestId('organisations-count')).toHaveTextContent('0');
285
285
  });
@@ -291,7 +291,7 @@ describe('OrganisationProvider', () => {
291
291
  </TestWrapper>
292
292
  );
293
293
 
294
- expect(screen.getByTestId('test-component')).toBeInTheDocument();
294
+ expect(screen.getByTestId('test-component')).toBeDefined();
295
295
  });
296
296
 
297
297
  it('handles missing session', () => {
@@ -301,7 +301,7 @@ describe('OrganisationProvider', () => {
301
301
  </TestWrapper>
302
302
  );
303
303
 
304
- expect(screen.getByTestId('test-component')).toBeInTheDocument();
304
+ expect(screen.getByTestId('test-component')).toBeDefined();
305
305
  });
306
306
  });
307
307
 
@@ -311,11 +311,11 @@ describe('OrganisationProvider', () => {
311
311
  const { organisations, isLoading, error } = useOrganisations();
312
312
 
313
313
  return (
314
- <div>
315
- <div data-testid="orgs-loaded">{organisations.length}</div>
316
- <div data-testid="loading-status">{isLoading ? 'loading' : 'ready'}</div>
317
- <div data-testid="error-status">{error ? 'error' : 'no-error'}</div>
318
- </div>
314
+ <section>
315
+ <p data-testid="orgs-loaded">{organisations.length}</p>
316
+ <p data-testid="loading-status">{isLoading ? 'loading' : 'ready'}</p>
317
+ <p data-testid="error-status">{error ? 'error' : 'no-error'}</p>
318
+ </section>
319
319
  );
320
320
  };
321
321
 
@@ -325,7 +325,7 @@ describe('OrganisationProvider', () => {
325
325
  </TestWrapper>
326
326
  );
327
327
 
328
- expect(screen.getByTestId('orgs-loaded')).toBeInTheDocument();
328
+ expect(screen.getByTestId('orgs-loaded')).toBeDefined();
329
329
  expect(screen.getByTestId('loading-status')).toHaveTextContent('ready');
330
330
  expect(screen.getByTestId('error-status')).toHaveTextContent('no-error');
331
331
  });
@@ -335,15 +335,15 @@ describe('OrganisationProvider', () => {
335
335
  const { organisations, setSelectedOrganisation, selectedOrganisation } = useOrganisations();
336
336
 
337
337
  return (
338
- <div>
339
- <div data-testid="selected-org">{selectedOrganisation?.name || selectedOrganisation?.display_name || 'none'}</div>
338
+ <section>
339
+ <p data-testid="selected-org">{selectedOrganisation?.name || selectedOrganisation?.display_name || 'none'}</p>
340
340
  <button
341
341
  data-testid="select-org-btn"
342
342
  onClick={() => setSelectedOrganisation(organisations[0] || null)}
343
343
  >
344
344
  Select First
345
345
  </button>
346
- </div>
346
+ </section>
347
347
  );
348
348
  };
349
349
 
@@ -353,8 +353,8 @@ describe('OrganisationProvider', () => {
353
353
  </TestWrapper>
354
354
  );
355
355
 
356
- expect(screen.getByTestId('selected-org')).toBeInTheDocument();
357
- expect(screen.getByTestId('select-org-btn')).toBeInTheDocument();
356
+ expect(screen.getByTestId('selected-org')).toBeDefined();
357
+ expect(screen.getByTestId('select-org-btn')).toBeDefined();
358
358
  });
359
359
 
360
360
  it('handles organisation switching', () => {
@@ -362,8 +362,8 @@ describe('OrganisationProvider', () => {
362
362
  const { organisations, setSelectedOrganisation, selectedOrganisation } = useOrganisations();
363
363
 
364
364
  return (
365
- <div>
366
- <div data-testid="current-org">{selectedOrganisation?.name || selectedOrganisation?.display_name || 'none'}</div>
365
+ <section>
366
+ <p data-testid="current-org">{selectedOrganisation?.name || selectedOrganisation?.display_name || 'none'}</p>
367
367
  <button
368
368
  data-testid="switch-org-btn"
369
369
  onClick={() => {
@@ -374,7 +374,7 @@ describe('OrganisationProvider', () => {
374
374
  >
375
375
  Switch Org
376
376
  </button>
377
- </div>
377
+ </section>
378
378
  );
379
379
  };
380
380
 
@@ -384,8 +384,8 @@ describe('OrganisationProvider', () => {
384
384
  </TestWrapper>
385
385
  );
386
386
 
387
- expect(screen.getByTestId('current-org')).toBeInTheDocument();
388
- expect(screen.getByTestId('switch-org-btn')).toBeInTheDocument();
387
+ expect(screen.getByTestId('current-org')).toBeDefined();
388
+ expect(screen.getByTestId('switch-org-btn')).toBeDefined();
389
389
  });
390
390
  });
391
391
 
@@ -395,10 +395,10 @@ describe('OrganisationProvider', () => {
395
395
  const { hasValidOrganisationContext, selectedOrganisation } = useOrganisations();
396
396
 
397
397
  return (
398
- <div>
399
- <div data-testid="valid-context">{hasValidOrganisationContext ? 'valid' : 'invalid'}</div>
400
- <div data-testid="context-status">{selectedOrganisation ? 'set' : 'not-set'}</div>
401
- </div>
398
+ <section>
399
+ <p data-testid="valid-context">{hasValidOrganisationContext ? 'valid' : 'invalid'}</p>
400
+ <p data-testid="context-status">{selectedOrganisation ? 'set' : 'not-set'}</p>
401
+ </section>
402
402
  );
403
403
  };
404
404
 
@@ -408,8 +408,8 @@ describe('OrganisationProvider', () => {
408
408
  </TestWrapper>
409
409
  );
410
410
 
411
- expect(screen.getByTestId('valid-context')).toBeInTheDocument();
412
- expect(screen.getByTestId('context-status')).toBeInTheDocument();
411
+ expect(screen.getByTestId('valid-context')).toBeDefined();
412
+ expect(screen.getByTestId('context-status')).toBeDefined();
413
413
  });
414
414
 
415
415
  it('provides organisation refresh functionality', () => {
@@ -417,11 +417,11 @@ describe('OrganisationProvider', () => {
417
417
  const { refreshOrganisations } = useOrganisations();
418
418
 
419
419
  return (
420
- <div>
420
+ <section>
421
421
  <button data-testid="refresh-org-btn" onClick={() => refreshOrganisations()}>
422
422
  Refresh Organisations
423
423
  </button>
424
- </div>
424
+ </section>
425
425
  );
426
426
  };
427
427
 
@@ -432,7 +432,7 @@ describe('OrganisationProvider', () => {
432
432
  );
433
433
 
434
434
  const btn = screen.getByTestId('refresh-org-btn');
435
- expect(btn).toBeInTheDocument();
435
+ expect(btn).toBeDefined();
436
436
 
437
437
  // Click refresh
438
438
  fireEvent.click(btn);
@@ -444,12 +444,12 @@ describe('OrganisationProvider', () => {
444
444
  const { selectedOrganisation, organisations } = useOrganisations();
445
445
 
446
446
  return (
447
- <div>
448
- <div data-testid="org-state">
447
+ <section>
448
+ <p data-testid="org-state">
449
449
  {selectedOrganisation ? (selectedOrganisation.name || selectedOrganisation.display_name) : 'none'}
450
- </div>
451
- <div data-testid="orgs-count">{organisations.length}</div>
452
- </div>
450
+ </p>
451
+ <p data-testid="orgs-count">{organisations.length}</p>
452
+ </section>
453
453
  );
454
454
  };
455
455
 
@@ -473,7 +473,7 @@ describe('OrganisationProvider', () => {
473
473
  // After re-render, state should remain stable
474
474
  const orgStateAfter = screen.getByTestId('org-state').textContent;
475
475
  expect(orgStateAfter).toBe(orgState); // State should be stable
476
- expect(screen.getByTestId('orgs-count')).toBeInTheDocument();
476
+ expect(screen.getByTestId('orgs-count')).toBeDefined();
477
477
  });
478
478
  });
479
479
 
@@ -483,10 +483,10 @@ describe('OrganisationProvider', () => {
483
483
  const { selectedOrganisation, organisations } = useOrganisations();
484
484
 
485
485
  return (
486
- <div>
487
- <div data-testid="auth-integrated">integrated</div>
488
- <div data-testid="orgs-available">{organisations.length > 0 ? 'yes' : 'no'}</div>
489
- </div>
486
+ <section>
487
+ <p data-testid="auth-integrated">integrated</p>
488
+ <p data-testid="orgs-available">{organisations.length > 0 ? 'yes' : 'no'}</p>
489
+ </section>
490
490
  );
491
491
  };
492
492
 
@@ -506,8 +506,8 @@ describe('OrganisationProvider', () => {
506
506
  </TestWrapper>
507
507
  );
508
508
 
509
- expect(screen.getByTestId('auth-integrated')).toBeInTheDocument();
510
- expect(screen.getByTestId('orgs-available')).toBeInTheDocument();
509
+ expect(screen.getByTestId('auth-integrated')).toBeDefined();
510
+ expect(screen.getByTestId('orgs-available')).toBeDefined();
511
511
  });
512
512
 
513
513
  it('handles missing auth gracefully', () => {
@@ -515,11 +515,11 @@ describe('OrganisationProvider', () => {
515
515
  const { organisations, selectedOrganisation } = useOrganisations();
516
516
 
517
517
  return (
518
- <div>
519
- <div data-testid="orgs-count">{organisations.length}</div>
520
- <div data-testid="has-selection">{selectedOrganisation ? 'yes' : 'no'}</div>
521
- <div data-testid="orgs-array-exists">{Array.isArray(organisations) ? 'yes' : 'no'}</div>
522
- </div>
518
+ <section>
519
+ <p data-testid="orgs-count">{organisations.length}</p>
520
+ <p data-testid="has-selection">{selectedOrganisation ? 'yes' : 'no'}</p>
521
+ <p data-testid="orgs-array-exists">{Array.isArray(organisations) ? 'yes' : 'no'}</p>
522
+ </section>
523
523
  );
524
524
  };
525
525
 
@@ -529,10 +529,10 @@ describe('OrganisationProvider', () => {
529
529
  </TestWrapper>
530
530
  );
531
531
 
532
- expect(screen.getByTestId('orgs-count')).toBeInTheDocument();
532
+ expect(screen.getByTestId('orgs-count')).toBeDefined();
533
533
  expect(screen.getByTestId('orgs-array-exists')).toHaveTextContent('yes');
534
534
  // Mock might return data, so we just check the structure exists
535
- expect(screen.getByTestId('has-selection')).toBeInTheDocument();
535
+ expect(screen.getByTestId('has-selection')).toBeDefined();
536
536
  });
537
537
 
538
538
  it('supports organisation hierarchy', () => {
@@ -540,10 +540,10 @@ describe('OrganisationProvider', () => {
540
540
  const { organisations, selectedOrganisation } = useOrganisations();
541
541
 
542
542
  return (
543
- <div>
544
- <div data-testid="has-organisations">{organisations.length > 0 ? 'yes' : 'no'}</div>
545
- <div data-testid="hierarchy-supported">supported</div>
546
- </div>
543
+ <section>
544
+ <p data-testid="has-organisations">{organisations.length > 0 ? 'yes' : 'no'}</p>
545
+ <p data-testid="hierarchy-supported">supported</p>
546
+ </section>
547
547
  );
548
548
  };
549
549
 
@@ -553,7 +553,7 @@ describe('OrganisationProvider', () => {
553
553
  </TestWrapper>
554
554
  );
555
555
 
556
- expect(screen.getByTestId('has-organisations')).toBeInTheDocument();
556
+ expect(screen.getByTestId('has-organisations')).toBeDefined();
557
557
  expect(screen.getByTestId('hierarchy-supported')).toHaveTextContent('supported');
558
558
  });
559
559
  });
@@ -564,10 +564,10 @@ describe('OrganisationProvider', () => {
564
564
  const { error, organisations } = useOrganisations();
565
565
 
566
566
  return (
567
- <div>
568
- <div data-testid="error-state">{error ? 'has-error' : 'no-error'}</div>
569
- <div data-testid="orgs-available">{organisations.length}</div>
570
- </div>
567
+ <section>
568
+ <p data-testid="error-state">{error ? 'has-error' : 'no-error'}</p>
569
+ <p data-testid="orgs-available">{organisations.length}</p>
570
+ </section>
571
571
  );
572
572
  };
573
573
 
@@ -577,8 +577,8 @@ describe('OrganisationProvider', () => {
577
577
  </TestWrapper>
578
578
  );
579
579
 
580
- expect(screen.getByTestId('error-state')).toBeInTheDocument();
581
- expect(screen.getByTestId('orgs-available')).toBeInTheDocument();
580
+ expect(screen.getByTestId('error-state')).toBeDefined();
581
+ expect(screen.getByTestId('orgs-available')).toBeDefined();
582
582
  });
583
583
 
584
584
  it('maintains stability with rapid operations', () => {
@@ -586,7 +586,7 @@ describe('OrganisationProvider', () => {
586
586
  const { setSelectedOrganisation, refreshOrganisations, organisations } = useOrganisations();
587
587
 
588
588
  return (
589
- <div>
589
+ <section>
590
590
  <button
591
591
  data-testid="rapid-ops-btn"
592
592
  onClick={() => {
@@ -596,7 +596,7 @@ describe('OrganisationProvider', () => {
596
596
  >
597
597
  Rapid Ops
598
598
  </button>
599
- </div>
599
+ </section>
600
600
  );
601
601
  };
602
602
 
@@ -611,7 +611,7 @@ describe('OrganisationProvider', () => {
611
611
  fireEvent.click(btn);
612
612
  fireEvent.click(btn);
613
613
 
614
- expect(btn).toBeInTheDocument();
614
+ expect(btn).toBeDefined();
615
615
  });
616
616
  });
617
617
  });
@@ -14,7 +14,7 @@ import { createMockSupabaseClient } from '../../__tests__/helpers/supabaseMock';
14
14
 
15
15
  // Mock providers
16
16
  vi.mock('../AuthProvider', () => ({
17
- AuthProvider: ({ children }: { children: ReactNode }) => <div data-testid="auth-provider">{children}</div>,
17
+ AuthProvider: ({ children }: { children: ReactNode }) => <section data-testid="auth-provider">{children}</section>,
18
18
  useAuth: () => ({
19
19
  user: { id: 'test-user' },
20
20
  session: {},
@@ -24,7 +24,7 @@ vi.mock('../AuthProvider', () => ({
24
24
  }));
25
25
 
26
26
  vi.mock('../OrganisationProvider', () => ({
27
- OrganisationProvider: ({ children }: { children: ReactNode }) => <div data-testid="org-provider">{children}</div>,
27
+ OrganisationProvider: ({ children }: { children: ReactNode }) => <section data-testid="org-provider">{children}</section>,
28
28
  useOrganisations: () => ({
29
29
  selectedOrganisation: { id: 'test-org' },
30
30
  isContextReady: true,
@@ -44,28 +44,28 @@ describe('Provider Lifecycle Tests', () => {
44
44
 
45
45
  describe('Provider Initialization', () => {
46
46
  it('should initialize provider without errors', () => {
47
- const TestComponent = () => <div data-testid="child">Test</div>;
47
+ const TestComponent = () => <p data-testid="child">Test</p>;
48
48
 
49
49
  render(<TestComponent />);
50
50
 
51
- expect(screen.getByTestId('child')).toBeInTheDocument();
51
+ expect(screen.getByTestId('child')).toBeDefined();
52
52
  });
53
53
 
54
54
  it('should handle nested provider hierarchies', () => {
55
55
  const ChildProvider = ({ children }: { children: ReactNode }) => (
56
- <div data-testid="child-provider">{children}</div>
56
+ <section data-testid="child-provider">{children}</section>
57
57
  );
58
58
 
59
59
  const TestComponent = () => (
60
60
  <ChildProvider>
61
- <div data-testid="nested-child">Nested</div>
61
+ <p data-testid="nested-child">Nested</p>
62
62
  </ChildProvider>
63
63
  );
64
64
 
65
65
  render(<TestComponent />);
66
66
 
67
- expect(screen.getByTestId('child-provider')).toBeInTheDocument();
68
- expect(screen.getByTestId('nested-child')).toBeInTheDocument();
67
+ expect(screen.getByTestId('child-provider')).toBeDefined();
68
+ expect(screen.getByTestId('nested-child')).toBeDefined();
69
69
  });
70
70
  });
71
71
 
@@ -73,12 +73,12 @@ describe('Provider Lifecycle Tests', () => {
73
73
  it('should cleanup on unmount without errors', () => {
74
74
  const TestComponent = ({ isVisible }: { isVisible: boolean }) => {
75
75
  if (!isVisible) return null;
76
- return <div data-testid="cleanup-test">Cleanup</div>;
76
+ return <p data-testid="cleanup-test">Cleanup</p>;
77
77
  };
78
78
 
79
79
  const { rerender } = render(<TestComponent isVisible={true} />);
80
80
 
81
- expect(screen.getByTestId('cleanup-test')).toBeInTheDocument();
81
+ expect(screen.getByTestId('cleanup-test')).toBeDefined();
82
82
 
83
83
  rerender(<TestComponent isVisible={false} />);
84
84
 
@@ -95,12 +95,12 @@ describe('Provider Lifecycle Tests', () => {
95
95
  cleanupRef.current();
96
96
  };
97
97
  }, []);
98
- return <div data-testid="listener-test">Test</div>;
98
+ return <p data-testid="listener-test">Test</p>;
99
99
  };
100
100
 
101
101
  const { unmount: unmountComponent } = render(<TestComponent />);
102
102
 
103
- expect(screen.getByTestId('listener-test')).toBeInTheDocument();
103
+ expect(screen.getByTestId('listener-test')).toBeDefined();
104
104
 
105
105
  act(() => {
106
106
  unmountComponent();
@@ -123,7 +123,7 @@ describe('Provider Lifecycle Tests', () => {
123
123
  React.useEffect(() => {
124
124
  return () => cleanup2Ref.current();
125
125
  }, []);
126
- return <div data-testid="multi-listener">Test</div>;
126
+ return <p data-testid="multi-listener">Test</p>;
127
127
  };
128
128
 
129
129
  const { unmount: unmountComponent } = render(<TestComponent />);
@@ -140,7 +140,7 @@ describe('Provider Lifecycle Tests', () => {
140
140
  describe('Provider State Management', () => {
141
141
  it('should persist state between re-renders', () => {
142
142
  const TestComponent = ({ count }: { count: number }) => (
143
- <div data-testid="state-test">{count}</div>
143
+ <p data-testid="state-test">{count}</p>
144
144
  );
145
145
 
146
146
  const { rerender } = render(<TestComponent count={1} />);
@@ -157,12 +157,12 @@ describe('Provider Lifecycle Tests', () => {
157
157
  const [count, setCount] = useState(0);
158
158
 
159
159
  return (
160
- <div>
161
- <div data-testid="count">{count}</div>
160
+ <section>
161
+ <p data-testid="count">{count}</p>
162
162
  <button data-testid="increment" onClick={() => setCount(c => c + 1)}>
163
163
  Increment
164
164
  </button>
165
- </div>
165
+ </section>
166
166
  );
167
167
  };
168
168
 
@@ -184,7 +184,7 @@ describe('Provider Lifecycle Tests', () => {
184
184
  Promise.resolve('async-data').then(setData);
185
185
  }, []);
186
186
 
187
- return <div data-testid="async-state">{data || 'loading'}</div>;
187
+ return <p data-testid="async-state">{data || 'loading'}</p>;
188
188
  };
189
189
 
190
190
  render(<AsyncComponent />);
@@ -202,14 +202,14 @@ describe('Provider Lifecycle Tests', () => {
202
202
  // Test that providers handle initialization gracefully
203
203
  const ErrorProvider = ({ children }: { children: ReactNode }) => {
204
204
  try {
205
- return <div data-testid="error-provider">{children}</div>;
205
+ return <section data-testid="error-provider">{children}</section>;
206
206
  } catch (error) {
207
207
  console.error('Provider initialization error:', error);
208
- return <div data-testid="error-fallback">Error handled</div>;
208
+ return <p data-testid="error-fallback">Error handled</p>;
209
209
  }
210
210
  };
211
211
 
212
- const TestComponent = () => <div data-testid="child">Test</div>;
212
+ const TestComponent = () => <p data-testid="child">Test</p>;
213
213
 
214
214
  render(
215
215
  <ErrorProvider>
@@ -218,8 +218,8 @@ describe('Provider Lifecycle Tests', () => {
218
218
  );
219
219
 
220
220
  // Provider should render children successfully
221
- expect(screen.getByTestId('error-provider')).toBeInTheDocument();
222
- expect(screen.getByTestId('child')).toBeInTheDocument();
221
+ expect(screen.getByTestId('error-provider')).toBeDefined();
222
+ expect(screen.getByTestId('child')).toBeDefined();
223
223
  });
224
224
 
225
225
  it('should recover from errors in provider lifecycle', () => {
@@ -230,7 +230,7 @@ describe('Provider Lifecycle Tests', () => {
230
230
  shouldError = false; // Recover on next render
231
231
  throw new Error('Test error');
232
232
  }
233
- return <div data-testid="recoverable-provider">{children}</div>;
233
+ return <section data-testid="recoverable-provider">{children}</section>;
234
234
  };
235
235
 
236
236
  // Use Error Boundary pattern
@@ -259,10 +259,10 @@ describe('Provider Lifecycle Tests', () => {
259
259
  }
260
260
  }
261
261
 
262
- const TestComponent = () => <div data-testid="child">Test</div>;
262
+ const TestComponent = () => <p data-testid="child">Test</p>;
263
263
 
264
264
  const { rerender } = render(
265
- <ErrorBoundary fallback={<div data-testid="error-boundary">Error</div>}>
265
+ <ErrorBoundary fallback={<p data-testid="error-boundary">Error</p>}>
266
266
  <RecoverableProvider>
267
267
  <TestComponent />
268
268
  </RecoverableProvider>
@@ -270,8 +270,8 @@ describe('Provider Lifecycle Tests', () => {
270
270
  );
271
271
 
272
272
  // Initially should render successfully
273
- expect(screen.getByTestId('recoverable-provider')).toBeInTheDocument();
274
- expect(screen.getByTestId('child')).toBeInTheDocument();
273
+ expect(screen.getByTestId('recoverable-provider')).toBeDefined();
274
+ expect(screen.getByTestId('child')).toBeDefined();
275
275
  });
276
276
  });
277
277
 
@@ -288,7 +288,7 @@ describe('Provider Lifecycle Tests', () => {
288
288
  return () => clearInterval(timer);
289
289
  }, []);
290
290
 
291
- return <div data-testid="timer-count">{count}</div>;
291
+ return <p data-testid="timer-count">{count}</p>;
292
292
  };
293
293
 
294
294
  const { unmount } = render(<TimerComponent />);
@@ -310,7 +310,7 @@ describe('Provider Lifecycle Tests', () => {
310
310
  };
311
311
  }, []);
312
312
 
313
- return <div data-testid="listener-component">Test</div>;
313
+ return <p data-testid="listener-component">Test</p>;
314
314
  };
315
315
 
316
316
  const { unmount } = render(<EventListenerComponent />);
@@ -328,7 +328,7 @@ describe('Provider Lifecycle Tests', () => {
328
328
 
329
329
  const OptimizedComponent = React.memo(() => {
330
330
  renderCount();
331
- return <div data-testid="optimized">Test</div>;
331
+ return <p data-testid="optimized">Test</p>;
332
332
  });
333
333
 
334
334
  const { rerender } = render(
@@ -348,7 +348,7 @@ describe('Provider Lifecycle Tests', () => {
348
348
 
349
349
  const StateComponent = ({ value }: { value: number }) => {
350
350
  renderCount();
351
- return <div data-testid="state-render">{value}</div>;
351
+ return <p data-testid="state-render">{value}</p>;
352
352
  };
353
353
 
354
354
  const { rerender } = render(<StateComponent value={1} />);
@@ -364,7 +364,7 @@ describe('Provider Lifecycle Tests', () => {
364
364
 
365
365
  describe('Provider Edge Cases', () => {
366
366
  it('should handle rapid mount/unmount cycles', () => {
367
- const RapidComponent = () => <div data-testid="rapid">Rapid</div>;
367
+ const RapidComponent = () => <p data-testid="rapid">Rapid</p>;
368
368
 
369
369
  for (let i = 0; i < 10; i++) {
370
370
  const { unmount } = render(<RapidComponent />);
@@ -376,16 +376,16 @@ describe('Provider Lifecycle Tests', () => {
376
376
  });
377
377
 
378
378
  it('should handle component with no children', () => {
379
- const EmptyProvider = () => <div data-testid="empty">Empty</div>;
379
+ const EmptyProvider = () => <p data-testid="empty">Empty</p>;
380
380
 
381
381
  render(<EmptyProvider />);
382
382
 
383
- expect(screen.getByTestId('empty')).toBeInTheDocument();
383
+ expect(screen.getByTestId('empty')).toBeDefined();
384
384
  });
385
385
 
386
386
  it('should handle null children gracefully', () => {
387
387
  const NullProvider = ({ children }: { children: ReactNode }) => (
388
- <div data-testid="null-provider">{children || 'No children'}</div>
388
+ <section data-testid="null-provider">{children || 'No children'}</section>
389
389
  );
390
390
 
391
391
  render(<NullProvider>{null}</NullProvider>);
@@ -415,7 +415,7 @@ class ErrorBoundary extends React.Component<
415
415
 
416
416
  render() {
417
417
  if (this.state.hasError) {
418
- return <div data-testid="error-boundary">Something went wrong</div>;
418
+ return <p data-testid="error-boundary">Something went wrong</p>;
419
419
  }
420
420
 
421
421
  return this.props.children;