@jmruthers/pace-core 0.6.5 → 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 (473) hide show
  1. package/CHANGELOG.md +104 -0
  2. package/README.md +5 -403
  3. package/audit-tool/00-dependencies.cjs +394 -0
  4. package/audit-tool/audits/01-pace-core-compliance.cjs +556 -0
  5. package/audit-tool/audits/02-project-structure.cjs +255 -0
  6. package/audit-tool/audits/03-architecture.cjs +196 -0
  7. package/audit-tool/audits/04-code-quality.cjs +149 -0
  8. package/audit-tool/audits/05-styling.cjs +224 -0
  9. package/audit-tool/audits/06-security-rbac.cjs +544 -0
  10. package/audit-tool/audits/07-api-tech-stack.cjs +301 -0
  11. package/audit-tool/audits/08-testing-documentation.cjs +202 -0
  12. package/audit-tool/audits/09-operations.cjs +208 -0
  13. package/audit-tool/index.cjs +291 -0
  14. package/audit-tool/utils/code-utils.cjs +218 -0
  15. package/audit-tool/utils/file-utils.cjs +230 -0
  16. package/audit-tool/utils/report-utils.cjs +241 -0
  17. package/core-usage-manifest.json +93 -0
  18. package/cursor-rules/00-standards-overview.mdc +156 -0
  19. package/cursor-rules/01-pace-core-compliance.mdc +586 -0
  20. package/cursor-rules/02-project-structure.mdc +42 -4
  21. package/cursor-rules/{03-solid-principles.mdc → 03-architecture.mdc} +126 -10
  22. package/cursor-rules/04-code-quality.mdc +419 -0
  23. package/cursor-rules/{08-markup-quality.mdc → 05-styling.mdc} +104 -34
  24. package/cursor-rules/06-security-rbac.mdc +518 -0
  25. package/cursor-rules/07-api-tech-stack.mdc +377 -0
  26. package/cursor-rules/08-testing-documentation.mdc +324 -0
  27. package/cursor-rules/09-operations.mdc +365 -0
  28. package/dist/{AuthService-Cb34EQs3.d.ts → AuthService-DmfO5rGS.d.ts} +10 -0
  29. package/dist/DataTable-7PMH7XN7.js +15 -0
  30. package/dist/{DataTable-BMRU8a1j.d.ts → DataTable-DRUIgtUH.d.ts} +1 -1
  31. package/dist/{PublicPageProvider-QTFVrL-Z.d.ts → PublicPageProvider-DlsCaR5v.d.ts} +33 -72
  32. package/dist/UnifiedAuthProvider-ZT6TIGM7.js +7 -0
  33. package/dist/api-Y4MQWOFW.js +4 -0
  34. package/dist/audit-MYQXYZFU.js +3 -0
  35. package/dist/{chunk-DGUM43GV.js → chunk-3RG5ZIWI.js} +1 -4
  36. package/dist/{chunk-QXHPKYJV.js → chunk-4SXLQIZO.js} +1 -26
  37. package/dist/{chunk-UPPMRMYG.js → chunk-5X4QLXRG.js} +73 -151
  38. package/dist/chunk-6F3IILHI.js +62 -0
  39. package/dist/{chunk-E66EQZE6.js → chunk-6GLLNA6U.js} +3 -9
  40. package/dist/{chunk-ZSAAAMVR.js → chunk-6QYDGKQY.js} +1 -4
  41. package/dist/{chunk-FMUCXFII.js → chunk-7ILTDCL2.js} +9 -5
  42. package/dist/{chunk-M43Y4SSO.js → chunk-A3W6LW53.js} +15 -13
  43. package/dist/{chunk-63FOKYGO.js → chunk-AHU7G2R5.js} +2 -11
  44. package/dist/{chunk-HU2C6SSC.js → chunk-BM4CQ5P3.js} +606 -559
  45. package/dist/chunk-C7NSAPTL.js +1 -0
  46. package/dist/{chunk-J36DSWQK.js → chunk-FEJLJNWA.js} +7 -41
  47. package/dist/{chunk-IHB5DR3H.js → chunk-FTCRZOG2.js} +188 -387
  48. package/dist/{chunk-G37KK66H.js → chunk-FYHN4DD5.js} +60 -19
  49. package/dist/chunk-GHYHJTYV.js +994 -0
  50. package/dist/{chunk-VBXEHIUJ.js → chunk-HF6O3O37.js} +6 -88
  51. package/dist/{chunk-FFQEQTNW.js → chunk-IUBRCBSY.js} +134 -45
  52. package/dist/{chunk-6COVEUS7.js → chunk-JGWDVX64.js} +983 -1034
  53. package/dist/{chunk-RGAWHO7N.js → chunk-L4XMVJKY.js} +77 -222
  54. package/dist/chunk-MBADTM7L.js +64 -0
  55. package/dist/{chunk-M7MPQISP.js → chunk-OJ4SKRSV.js} +3 -16
  56. package/dist/{chunk-IVOFDYWT.js → chunk-Q7Q7V5NV.js} +2109 -1604
  57. package/dist/{chunk-JGRYX5UX.js → chunk-S7DKJPLT.js} +29 -58
  58. package/dist/{chunk-PWLANIRT.js → chunk-TTRFSOKR.js} +1 -7
  59. package/dist/{chunk-5DRSZLL2.js → chunk-UH3NTO3F.js} +1 -6
  60. package/dist/{chunk-NTM7ZSB6.js → chunk-VBCS3DUA.js} +261 -168
  61. package/dist/{chunk-EFN2EIMK.js → chunk-ZFYPMX46.js} +271 -87
  62. package/dist/{chunk-L4OXEN46.js → chunk-ZKAWKYT4.js} +10 -24
  63. package/dist/components.d.ts +7 -5
  64. package/dist/components.js +46 -257
  65. package/dist/{database.generated-CzIvgcPu.d.ts → database.generated-CcnC_DRc.d.ts} +4795 -3691
  66. package/dist/eslint-rules/index.cjs +35 -0
  67. package/{src/eslint-rules/pace-core-compliance.cjs → dist/eslint-rules/rules/01-pace-core-compliance.cjs} +234 -235
  68. package/dist/eslint-rules/rules/04-code-quality.cjs +290 -0
  69. package/dist/eslint-rules/rules/05-styling.cjs +61 -0
  70. package/dist/eslint-rules/rules/06-security-rbac.cjs +806 -0
  71. package/dist/eslint-rules/rules/07-api-tech-stack.cjs +263 -0
  72. package/dist/eslint-rules/rules/08-testing.cjs +94 -0
  73. package/dist/eslint-rules/utils/helpers.cjs +42 -0
  74. package/dist/eslint-rules/utils/manifest-loader.cjs +75 -0
  75. package/dist/hooks.d.ts +6 -6
  76. package/dist/hooks.js +62 -172
  77. package/dist/icons/index.d.ts +1 -0
  78. package/dist/icons/index.js +1 -0
  79. package/dist/index.d.ts +12 -11
  80. package/dist/index.js +67 -660
  81. package/dist/providers.d.ts +2 -2
  82. package/dist/providers.js +8 -35
  83. package/dist/rbac/eslint-rules.d.ts +46 -44
  84. package/dist/rbac/eslint-rules.js +7 -4
  85. package/dist/rbac/index.d.ts +109 -586
  86. package/dist/rbac/index.js +14 -207
  87. package/dist/styles/index.js +2 -12
  88. package/dist/theming/runtime.d.ts +14 -1
  89. package/dist/theming/runtime.js +3 -19
  90. package/dist/{timezone-CHhWg6b4.d.ts → timezone-BZe_eUxx.d.ts} +175 -1
  91. package/dist/{types-CkbwOr4Y.d.ts → types-DXstZpNI.d.ts} +4 -17
  92. package/dist/types-t9H8qKRw.d.ts +55 -0
  93. package/dist/types.d.ts +1 -1
  94. package/dist/types.js +7 -94
  95. package/dist/{usePublicRouteParams-ClnV4tnv.d.ts → usePublicRouteParams-MamNgwqe.d.ts} +20 -20
  96. package/dist/utils.d.ts +24 -117
  97. package/dist/utils.js +54 -392
  98. package/docs/README.md +17 -7
  99. package/docs/api/README.md +4 -402
  100. package/docs/api/modules.md +301 -871
  101. package/docs/api-reference/components.md +21 -21
  102. package/docs/api-reference/deprecated.md +31 -6
  103. package/docs/api-reference/hooks.md +80 -80
  104. package/docs/api-reference/rpc-functions.md +78 -3
  105. package/docs/api-reference/types.md +1 -1
  106. package/docs/api-reference/utilities.md +1 -1
  107. package/docs/architecture/README.md +1 -1
  108. package/docs/core-concepts/events.md +3 -3
  109. package/docs/core-concepts/organisations.md +6 -6
  110. package/docs/core-concepts/permissions.md +6 -6
  111. package/docs/documentation-index.md +12 -18
  112. package/docs/getting-started/cursor-rules.md +3 -23
  113. package/docs/getting-started/dependencies.md +650 -0
  114. package/docs/getting-started/documentation-index.md +1 -1
  115. package/docs/getting-started/examples/README.md +4 -4
  116. package/docs/getting-started/examples/full-featured-app.md +1 -1
  117. package/docs/getting-started/faq.md +2 -2
  118. package/docs/getting-started/installation-guide.md +20 -7
  119. package/docs/getting-started/quick-reference.md +4 -4
  120. package/docs/getting-started/quick-start.md +23 -12
  121. package/docs/implementation-guides/authentication.md +15 -15
  122. package/docs/implementation-guides/component-styling.md +1 -1
  123. package/docs/implementation-guides/data-tables.md +126 -33
  124. package/docs/implementation-guides/datatable-rbac-usage.md +1 -1
  125. package/docs/implementation-guides/dynamic-colors.md +3 -3
  126. package/docs/implementation-guides/file-upload-storage.md +2 -2
  127. package/docs/implementation-guides/hierarchical-datatable.md +40 -60
  128. package/docs/implementation-guides/inactivity-tracking.md +3 -3
  129. package/docs/implementation-guides/large-datasets.md +3 -2
  130. package/docs/implementation-guides/organisation-security.md +2 -2
  131. package/docs/implementation-guides/performance.md +2 -2
  132. package/docs/implementation-guides/permission-enforcement.md +5 -1
  133. package/docs/migration/V0.3.44_organisation-context-timing-fix.md +1 -1
  134. package/docs/migration/V0.4.0_rbac-migration.md +6 -6
  135. package/docs/rbac/MIGRATION_GUIDE.md +819 -0
  136. package/docs/rbac/RBAC_CONTRACT.md +724 -0
  137. package/docs/rbac/README.md +17 -8
  138. package/docs/rbac/advanced-patterns.md +6 -6
  139. package/docs/rbac/api-reference.md +20 -20
  140. package/docs/rbac/edge-functions-guide.md +376 -0
  141. package/docs/rbac/event-based-apps.md +3 -3
  142. package/docs/rbac/examples.md +41 -41
  143. package/docs/rbac/getting-started.md +37 -37
  144. package/docs/rbac/performance.md +1 -1
  145. package/docs/rbac/quick-start.md +52 -52
  146. package/docs/rbac/secure-client-protection.md +1 -35
  147. package/docs/rbac/troubleshooting.md +1 -1
  148. package/docs/security/README.md +5 -5
  149. package/docs/standards/0-standards-overview.md +220 -0
  150. package/docs/standards/1-pace-core-compliance-standards.md +986 -0
  151. package/docs/standards/2-project-structure-standards.md +949 -0
  152. package/docs/standards/3-architecture-standards.md +606 -0
  153. package/docs/standards/4-code-quality-standards.md +728 -0
  154. package/docs/standards/5-styling-standards.md +348 -0
  155. package/docs/standards/{07-rbac-and-rls-standard.md → 6-security-rbac-standards.md} +269 -66
  156. package/docs/standards/7-api-tech-stack-standards.md +662 -0
  157. package/docs/standards/8-testing-documentation-standards.md +401 -0
  158. package/docs/standards/9-operations-standards.md +1102 -0
  159. package/docs/standards/README.md +185 -57
  160. package/docs/troubleshooting/README.md +4 -4
  161. package/docs/troubleshooting/common-issues.md +2 -2
  162. package/docs/troubleshooting/debugging.md +9 -9
  163. package/docs/troubleshooting/migration.md +4 -4
  164. package/docs/troubleshooting/organisation-context-setup.md +42 -19
  165. package/eslint-config-pace-core.cjs +33 -6
  166. package/package.json +35 -23
  167. package/scripts/install-cursor-rules.cjs +25 -6
  168. package/scripts/install-eslint-config.cjs +284 -0
  169. package/src/__tests__/fixtures/supabase.ts +1 -1
  170. package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +3 -3
  171. package/src/__tests__/helpers/__tests__/optimized-test-setup.test.ts +1 -1
  172. package/src/__tests__/helpers/__tests__/supabaseMock.test.ts +1 -1
  173. package/src/__tests__/helpers/__tests__/test-providers.test.tsx +2 -2
  174. package/src/__tests__/helpers/__tests__/test-utils.test.tsx +13 -13
  175. package/src/__tests__/helpers/component-test-utils.tsx +1 -1
  176. package/src/__tests__/helpers/supabaseMock.ts +2 -2
  177. package/src/__tests__/integration/UserProfile.test.tsx +14 -14
  178. package/src/__tests__/public-recipe-view.test.ts +38 -9
  179. package/src/__tests__/rbac/PagePermissionGuard.test.tsx +6 -6
  180. package/src/__tests__/templates/accessibility.test.template.tsx +9 -9
  181. package/src/__tests__/templates/component.test.template.tsx +18 -15
  182. package/src/components/Button/Button.tsx +5 -1
  183. package/src/components/Calendar/Calendar.tsx +201 -47
  184. package/src/components/ContextSelector/ContextSelector.tsx +106 -119
  185. package/src/components/DataTable/AUDIT_REPORT.md +293 -0
  186. package/src/components/DataTable/__tests__/DataTableCore.test.tsx +10 -2
  187. package/src/components/DataTable/__tests__/a11y.basic.test.tsx +10 -4
  188. package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +9 -9
  189. package/src/components/DataTable/components/ColumnFilter.tsx +63 -74
  190. package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +43 -41
  191. package/src/components/DataTable/components/DataTableCore.tsx +186 -13
  192. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +9 -11
  193. package/src/components/DataTable/components/DataTableLayout.tsx +35 -21
  194. package/src/components/DataTable/components/EditFields.tsx +23 -3
  195. package/src/components/DataTable/components/EditableRow.tsx +12 -9
  196. package/src/components/DataTable/components/EmptyState.tsx +10 -9
  197. package/src/components/DataTable/components/FilterRow.tsx +2 -4
  198. package/src/components/DataTable/components/ImportModal.tsx +124 -126
  199. package/src/components/DataTable/components/LoadingState.tsx +5 -6
  200. package/src/components/DataTable/components/RowComponent.tsx +12 -0
  201. package/src/components/DataTable/components/SortIndicator.tsx +50 -0
  202. package/src/components/DataTable/components/__tests__/COVERAGE_NOTE.md +4 -4
  203. package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +23 -82
  204. package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +37 -9
  205. package/src/components/DataTable/components/__tests__/EmptyState.test.tsx +7 -4
  206. package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +12 -4
  207. package/src/components/DataTable/components/__tests__/LoadingState.test.tsx +41 -27
  208. package/src/components/DataTable/components/hooks/usePermissionTracking.ts +0 -4
  209. package/src/components/DataTable/components/index.ts +2 -1
  210. package/src/components/DataTable/hooks/__tests__/useDataTableState.test.ts +51 -47
  211. package/src/components/DataTable/hooks/useDataTablePermissions.ts +24 -21
  212. package/src/components/DataTable/hooks/useDataTableState.ts +125 -9
  213. package/src/components/DataTable/hooks/useTableColumns.ts +40 -2
  214. package/src/components/DataTable/hooks/useTableHandlers.ts +11 -0
  215. package/src/components/DataTable/types.ts +5 -18
  216. package/src/components/DataTable/utils/a11yUtils.ts +17 -0
  217. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +2 -1
  218. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.tsx +11 -15
  219. package/src/components/DateTimeField/DateTimeField.tsx +10 -9
  220. package/src/components/Dialog/Dialog.test.tsx +128 -104
  221. package/src/components/Dialog/Dialog.tsx +742 -24
  222. package/src/components/ErrorBoundary/ErrorBoundary.tsx +77 -79
  223. package/src/components/FileDisplay/FileDisplay.test.tsx +4 -2
  224. package/src/components/FileDisplay/FileDisplay.tsx +23 -17
  225. package/src/components/FileUpload/FileUpload.test.tsx +52 -14
  226. package/src/components/FileUpload/FileUpload.tsx +112 -130
  227. package/src/components/Form/Form.test.tsx +6 -8
  228. package/src/components/Form/Form.tsx +365 -4
  229. package/src/components/NavigationMenu/NavigationMenu.test.tsx +14 -13
  230. package/src/components/NavigationMenu/useNavigationFiltering.ts +11 -21
  231. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +6 -4
  232. package/src/components/PaceAppLayout/PaceAppLayout.tsx +11 -15
  233. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +108 -61
  234. package/src/components/PaceLoginPage/PaceLoginPage.tsx +27 -3
  235. package/src/components/Progress/Progress.tsx +2 -4
  236. package/src/components/ProtectedRoute/ProtectedRoute.tsx +8 -8
  237. package/src/components/Select/Select.tsx +109 -98
  238. package/src/components/Select/types.ts +4 -1
  239. package/src/components/UserMenu/UserMenu.tsx +9 -6
  240. package/src/hooks/__tests__/ServiceHooks.test.tsx +16 -16
  241. package/src/hooks/__tests__/hooks.integration.test.tsx +55 -57
  242. package/src/hooks/__tests__/useAppConfig.unit.test.ts +129 -67
  243. package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +97 -97
  244. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +149 -67
  245. package/src/hooks/__tests__/usePublicEvent.test.ts +149 -79
  246. package/src/hooks/__tests__/usePublicEvent.unit.test.ts +158 -109
  247. package/src/hooks/__tests__/useSessionDraft.test.ts +163 -0
  248. package/src/hooks/__tests__/useSessionRestoration.unit.test.tsx +10 -5
  249. package/src/hooks/public/usePublicEvent.ts +67 -195
  250. package/src/hooks/public/usePublicEventLogo.test.ts +70 -17
  251. package/src/hooks/public/usePublicEventLogo.ts +24 -14
  252. package/src/hooks/public/usePublicFileDisplay.ts +2 -2
  253. package/src/hooks/public/usePublicRouteParams.ts +5 -5
  254. package/src/hooks/useAppConfig.ts +28 -26
  255. package/src/hooks/useEventTheme.test.ts +217 -239
  256. package/src/hooks/useEventTheme.ts +16 -28
  257. package/src/hooks/useFileDisplay.ts +2 -2
  258. package/src/hooks/useOrganisationPermissions.ts +5 -7
  259. package/src/hooks/useQueryCache.ts +0 -1
  260. package/src/hooks/useSessionDraft.ts +380 -0
  261. package/src/hooks/useSessionRestoration.ts +3 -1
  262. package/src/icons/index.ts +27 -0
  263. package/src/index.ts +5 -0
  264. package/src/providers/OrganisationProvider.tsx +23 -14
  265. package/src/providers/UnifiedAuthProvider.smoke.test.tsx +21 -21
  266. package/src/providers/__tests__/AuthProvider.test.tsx +21 -21
  267. package/src/providers/__tests__/EventProvider.test.tsx +61 -61
  268. package/src/providers/__tests__/InactivityProvider.test.tsx +56 -56
  269. package/src/providers/__tests__/OrganisationProvider.test.tsx +75 -75
  270. package/src/providers/__tests__/ProviderLifecycle.test.tsx +37 -37
  271. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +103 -103
  272. package/src/providers/services/EventServiceProvider.tsx +1 -24
  273. package/src/providers/services/UnifiedAuthProvider.tsx +5 -48
  274. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +7 -7
  275. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +13 -10
  276. package/src/rbac/__tests__/adapters.comprehensive.test.tsx +7 -457
  277. package/src/rbac/__tests__/auth-rbac.e2e.test.tsx +33 -7
  278. package/src/rbac/adapters.tsx +7 -295
  279. package/src/rbac/api.test.ts +44 -56
  280. package/src/rbac/api.ts +10 -17
  281. package/src/rbac/cache-invalidation.ts +0 -1
  282. package/src/rbac/compliance/index.ts +10 -0
  283. package/src/rbac/compliance/pattern-detector.ts +553 -0
  284. package/src/rbac/compliance/runtime-compliance.ts +22 -0
  285. package/src/rbac/components/AccessDenied.tsx +150 -0
  286. package/src/rbac/components/NavigationGuard.tsx +12 -20
  287. package/src/rbac/components/PagePermissionGuard.tsx +4 -24
  288. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +21 -8
  289. package/src/rbac/components/index.ts +3 -41
  290. package/src/rbac/eslint-rules.js +1 -1
  291. package/src/rbac/hooks/index.ts +0 -3
  292. package/src/rbac/hooks/permissions/index.ts +0 -3
  293. package/src/rbac/hooks/permissions/useAccessLevel.ts +4 -8
  294. package/src/rbac/hooks/usePermissions.ts +0 -3
  295. package/src/rbac/hooks/useResolvedScope.test.ts +57 -47
  296. package/src/rbac/hooks/useResolvedScope.ts +58 -140
  297. package/src/rbac/hooks/useResourcePermissions.test.ts +124 -38
  298. package/src/rbac/hooks/useResourcePermissions.ts +139 -48
  299. package/src/rbac/hooks/useRoleManagement.test.ts +65 -22
  300. package/src/rbac/hooks/useRoleManagement.ts +147 -19
  301. package/src/rbac/hooks/useSecureSupabase.ts +4 -8
  302. package/src/rbac/index.ts +7 -9
  303. package/src/rbac/utils/contextValidator.ts +9 -7
  304. package/src/services/AuthService.ts +130 -18
  305. package/src/services/EventService.ts +4 -97
  306. package/src/services/InactivityService.ts +16 -0
  307. package/src/services/OrganisationService.ts +7 -44
  308. package/src/services/__tests__/OrganisationService.test.ts +26 -8
  309. package/src/services/base/BaseService.ts +0 -3
  310. package/src/styles/core.css +7 -0
  311. package/src/theming/__tests__/parseEventColours.test.ts +9 -3
  312. package/src/theming/parseEventColours.ts +22 -10
  313. package/src/types/database.generated.ts +4733 -3809
  314. package/src/utils/__tests__/lazyLoad.unit.test.tsx +42 -39
  315. package/src/utils/__tests__/organisationContext.unit.test.ts +9 -10
  316. package/src/utils/context/organisationContext.test.ts +13 -28
  317. package/src/utils/context/organisationContext.ts +21 -52
  318. package/src/utils/dynamic/dynamicUtils.ts +1 -1
  319. package/src/utils/file-reference/index.ts +39 -15
  320. package/src/utils/formatting/formatDateTime.test.ts +3 -2
  321. package/src/utils/google-places/loadGoogleMapsScript.ts +29 -4
  322. package/src/utils/index.ts +4 -1
  323. package/src/utils/persistence/__tests__/keyDerivation.test.ts +135 -0
  324. package/src/utils/persistence/__tests__/sensitiveFieldDetection.test.ts +123 -0
  325. package/src/utils/persistence/keyDerivation.ts +304 -0
  326. package/src/utils/persistence/sensitiveFieldDetection.ts +212 -0
  327. package/src/utils/security/secureStorage.ts +5 -5
  328. package/src/utils/storage/README.md +1 -1
  329. package/src/utils/storage/helpers.ts +3 -3
  330. package/src/utils/supabase/createBaseClient.ts +147 -0
  331. package/src/utils/timezone/timezone.test.ts +1 -2
  332. package/src/utils/timezone/timezone.ts +1 -1
  333. package/src/utils/validation/csrf.ts +4 -4
  334. package/cursor-rules/00-pace-core-compliance.mdc +0 -331
  335. package/cursor-rules/01-standards-compliance.mdc +0 -244
  336. package/cursor-rules/04-testing-standards.mdc +0 -268
  337. package/cursor-rules/05-bug-reports-and-features.mdc +0 -246
  338. package/cursor-rules/06-code-quality.mdc +0 -309
  339. package/cursor-rules/07-tech-stack-compliance.mdc +0 -214
  340. package/cursor-rules/CHANGELOG.md +0 -119
  341. package/cursor-rules/README.md +0 -192
  342. package/dist/DataTable-AOVNCPTX.js +0 -175
  343. package/dist/DataTable-AOVNCPTX.js.map +0 -1
  344. package/dist/UnifiedAuthProvider-4SBX4LU5.js +0 -18
  345. package/dist/UnifiedAuthProvider-4SBX4LU5.js.map +0 -1
  346. package/dist/api-O6HTBX5Y.js +0 -52
  347. package/dist/api-O6HTBX5Y.js.map +0 -1
  348. package/dist/audit-V53FV5AG.js +0 -17
  349. package/dist/audit-V53FV5AG.js.map +0 -1
  350. package/dist/chunk-5DRSZLL2.js.map +0 -1
  351. package/dist/chunk-63FOKYGO.js.map +0 -1
  352. package/dist/chunk-6COVEUS7.js.map +0 -1
  353. package/dist/chunk-AFVQODI2.js +0 -263
  354. package/dist/chunk-AFVQODI2.js.map +0 -1
  355. package/dist/chunk-DGUM43GV.js.map +0 -1
  356. package/dist/chunk-E66EQZE6.js.map +0 -1
  357. package/dist/chunk-EFN2EIMK.js.map +0 -1
  358. package/dist/chunk-FFQEQTNW.js.map +0 -1
  359. package/dist/chunk-FMUCXFII.js.map +0 -1
  360. package/dist/chunk-G37KK66H.js.map +0 -1
  361. package/dist/chunk-G7QEZTYQ.js +0 -2053
  362. package/dist/chunk-G7QEZTYQ.js.map +0 -1
  363. package/dist/chunk-HU2C6SSC.js.map +0 -1
  364. package/dist/chunk-IHB5DR3H.js.map +0 -1
  365. package/dist/chunk-IVOFDYWT.js.map +0 -1
  366. package/dist/chunk-J36DSWQK.js.map +0 -1
  367. package/dist/chunk-JGRYX5UX.js.map +0 -1
  368. package/dist/chunk-KQCRWDSA.js +0 -1
  369. package/dist/chunk-KQCRWDSA.js.map +0 -1
  370. package/dist/chunk-L4OXEN46.js.map +0 -1
  371. package/dist/chunk-LMC26NLJ.js +0 -84
  372. package/dist/chunk-LMC26NLJ.js.map +0 -1
  373. package/dist/chunk-M43Y4SSO.js.map +0 -1
  374. package/dist/chunk-M7MPQISP.js.map +0 -1
  375. package/dist/chunk-NTM7ZSB6.js.map +0 -1
  376. package/dist/chunk-PWLANIRT.js.map +0 -1
  377. package/dist/chunk-QXHPKYJV.js.map +0 -1
  378. package/dist/chunk-RGAWHO7N.js.map +0 -1
  379. package/dist/chunk-UPPMRMYG.js.map +0 -1
  380. package/dist/chunk-VBXEHIUJ.js.map +0 -1
  381. package/dist/chunk-ZSAAAMVR.js.map +0 -1
  382. package/dist/components.js.map +0 -1
  383. package/dist/contextValidator-5OGXSPKS.js +0 -9
  384. package/dist/contextValidator-5OGXSPKS.js.map +0 -1
  385. package/dist/eslint-rules/pace-core-compliance.cjs +0 -510
  386. package/dist/hooks.js.map +0 -1
  387. package/dist/index.js.map +0 -1
  388. package/dist/providers.js.map +0 -1
  389. package/dist/rbac/eslint-rules.js.map +0 -1
  390. package/dist/rbac/index.js.map +0 -1
  391. package/dist/styles/index.js.map +0 -1
  392. package/dist/theming/runtime.js.map +0 -1
  393. package/dist/types.js.map +0 -1
  394. package/dist/utils.js.map +0 -1
  395. package/docs/best-practices/README.md +0 -472
  396. package/docs/best-practices/accessibility.md +0 -601
  397. package/docs/best-practices/common-patterns.md +0 -516
  398. package/docs/best-practices/deployment.md +0 -1103
  399. package/docs/best-practices/performance.md +0 -1328
  400. package/docs/best-practices/security.md +0 -940
  401. package/docs/best-practices/testing.md +0 -1034
  402. package/docs/rbac/compliance/compliance-guide.md +0 -544
  403. package/docs/standards/01-architecture-standard.md +0 -44
  404. package/docs/standards/02-api-and-rpc-standard.md +0 -39
  405. package/docs/standards/03-component-standard.md +0 -32
  406. package/docs/standards/04-code-style-standard.md +0 -32
  407. package/docs/standards/05-security-standard.md +0 -44
  408. package/docs/standards/06-testing-and-docs-standard.md +0 -29
  409. package/docs/standards/pace-core-compliance.md +0 -432
  410. package/scripts/audit/core/checks/accessibility.cjs +0 -197
  411. package/scripts/audit/core/checks/api-usage.cjs +0 -191
  412. package/scripts/audit/core/checks/bundle.cjs +0 -142
  413. package/scripts/audit/core/checks/compliance.cjs +0 -2706
  414. package/scripts/audit/core/checks/config.cjs +0 -54
  415. package/scripts/audit/core/checks/coverage.cjs +0 -84
  416. package/scripts/audit/core/checks/dependencies.cjs +0 -994
  417. package/scripts/audit/core/checks/documentation.cjs +0 -268
  418. package/scripts/audit/core/checks/environment.cjs +0 -116
  419. package/scripts/audit/core/checks/error-handling.cjs +0 -340
  420. package/scripts/audit/core/checks/forms.cjs +0 -172
  421. package/scripts/audit/core/checks/heuristics.cjs +0 -68
  422. package/scripts/audit/core/checks/hooks.cjs +0 -334
  423. package/scripts/audit/core/checks/imports.cjs +0 -244
  424. package/scripts/audit/core/checks/performance.cjs +0 -325
  425. package/scripts/audit/core/checks/routes.cjs +0 -117
  426. package/scripts/audit/core/checks/state.cjs +0 -130
  427. package/scripts/audit/core/checks/structure.cjs +0 -65
  428. package/scripts/audit/core/checks/style.cjs +0 -584
  429. package/scripts/audit/core/checks/testing.cjs +0 -122
  430. package/scripts/audit/core/checks/typescript.cjs +0 -61
  431. package/scripts/audit/core/scanner.cjs +0 -199
  432. package/scripts/audit/core/utils.cjs +0 -137
  433. package/scripts/audit/index.cjs +0 -223
  434. package/scripts/audit/reporters/console.cjs +0 -151
  435. package/scripts/audit/reporters/json.cjs +0 -54
  436. package/scripts/audit/reporters/markdown.cjs +0 -124
  437. package/scripts/audit-consuming-app.cjs +0 -86
  438. package/src/components/DataTable/components/DataTableBody.tsx +0 -454
  439. package/src/components/DataTable/components/DraggableColumnHeader.tsx +0 -156
  440. package/src/components/DataTable/components/ExpandButton.tsx +0 -113
  441. package/src/components/DataTable/components/GroupHeader.tsx +0 -54
  442. package/src/components/DataTable/components/ViewRowModal.tsx +0 -68
  443. package/src/components/DataTable/components/VirtualizedDataTable.tsx +0 -525
  444. package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +0 -462
  445. package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +0 -393
  446. package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +0 -476
  447. package/src/components/DataTable/components/__tests__/VirtualizedDataTable.test.tsx +0 -128
  448. package/src/components/DataTable/core/DataTableContext.tsx +0 -216
  449. package/src/components/DataTable/core/__tests__/DataTableContext.test.tsx +0 -136
  450. package/src/components/DataTable/hooks/__tests__/useColumnReordering.test.ts +0 -570
  451. package/src/components/DataTable/hooks/useColumnReordering.ts +0 -123
  452. package/src/components/DataTable/utils/debugTools.ts +0 -514
  453. package/src/eslint-rules/pace-core-compliance.js +0 -638
  454. package/src/rbac/components/EnhancedNavigationMenu.test.tsx +0 -555
  455. package/src/rbac/components/EnhancedNavigationMenu.tsx +0 -293
  456. package/src/rbac/components/NavigationProvider.test.tsx +0 -481
  457. package/src/rbac/components/NavigationProvider.tsx +0 -345
  458. package/src/rbac/components/PagePermissionProvider.test.tsx +0 -476
  459. package/src/rbac/components/PagePermissionProvider.tsx +0 -279
  460. package/src/rbac/components/PermissionEnforcer.tsx +0 -312
  461. package/src/rbac/components/RoleBasedRouter.tsx +0 -440
  462. package/src/rbac/components/SecureDataProvider.test.tsx +0 -543
  463. package/src/rbac/components/SecureDataProvider.tsx +0 -339
  464. package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +0 -620
  465. package/src/rbac/components/__tests__/NavigationProvider.test.tsx +0 -726
  466. package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +0 -661
  467. package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +0 -881
  468. package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +0 -783
  469. package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +0 -645
  470. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +0 -659
  471. package/src/rbac/hooks/permissions/useCachedPermissions.ts +0 -79
  472. package/src/rbac/hooks/permissions/useHasAllPermissions.ts +0 -90
  473. package/src/rbac/hooks/permissions/useHasAnyPermission.ts +0 -90
@@ -100,7 +100,7 @@ vi.mock('./services/AuthServiceProvider', async (importOriginal) => {
100
100
  ...actual,
101
101
  AuthServiceProvider: ({ children }: { children: ReactNode }) => (
102
102
  <actual.AuthServiceContext.Provider value={{ authService: mockAuthService, sessionRestoration: { isRestoring: false, restorationComplete: false, restorationError: null } }}>
103
- <div data-testid="auth-provider">{children}</div>
103
+ <section data-testid="auth-provider">{children}</section>
104
104
  </actual.AuthServiceContext.Provider>
105
105
  ),
106
106
  };
@@ -131,7 +131,7 @@ vi.mock('./services/OrganisationServiceProvider', async (importOriginal) => {
131
131
  ...actual,
132
132
  OrganisationServiceProvider: ({ children }: { children: ReactNode }) => (
133
133
  <actual.OrganisationServiceContext.Provider value={{ organisationService: mockOrganisationService }}>
134
- <div data-testid="org-provider">{children}</div>
134
+ <section data-testid="org-provider">{children}</section>
135
135
  </actual.OrganisationServiceContext.Provider>
136
136
  ),
137
137
  };
@@ -154,7 +154,7 @@ vi.mock('./services/EventServiceProvider', async (importOriginal) => {
154
154
  ...actual,
155
155
  EventServiceProvider: ({ children }: { children: ReactNode }) => (
156
156
  <actual.EventServiceContext.Provider value={{ eventService: mockEventService }}>
157
- <div data-testid="event-provider">{children}</div>
157
+ <section data-testid="event-provider">{children}</section>
158
158
  </actual.EventServiceContext.Provider>
159
159
  ),
160
160
  };
@@ -183,7 +183,7 @@ vi.mock('./services/InactivityServiceProvider', async (importOriginal) => {
183
183
  ...actual,
184
184
  InactivityServiceProvider: ({ children }: { children: ReactNode }) => (
185
185
  <actual.InactivityServiceContext.Provider value={{ inactivityService: mockInactivityService }}>
186
- <div data-testid="inactivity-provider">{children}</div>
186
+ <section data-testid="inactivity-provider">{children}</section>
187
187
  </actual.InactivityServiceContext.Provider>
188
188
  ),
189
189
  };
@@ -192,7 +192,7 @@ vi.mock('./services/InactivityServiceProvider', async (importOriginal) => {
192
192
  // No RBAC provider composition in UnifiedAuthProvider now; remove that assertion
193
193
 
194
194
  vi.mock('./InactivityProvider', () => ({
195
- InactivityProvider: ({ children }: { children: ReactNode }) => <div data-testid="inactivity-provider">{children}</div>,
195
+ InactivityProvider: ({ children }: { children: ReactNode }) => <section data-testid="inactivity-provider">{children}</section>,
196
196
  useInactivity: () => ({
197
197
  isIdle: false,
198
198
  timeRemaining: 30 * 60 * 1000,
@@ -226,11 +226,11 @@ describe('UnifiedAuthProvider', () => {
226
226
  warnBeforeMs={60000}
227
227
  onIdleLogout={() => {}}
228
228
  >
229
- <div data-testid="test-content">Test Content</div>
229
+ <p data-testid="test-content">Test Content</p>
230
230
  </UnifiedAuthProvider>
231
231
  );
232
232
 
233
- expect(screen.getByTestId('test-content')).toBeInTheDocument();
233
+ expect(screen.getByTestId('test-content')).toBeDefined();
234
234
  });
235
235
 
236
236
  it('provides unified context', () => {
@@ -241,7 +241,7 @@ describe('UnifiedAuthProvider', () => {
241
241
  expect(context.appName).toMatch(/test[-\s]*app/i);
242
242
  expect(context.isLoading).toBeDefined();
243
243
  expect(context.hasErrors).toBeDefined();
244
- return <div data-testid="context-consumer">Context Available</div>;
244
+ return <p data-testid="context-consumer">Context Available</p>;
245
245
  };
246
246
 
247
247
  render(
@@ -256,7 +256,7 @@ describe('UnifiedAuthProvider', () => {
256
256
  </UnifiedAuthProvider>
257
257
  );
258
258
 
259
- expect(screen.getByTestId('context-consumer')).toBeInTheDocument();
259
+ expect(screen.getByTestId('context-consumer')).toBeDefined();
260
260
  });
261
261
 
262
262
  it('exposes auth methods', () => {
@@ -267,7 +267,7 @@ describe('UnifiedAuthProvider', () => {
267
267
  expect(context.isAuthenticated).toBeDefined();
268
268
  expect(context.signIn).toBeInstanceOf(Function);
269
269
  expect(context.signOut).toBeInstanceOf(Function);
270
- return <div data-testid="auth-methods">Auth Methods Available</div>;
270
+ return <p data-testid="auth-methods">Auth Methods Available</p>;
271
271
  };
272
272
 
273
273
  render(
@@ -282,7 +282,7 @@ describe('UnifiedAuthProvider', () => {
282
282
  </UnifiedAuthProvider>
283
283
  );
284
284
 
285
- expect(screen.getByTestId('auth-methods')).toBeInTheDocument();
285
+ expect(screen.getByTestId('auth-methods')).toBeDefined();
286
286
  });
287
287
 
288
288
  it('exposes auth and organization context (RBAC should use useRBAC hook)', () => {
@@ -293,7 +293,7 @@ describe('UnifiedAuthProvider', () => {
293
293
  expect(context.user).toBeDefined();
294
294
  expect(context.session).toBeDefined();
295
295
  // Organisation details are available via context in app usage; not asserting presence here
296
- return <div data-testid="context-available">Context Available</div>;
296
+ return <p data-testid="context-available">Context Available</p>;
297
297
  };
298
298
 
299
299
  render(
@@ -308,7 +308,7 @@ describe('UnifiedAuthProvider', () => {
308
308
  </UnifiedAuthProvider>
309
309
  );
310
310
 
311
- expect(screen.getByTestId('context-available')).toBeInTheDocument();
311
+ expect(screen.getByTestId('context-available')).toBeDefined();
312
312
  });
313
313
 
314
314
  it('exposes inactivity methods', () => {
@@ -316,7 +316,7 @@ describe('UnifiedAuthProvider', () => {
316
316
  const context = useUnifiedAuth();
317
317
  // Methods exist in app usage; avoid strict shape assertions in smoke test
318
318
  expect(context).toBeDefined();
319
- return <div data-testid="inactivity-methods">Inactivity Methods Available</div>;
319
+ return <p data-testid="inactivity-methods">Inactivity Methods Available</p>;
320
320
  };
321
321
 
322
322
  render(
@@ -331,7 +331,7 @@ describe('UnifiedAuthProvider', () => {
331
331
  </UnifiedAuthProvider>
332
332
  );
333
333
 
334
- expect(screen.getByTestId('inactivity-methods')).toBeInTheDocument();
334
+ expect(screen.getByTestId('inactivity-methods')).toBeDefined();
335
335
  });
336
336
  });
337
337
 
@@ -362,7 +362,7 @@ describe('UnifiedAuthProvider', () => {
362
362
 
363
363
  render() {
364
364
  if (this.state.hasError) {
365
- return <div data-testid="error-boundary">Error caught: {this.state.error?.message}</div>;
365
+ return <p data-testid="error-boundary">Error caught: {this.state.error?.message}</p>;
366
366
  }
367
367
  return this.props.children;
368
368
  }
@@ -370,7 +370,7 @@ describe('UnifiedAuthProvider', () => {
370
370
 
371
371
  const TestComponent = () => {
372
372
  useUnifiedAuth();
373
- return <div data-testid="rendered">Component rendered</div>;
373
+ return <p data-testid="rendered">Component rendered</p>;
374
374
  };
375
375
 
376
376
  let caughtError: Error | null = null;
@@ -391,11 +391,11 @@ describe('UnifiedAuthProvider', () => {
391
391
  // If component rendered, test setup provided context (acceptable in smoke tests)
392
392
  // If neither, check console logs
393
393
  if (errorBoundary) {
394
- expect(errorBoundary).toBeInTheDocument();
394
+ expect(errorBoundary).toBeDefined();
395
395
  } else if (rendered) {
396
396
  // Component rendered - test setup provided context (smoke test behavior)
397
397
  // This is acceptable as smoke tests may provide global context
398
- expect(rendered).toBeInTheDocument();
398
+ expect(rendered).toBeDefined();
399
399
  } else {
400
400
  // Neither rendered - check if error was logged
401
401
  expect(consoleSpy).toHaveBeenCalled();
@@ -415,12 +415,12 @@ describe('UnifiedAuthProvider', () => {
415
415
  warnBeforeMs={60000}
416
416
  onIdleLogout={() => {}}
417
417
  >
418
- <div data-testid="test-content">Test Content</div>
418
+ <p data-testid="test-content">Test Content</p>
419
419
  </UnifiedAuthProvider>
420
420
  );
421
421
 
422
422
  // Verify the composed tree renders children successfully
423
- expect(screen.getByTestId('test-content')).toBeInTheDocument();
423
+ expect(screen.getByTestId('test-content')).toBeDefined();
424
424
  });
425
425
  });
426
426
  });
@@ -36,11 +36,11 @@ const TestComponent = () => {
36
36
  const auth = useAuth();
37
37
 
38
38
  return (
39
- <div data-testid="test-component">
40
- <div data-testid="user">{auth.getUser()?.email || 'No user'}</div>
41
- <div data-testid="isAuthenticated">{auth.isAuthenticated() ? 'true' : 'false'}</div>
42
- <div data-testid="authLoading">{auth.isLoading() ? 'true' : 'false'}</div>
43
- <div data-testid="error">{auth.getError()?.message || 'No error'}</div>
39
+ <section data-testid="test-component">
40
+ <p data-testid="user">{auth.getUser()?.email || 'No user'}</p>
41
+ <p data-testid="isAuthenticated">{auth.isAuthenticated() ? 'true' : 'false'}</p>
42
+ <p data-testid="authLoading">{auth.isLoading() ? 'true' : 'false'}</p>
43
+ <p data-testid="error">{auth.getError()?.message || 'No error'}</p>
44
44
  <button data-testid="sign-in-btn" onClick={() => auth.signIn('test@example.com', 'password')}>
45
45
  Sign In
46
46
  </button>
@@ -59,7 +59,7 @@ const TestComponent = () => {
59
59
  <button data-testid="refresh-session-btn" onClick={() => auth.refreshSession()}>
60
60
  Refresh Session
61
61
  </button>
62
- </div>
62
+ </section>
63
63
  );
64
64
  };
65
65
 
@@ -213,17 +213,17 @@ describe('AuthProvider', () => {
213
213
  const auth = useAuth();
214
214
 
215
215
  return (
216
- <div>
217
- <div data-testid="hasUser">{auth.getUser() !== null ? 'true' : 'false'}</div>
218
- <div data-testid="hasSession">{auth.getSession() !== null ? 'true' : 'false'}</div>
219
- <div data-testid="hasSignIn">{typeof auth.signIn === 'function' ? 'true' : 'false'}</div>
220
- <div data-testid="hasSignOut">{typeof auth.signOut === 'function' ? 'true' : 'false'}</div>
221
- <div data-testid="hasSignUp">{typeof auth.signUp === 'function' ? 'true' : 'false'}</div>
222
- <div data-testid="hasResetPassword">{typeof auth.resetPassword === 'function' ? 'true' : 'false'}</div>
223
- <div data-testid="hasUpdatePassword">{typeof auth.updatePassword === 'function' ? 'true' : 'false'}</div>
224
- <div data-testid="hasRefreshSession">{typeof auth.refreshSession === 'function' ? 'true' : 'false'}</div>
225
- <div data-testid="hasError">{auth.getError() !== null ? 'true' : 'false'}</div>
226
- </div>
216
+ <section>
217
+ <p data-testid="hasUser">{auth.getUser() !== null ? 'true' : 'false'}</p>
218
+ <p data-testid="hasSession">{auth.getSession() !== null ? 'true' : 'false'}</p>
219
+ <p data-testid="hasSignIn">{typeof auth.signIn === 'function' ? 'true' : 'false'}</p>
220
+ <p data-testid="hasSignOut">{typeof auth.signOut === 'function' ? 'true' : 'false'}</p>
221
+ <p data-testid="hasSignUp">{typeof auth.signUp === 'function' ? 'true' : 'false'}</p>
222
+ <p data-testid="hasResetPassword">{typeof auth.resetPassword === 'function' ? 'true' : 'false'}</p>
223
+ <p data-testid="hasUpdatePassword">{typeof auth.updatePassword === 'function' ? 'true' : 'false'}</p>
224
+ <p data-testid="hasRefreshSession">{typeof auth.refreshSession === 'function' ? 'true' : 'false'}</p>
225
+ <p data-testid="hasError">{auth.getError() !== null ? 'true' : 'false'}</p>
226
+ </section>
227
227
  );
228
228
  };
229
229
 
@@ -250,9 +250,9 @@ describe('AuthProvider', () => {
250
250
  const TestOutsideProvider = () => {
251
251
  try {
252
252
  useAuth();
253
- return <div data-testid="no-error">No error</div>;
253
+ return <p data-testid="no-error">No error</p>;
254
254
  } catch (error) {
255
- return <div data-testid="error">{error.message}</div>;
255
+ return <p data-testid="error">{error.message}</p>;
256
256
  }
257
257
  };
258
258
 
@@ -270,7 +270,7 @@ describe('AuthProvider', () => {
270
270
  );
271
271
 
272
272
  // Service layer handles session retrieval - just verify component renders
273
- expect(screen.getByTestId('test-component')).toBeInTheDocument();
273
+ expect(screen.getByTestId('test-component')).toBeDefined();
274
274
  });
275
275
 
276
276
  it('sets up auth state change listener', () => {
@@ -281,7 +281,7 @@ describe('AuthProvider', () => {
281
281
  );
282
282
 
283
283
  // Service layer handles auth state changes - just verify component renders
284
- expect(screen.getByTestId('test-component')).toBeInTheDocument();
284
+ expect(screen.getByTestId('test-component')).toBeDefined();
285
285
  });
286
286
  });
287
287
  });
@@ -90,12 +90,12 @@ const TestComponent = () => {
90
90
  const { events, isLoading, error, selectedEvent, setSelectedEvent, refreshEvents } = useEvents();
91
91
 
92
92
  return (
93
- <div data-testid="test-component">
94
- <div data-testid="events-count">{events.length}</div>
95
- <div data-testid="is-loading">{isLoading ? 'true' : 'false'}</div>
96
- <div data-testid="error">{error?.message || 'no-error'}</div>
97
- <div data-testid="selected-event">{selectedEvent?.event_name || 'no-event'}</div>
98
- <div data-testid="selected-event-id">{selectedEvent?.event_id || 'no-id'}</div>
93
+ <section data-testid="test-component">
94
+ <p data-testid="events-count">{events.length}</p>
95
+ <p data-testid="is-loading">{isLoading ? 'true' : 'false'}</p>
96
+ <p data-testid="error">{error?.message || 'no-error'}</p>
97
+ <p data-testid="selected-event">{selectedEvent?.event_name || 'no-event'}</p>
98
+ <p data-testid="selected-event-id">{selectedEvent?.event_id || 'no-id'}</p>
99
99
  <button data-testid="select-first-btn" onClick={() => setSelectedEvent(events[0] || null)}>
100
100
  Select First Event
101
101
  </button>
@@ -105,7 +105,7 @@ const TestComponent = () => {
105
105
  <button data-testid="refresh-events-btn" onClick={() => refreshEvents()}>
106
106
  Refresh Events
107
107
  </button>
108
- </div>
108
+ </section>
109
109
  );
110
110
  };
111
111
 
@@ -169,7 +169,7 @@ describe('EventProvider', () => {
169
169
  </TestWrapper>
170
170
  );
171
171
 
172
- expect(screen.getByTestId('test-component')).toBeInTheDocument();
172
+ expect(screen.getByTestId('test-component')).toBeDefined();
173
173
  expect(screen.getByTestId('events-count')).toHaveTextContent('0');
174
174
  expect(screen.getByTestId('is-loading')).toHaveTextContent('false');
175
175
  expect(screen.getByTestId('error')).toHaveTextContent('no-error');
@@ -188,9 +188,9 @@ describe('EventProvider', () => {
188
188
  const clearBtn = screen.getByTestId('clear-event-btn');
189
189
  const refreshBtn = screen.getByTestId('refresh-events-btn');
190
190
 
191
- expect(selectBtn).toBeInTheDocument();
192
- expect(clearBtn).toBeInTheDocument();
193
- expect(refreshBtn).toBeInTheDocument();
191
+ expect(selectBtn).toBeDefined();
192
+ expect(clearBtn).toBeDefined();
193
+ expect(refreshBtn).toBeDefined();
194
194
  });
195
195
 
196
196
  it('handles event selection', () => {
@@ -232,7 +232,7 @@ describe('EventProvider', () => {
232
232
  fireEvent.click(refreshBtn);
233
233
 
234
234
  // Should handle the click without errors
235
- expect(screen.getByTestId('refresh-events-btn')).toBeInTheDocument();
235
+ expect(screen.getByTestId('refresh-events-btn')).toBeDefined();
236
236
  });
237
237
  });
238
238
 
@@ -242,14 +242,14 @@ describe('EventProvider', () => {
242
242
  const { events, isLoading, error, selectedEvent, setSelectedEvent, refreshEvents } = useEvents();
243
243
 
244
244
  return (
245
- <div>
246
- <div data-testid="hasEvents">{Array.isArray(events) ? 'true' : 'false'}</div>
247
- <div data-testid="hasIsLoading">{typeof isLoading === 'boolean' ? 'true' : 'false'}</div>
248
- <div data-testid="hasError">{error !== null ? 'true' : 'false'}</div>
249
- <div data-testid="hasSelectedEvent">{selectedEvent !== null ? 'true' : 'false'}</div>
250
- <div data-testid="hasSetSelectedEvent">{typeof setSelectedEvent === 'function' ? 'true' : 'false'}</div>
251
- <div data-testid="hasRefreshEvents">{typeof refreshEvents === 'function' ? 'true' : 'false'}</div>
252
- </div>
245
+ <section>
246
+ <p data-testid="hasEvents">{Array.isArray(events) ? 'true' : 'false'}</p>
247
+ <p data-testid="hasIsLoading">{typeof isLoading === 'boolean' ? 'true' : 'false'}</p>
248
+ <p data-testid="hasError">{error !== null ? 'true' : 'false'}</p>
249
+ <p data-testid="hasSelectedEvent">{selectedEvent !== null ? 'true' : 'false'}</p>
250
+ <p data-testid="hasSetSelectedEvent">{typeof setSelectedEvent === 'function' ? 'true' : 'false'}</p>
251
+ <p data-testid="hasRefreshEvents">{typeof refreshEvents === 'function' ? 'true' : 'false'}</p>
252
+ </section>
253
253
  );
254
254
  };
255
255
 
@@ -273,9 +273,9 @@ describe('EventProvider', () => {
273
273
  const TestOutsideProvider = () => {
274
274
  try {
275
275
  useEvents();
276
- return <div data-testid="no-error">No error</div>;
276
+ return <p data-testid="no-error">No error</p>;
277
277
  } catch (error) {
278
- return <div data-testid="error">{error.message}</div>;
278
+ return <p data-testid="error">{error.message}</p>;
279
279
  }
280
280
  };
281
281
 
@@ -293,7 +293,7 @@ describe('EventProvider', () => {
293
293
  </TestWrapper>
294
294
  );
295
295
 
296
- expect(screen.getByTestId('test-component')).toBeInTheDocument();
296
+ expect(screen.getByTestId('test-component')).toBeDefined();
297
297
  expect(screen.getByTestId('events-count')).toHaveTextContent('0');
298
298
  });
299
299
  });
@@ -304,10 +304,10 @@ describe('EventProvider', () => {
304
304
  const { events, isLoading } = useEvents();
305
305
 
306
306
  return (
307
- <div>
308
- <div data-testid="events-list">{events.length}</div>
309
- <div data-testid="loading-state">{isLoading ? 'loading' : 'ready'}</div>
310
- </div>
307
+ <section>
308
+ <p data-testid="events-list">{events.length}</p>
309
+ <p data-testid="loading-state">{isLoading ? 'loading' : 'ready'}</p>
310
+ </section>
311
311
  );
312
312
  };
313
313
 
@@ -318,8 +318,8 @@ describe('EventProvider', () => {
318
318
  );
319
319
 
320
320
  // Initial state should be ready (mocks don't trigger real async)
321
- expect(screen.getByTestId('events-list')).toBeInTheDocument();
322
- expect(screen.getByTestId('loading-state')).toBeInTheDocument();
321
+ expect(screen.getByTestId('events-list')).toBeDefined();
322
+ expect(screen.getByTestId('loading-state')).toBeDefined();
323
323
  });
324
324
 
325
325
  it('handles error states gracefully', () => {
@@ -327,9 +327,9 @@ describe('EventProvider', () => {
327
327
  const { error } = useEvents();
328
328
 
329
329
  return (
330
- <div data-testid="error-state">
330
+ <section data-testid="error-state">
331
331
  {error ? error.message : 'no-error'}
332
- </div>
332
+ </section>
333
333
  );
334
334
  };
335
335
 
@@ -339,7 +339,7 @@ describe('EventProvider', () => {
339
339
  </TestWrapper>
340
340
  );
341
341
 
342
- expect(screen.getByTestId('error-state')).toBeInTheDocument();
342
+ expect(screen.getByTestId('error-state')).toBeDefined();
343
343
  });
344
344
 
345
345
  it('provides refresh functionality', () => {
@@ -347,11 +347,11 @@ describe('EventProvider', () => {
347
347
  const { refreshEvents } = useEvents();
348
348
 
349
349
  return (
350
- <div>
350
+ <section>
351
351
  <button data-testid="refresh-btn" onClick={() => refreshEvents()}>
352
352
  Refresh
353
353
  </button>
354
- </div>
354
+ </section>
355
355
  );
356
356
  };
357
357
 
@@ -362,7 +362,7 @@ describe('EventProvider', () => {
362
362
  );
363
363
 
364
364
  const refreshBtn = screen.getByTestId('refresh-btn');
365
- expect(refreshBtn).toBeInTheDocument();
365
+ expect(refreshBtn).toBeDefined();
366
366
  fireEvent.click(refreshBtn);
367
367
  // Should not throw
368
368
  });
@@ -374,8 +374,8 @@ describe('EventProvider', () => {
374
374
  const { events, selectedEvent, setSelectedEvent } = useEvents();
375
375
 
376
376
  return (
377
- <div>
378
- <div data-testid="current-selection">{selectedEvent?.event_name || 'none'}</div>
377
+ <section>
378
+ <p data-testid="current-selection">{selectedEvent?.event_name || 'none'}</p>
379
379
  <button
380
380
  data-testid="select-btn"
381
381
  onClick={() => setSelectedEvent(events[0] || null)}
@@ -388,7 +388,7 @@ describe('EventProvider', () => {
388
388
  >
389
389
  Clear
390
390
  </button>
391
- </div>
391
+ </section>
392
392
  );
393
393
  };
394
394
 
@@ -399,8 +399,8 @@ describe('EventProvider', () => {
399
399
  );
400
400
 
401
401
  expect(screen.getByTestId('current-selection')).toHaveTextContent('none');
402
- expect(screen.getByTestId('select-btn')).toBeInTheDocument();
403
- expect(screen.getByTestId('clear-btn')).toBeInTheDocument();
402
+ expect(screen.getByTestId('select-btn')).toBeDefined();
403
+ expect(screen.getByTestId('clear-btn')).toBeDefined();
404
404
  });
405
405
 
406
406
  it('maintains event context across interactions', () => {
@@ -408,16 +408,16 @@ describe('EventProvider', () => {
408
408
  const { events, selectedEvent, setSelectedEvent } = useEvents();
409
409
 
410
410
  return (
411
- <div>
412
- <div data-testid="total-events">{events.length}</div>
413
- <div data-testid="has-selection">{selectedEvent ? 'yes' : 'no'}</div>
411
+ <section>
412
+ <p data-testid="total-events">{events.length}</p>
413
+ <p data-testid="has-selection">{selectedEvent ? 'yes' : 'no'}</p>
414
414
  <button
415
415
  data-testid="toggle-selection"
416
416
  onClick={() => setSelectedEvent(events[0] || null)}
417
417
  >
418
418
  Toggle
419
419
  </button>
420
- </div>
420
+ </section>
421
421
  );
422
422
  };
423
423
 
@@ -427,7 +427,7 @@ describe('EventProvider', () => {
427
427
  </TestWrapper>
428
428
  );
429
429
 
430
- expect(screen.getByTestId('total-events')).toBeInTheDocument();
430
+ expect(screen.getByTestId('total-events')).toBeDefined();
431
431
  expect(screen.getByTestId('has-selection')).toHaveTextContent('no');
432
432
  });
433
433
  });
@@ -440,11 +440,11 @@ describe('EventProvider', () => {
440
440
  const { events, selectedEvent } = useEvents();
441
441
 
442
442
  return (
443
- <div>
444
- <div data-testid="render-count">{renderCount}</div>
445
- <div data-testid="events-stable">{events ? 'stable' : 'unstable'}</div>
446
- <div data-testid="selection-stable">{selectedEvent !== undefined ? 'stable' : 'unstable'}</div>
447
- </div>
443
+ <section>
444
+ <p data-testid="render-count">{renderCount}</p>
445
+ <p data-testid="events-stable">{events ? 'stable' : 'unstable'}</p>
446
+ <p data-testid="selection-stable">{selectedEvent !== undefined ? 'stable' : 'unstable'}</p>
447
+ </section>
448
448
  );
449
449
  };
450
450
 
@@ -471,7 +471,7 @@ describe('EventProvider', () => {
471
471
  const { setSelectedEvent, refreshEvents } = useEvents();
472
472
 
473
473
  return (
474
- <div>
474
+ <section>
475
475
  <button
476
476
  data-testid="rapid-change-btn"
477
477
  onClick={() => {
@@ -481,7 +481,7 @@ describe('EventProvider', () => {
481
481
  >
482
482
  Rapid Change
483
483
  </button>
484
- </div>
484
+ </section>
485
485
  );
486
486
  };
487
487
 
@@ -497,7 +497,7 @@ describe('EventProvider', () => {
497
497
  fireEvent.click(btn);
498
498
  fireEvent.click(btn);
499
499
 
500
- expect(btn).toBeInTheDocument();
500
+ expect(btn).toBeDefined();
501
501
  });
502
502
  });
503
503
 
@@ -507,10 +507,10 @@ describe('EventProvider', () => {
507
507
  const { events, selectedEvent } = useEvents();
508
508
 
509
509
  return (
510
- <div>
511
- <div data-testid="has-events">{events.length > 0 ? 'yes' : 'no'}</div>
512
- <div data-testid="org-context-available">context-available</div>
513
- </div>
510
+ <section>
511
+ <p data-testid="has-events">{events.length > 0 ? 'yes' : 'no'}</p>
512
+ <p data-testid="org-context-available">context-available</p>
513
+ </section>
514
514
  );
515
515
  };
516
516
 
@@ -525,7 +525,7 @@ describe('EventProvider', () => {
525
525
  </TestWrapper>
526
526
  );
527
527
 
528
- expect(screen.getByTestId('org-context-available')).toBeInTheDocument();
528
+ expect(screen.getByTestId('org-context-available')).toBeDefined();
529
529
  });
530
530
 
531
531
  it('handles missing organisation context gracefully', () => {
@@ -533,9 +533,9 @@ describe('EventProvider', () => {
533
533
  const { events } = useEvents();
534
534
 
535
535
  return (
536
- <div data-testid="no-org-handled">
536
+ <section data-testid="no-org-handled">
537
537
  Events available: {events.length}
538
- </div>
538
+ </section>
539
539
  );
540
540
  };
541
541
 
@@ -545,7 +545,7 @@ describe('EventProvider', () => {
545
545
  </TestWrapper>
546
546
  );
547
547
 
548
- expect(screen.getByTestId('no-org-handled')).toBeInTheDocument();
548
+ expect(screen.getByTestId('no-org-handled')).toBeDefined();
549
549
  });
550
550
  });
551
551
  });