@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
@@ -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;