@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
@@ -58,15 +58,15 @@ const TestComponent = () => {
58
58
  const auth = useUnifiedAuth();
59
59
 
60
60
  return (
61
- <div data-testid="test-component">
62
- <div data-testid="hasUser">{auth.user !== null ? 'true' : 'false'}</div>
63
- <div data-testid="hasSession">{auth.session !== null ? 'true' : 'false'}</div>
64
- <div data-testid="hasSignIn">{typeof auth.signIn === 'function' ? 'true' : 'false'}</div>
65
- <div data-testid="hasSignOut">{typeof auth.signOut === 'function' ? 'true' : 'false'}</div>
66
- <div data-testid="hasOrganisation">{typeof auth.selectedOrganisation === 'object' && auth.selectedOrganisation !== null ? 'true' : 'false'}</div>
67
- <div data-testid="hasEvents">{Array.isArray(auth.events) ? 'true' : 'false'}</div>
68
- <div data-testid="hasAppName">{typeof auth.appName === 'string' ? 'true' : 'false'}</div>
69
- </div>
61
+ <section data-testid="test-component">
62
+ <p data-testid="hasUser">{auth.user !== null ? 'true' : 'false'}</p>
63
+ <p data-testid="hasSession">{auth.session !== null ? 'true' : 'false'}</p>
64
+ <p data-testid="hasSignIn">{typeof auth.signIn === 'function' ? 'true' : 'false'}</p>
65
+ <p data-testid="hasSignOut">{typeof auth.signOut === 'function' ? 'true' : 'false'}</p>
66
+ <p data-testid="hasOrganisation">{typeof auth.selectedOrganisation === 'object' && auth.selectedOrganisation !== null ? 'true' : 'false'}</p>
67
+ <p data-testid="hasEvents">{Array.isArray(auth.events) ? 'true' : 'false'}</p>
68
+ <p data-testid="hasAppName">{typeof auth.appName === 'string' ? 'true' : 'false'}</p>
69
+ </section>
70
70
  );
71
71
  };
72
72
 
@@ -91,7 +91,7 @@ describe('UnifiedAuthProvider', () => {
91
91
  </UnifiedAuthProvider>
92
92
  );
93
93
 
94
- expect(screen.getByTestId('test-component')).toBeInTheDocument();
94
+ expect(screen.getByTestId('test-component')).toBeDefined();
95
95
  });
96
96
 
97
97
  it('renders with custom app name', () => {
@@ -101,7 +101,7 @@ describe('UnifiedAuthProvider', () => {
101
101
  </UnifiedAuthProvider>
102
102
  );
103
103
 
104
- expect(screen.getByTestId('test-component')).toBeInTheDocument();
104
+ expect(screen.getByTestId('test-component')).toBeDefined();
105
105
  });
106
106
 
107
107
  it('renders without supabase client', () => {
@@ -111,7 +111,7 @@ describe('UnifiedAuthProvider', () => {
111
111
  </UnifiedAuthProvider>
112
112
  );
113
113
 
114
- expect(screen.getByTestId('test-component')).toBeInTheDocument();
114
+ expect(screen.getByTestId('test-component')).toBeDefined();
115
115
  });
116
116
  });
117
117
 
@@ -148,9 +148,9 @@ describe('UnifiedAuthProvider', () => {
148
148
  const TestHookComponent = () => {
149
149
  try {
150
150
  const auth = useUnifiedAuth();
151
- return <div data-testid="hook-success">Hook works</div>;
151
+ return <p data-testid="hook-success">Hook works</p>;
152
152
  } catch (error) {
153
- return <div data-testid="hook-error">Hook failed</div>;
153
+ return <p data-testid="hook-error">Hook failed</p>;
154
154
  }
155
155
  };
156
156
 
@@ -160,7 +160,7 @@ describe('UnifiedAuthProvider', () => {
160
160
  </UnifiedAuthProvider>
161
161
  );
162
162
 
163
- expect(screen.getByTestId('hook-success')).toBeInTheDocument();
163
+ expect(screen.getByTestId('hook-success')).toBeDefined();
164
164
  });
165
165
  });
166
166
 
@@ -177,7 +177,7 @@ describe('UnifiedAuthProvider', () => {
177
177
  </UnifiedAuthProvider>
178
178
  );
179
179
 
180
- expect(screen.getByTestId('test-component')).toBeInTheDocument();
180
+ expect(screen.getByTestId('test-component')).toBeDefined();
181
181
  });
182
182
 
183
183
  it('uses default configuration', () => {
@@ -187,7 +187,7 @@ describe('UnifiedAuthProvider', () => {
187
187
  </UnifiedAuthProvider>
188
188
  );
189
189
 
190
- expect(screen.getByTestId('test-component')).toBeInTheDocument();
190
+ expect(screen.getByTestId('test-component')).toBeDefined();
191
191
  });
192
192
  });
193
193
 
@@ -197,12 +197,12 @@ describe('UnifiedAuthProvider', () => {
197
197
  const auth = useUnifiedAuth();
198
198
 
199
199
  return (
200
- <div>
201
- <div data-testid="composition-success">composed</div>
202
- <div data-testid="has-all-contexts">
200
+ <section>
201
+ <p data-testid="composition-success">composed</p>
202
+ <p data-testid="has-all-contexts">
203
203
  {auth.user && auth.session && auth.isAuthenticated ? 'yes' : 'no'}
204
- </div>
205
- </div>
204
+ </p>
205
+ </section>
206
206
  );
207
207
  };
208
208
 
@@ -225,13 +225,13 @@ describe('UnifiedAuthProvider', () => {
225
225
  const auth = useUnifiedAuth();
226
226
 
227
227
  return (
228
- <div>
229
- <div data-testid="user-context">{auth.user ? 'present' : 'missing'}</div>
230
- <div data-testid="session-context">{auth.session ? 'present' : 'missing'}</div>
231
- <div data-testid="organisation-context">{auth.selectedOrganisation ? 'present' : 'missing'}</div>
232
- <div data-testid="event-context">{auth.selectedEvent ? 'missing' : 'present'}</div>
233
- <div data-testid="app-context">{auth.appName ? 'present' : 'missing'}</div>
234
- </div>
228
+ <section>
229
+ <p data-testid="user-context">{auth.user ? 'present' : 'missing'}</p>
230
+ <p data-testid="session-context">{auth.session ? 'present' : 'missing'}</p>
231
+ <p data-testid="organisation-context">{auth.selectedOrganisation ? 'present' : 'missing'}</p>
232
+ <p data-testid="event-context">{auth.selectedEvent ? 'missing' : 'present'}</p>
233
+ <p data-testid="app-context">{auth.appName ? 'present' : 'missing'}</p>
234
+ </section>
235
235
  );
236
236
  };
237
237
 
@@ -258,10 +258,10 @@ describe('UnifiedAuthProvider', () => {
258
258
  const auth = useUnifiedAuth();
259
259
 
260
260
  return (
261
- <div>
262
- <div data-testid="provider-hierarchy">valid</div>
263
- <div data-testid="auth-available">{auth ? 'yes' : 'no'}</div>
264
- </div>
261
+ <section>
262
+ <p data-testid="provider-hierarchy">valid</p>
263
+ <p data-testid="auth-available">{auth ? 'yes' : 'no'}</p>
264
+ </section>
265
265
  );
266
266
  };
267
267
 
@@ -282,14 +282,14 @@ describe('UnifiedAuthProvider', () => {
282
282
  const auth = useUnifiedAuth();
283
283
 
284
284
  return (
285
- <div>
286
- <div data-testid="loading-orchestration">
285
+ <section>
286
+ <p data-testid="loading-orchestration">
287
287
  {auth.isLoading ? 'loading' : 'ready'}
288
- </div>
289
- <div data-testid="context-ready">
288
+ </p>
289
+ <p data-testid="context-ready">
290
290
  {auth.user && auth.session ? 'ready' : 'initializing'}
291
- </div>
292
- </div>
291
+ </p>
292
+ </section>
293
293
  );
294
294
  };
295
295
 
@@ -299,8 +299,8 @@ describe('UnifiedAuthProvider', () => {
299
299
  </UnifiedAuthProvider>
300
300
  );
301
301
 
302
- expect(screen.getByTestId('loading-orchestration')).toBeInTheDocument();
303
- expect(screen.getByTestId('context-ready')).toBeInTheDocument();
302
+ expect(screen.getByTestId('loading-orchestration')).toBeDefined();
303
+ expect(screen.getByTestId('context-ready')).toBeDefined();
304
304
  });
305
305
 
306
306
  it('coordinates loading across multiple context sources', () => {
@@ -308,12 +308,12 @@ describe('UnifiedAuthProvider', () => {
308
308
  const auth = useUnifiedAuth();
309
309
 
310
310
  return (
311
- <div>
312
- <div data-testid="coordination">{auth.isLoading ? 'coordinating' : 'coordinated'}</div>
313
- <div data-testid="all-contexts-loaded">
311
+ <section>
312
+ <p data-testid="coordination">{auth.isLoading ? 'coordinating' : 'coordinated'}</p>
313
+ <p data-testid="all-contexts-loaded">
314
314
  {auth.user && auth.session && !auth.isLoading ? 'loaded' : 'loading'}
315
- </div>
316
- </div>
315
+ </p>
316
+ </section>
317
317
  );
318
318
  };
319
319
 
@@ -323,8 +323,8 @@ describe('UnifiedAuthProvider', () => {
323
323
  </UnifiedAuthProvider>
324
324
  );
325
325
 
326
- expect(screen.getByTestId('coordination')).toBeInTheDocument();
327
- expect(screen.getByTestId('all-contexts-loaded')).toBeInTheDocument();
326
+ expect(screen.getByTestId('coordination')).toBeDefined();
327
+ expect(screen.getByTestId('all-contexts-loaded')).toBeDefined();
328
328
  });
329
329
  });
330
330
 
@@ -334,12 +334,12 @@ describe('UnifiedAuthProvider', () => {
334
334
  const auth = useUnifiedAuth();
335
335
 
336
336
  return (
337
- <div>
338
- <div data-testid="error-state">{auth.error ? 'has-error' : 'no-error'}</div>
339
- <div data-testid="still-functional">
337
+ <section>
338
+ <p data-testid="error-state">{auth.error ? 'has-error' : 'no-error'}</p>
339
+ <p data-testid="still-functional">
340
340
  {auth.user || auth.session ? 'functional' : 'broken'}
341
- </div>
342
- </div>
341
+ </p>
342
+ </section>
343
343
  );
344
344
  };
345
345
 
@@ -349,8 +349,8 @@ describe('UnifiedAuthProvider', () => {
349
349
  </UnifiedAuthProvider>
350
350
  );
351
351
 
352
- expect(screen.getByTestId('error-state')).toBeInTheDocument();
353
- expect(screen.getByTestId('still-functional')).toBeInTheDocument();
352
+ expect(screen.getByTestId('error-state')).toBeDefined();
353
+ expect(screen.getByTestId('still-functional')).toBeDefined();
354
354
  });
355
355
 
356
356
  it('provides error recovery mechanisms', () => {
@@ -358,12 +358,12 @@ describe('UnifiedAuthProvider', () => {
358
358
  const auth = useUnifiedAuth();
359
359
 
360
360
  return (
361
- <div>
362
- <div data-testid="recovery-available">
361
+ <section>
362
+ <p data-testid="recovery-available">
363
363
  {auth.refreshSession ? 'available' : 'unavailable'}
364
- </div>
365
- <div data-testid="error-handled">{auth.error ? 'handled' : 'no-error'}</div>
366
- </div>
364
+ </p>
365
+ <p data-testid="error-handled">{auth.error ? 'handled' : 'no-error'}</p>
366
+ </section>
367
367
  );
368
368
  };
369
369
 
@@ -373,8 +373,8 @@ describe('UnifiedAuthProvider', () => {
373
373
  </UnifiedAuthProvider>
374
374
  );
375
375
 
376
- expect(screen.getByTestId('recovery-available')).toBeInTheDocument();
377
- expect(screen.getByTestId('error-handled')).toBeInTheDocument();
376
+ expect(screen.getByTestId('recovery-available')).toBeDefined();
377
+ expect(screen.getByTestId('error-handled')).toBeDefined();
378
378
  });
379
379
 
380
380
  it('maintains stability during error states', () => {
@@ -382,12 +382,12 @@ describe('UnifiedAuthProvider', () => {
382
382
  const auth = useUnifiedAuth();
383
383
 
384
384
  return (
385
- <div>
386
- <div data-testid="stable-during-error">
385
+ <section>
386
+ <p data-testid="stable-during-error">
387
387
  {auth ? 'stable' : 'unstable'}
388
- </div>
389
- <div data-testid="re-render-safe">safe</div>
390
- </div>
388
+ </p>
389
+ <p data-testid="re-render-safe">safe</p>
390
+ </section>
391
391
  );
392
392
  };
393
393
 
@@ -397,7 +397,7 @@ describe('UnifiedAuthProvider', () => {
397
397
  </UnifiedAuthProvider>
398
398
  );
399
399
 
400
- expect(screen.getByTestId('stable-during-error')).toBeInTheDocument();
400
+ expect(screen.getByTestId('stable-during-error')).toBeDefined();
401
401
 
402
402
  // Re-render during error state
403
403
  rerender(
@@ -416,14 +416,14 @@ describe('UnifiedAuthProvider', () => {
416
416
  const auth = useUnifiedAuth();
417
417
 
418
418
  return (
419
- <div>
420
- <div data-testid="hook-access">
419
+ <section>
420
+ <p data-testid="hook-access">
421
421
  {auth.user && auth.session && auth.isAuthenticated ? 'full' : 'partial'}
422
- </div>
423
- <div data-testid="hook-methods">
422
+ </p>
423
+ <p data-testid="hook-methods">
424
424
  {auth.signIn && auth.signOut && auth.refreshSession ? 'complete' : 'incomplete'}
425
- </div>
426
- </div>
425
+ </p>
426
+ </section>
427
427
  );
428
428
  };
429
429
 
@@ -447,12 +447,12 @@ describe('UnifiedAuthProvider', () => {
447
447
  const auth = useUnifiedAuth();
448
448
 
449
449
  return (
450
- <div>
451
- <div data-testid="user-stable">{auth.user ? 'stable' : 'unstable'}</div>
452
- <div data-testid="methods-stable">
450
+ <section>
451
+ <p data-testid="user-stable">{auth.user ? 'stable' : 'unstable'}</p>
452
+ <p data-testid="methods-stable">
453
453
  {auth.signIn && auth.signOut ? 'stable' : 'unstable'}
454
- </div>
455
- </div>
454
+ </p>
455
+ </section>
456
456
  );
457
457
  };
458
458
 
@@ -486,10 +486,10 @@ describe('UnifiedAuthProvider', () => {
486
486
  const isAuthenticated = auth.isAuthenticated;
487
487
 
488
488
  return (
489
- <div>
490
- <div data-testid="concurrent-safe">safe</div>
491
- <div data-testid="all-reads">{user && session && isAuthenticated ? 'success' : 'fail'}</div>
492
- </div>
489
+ <section>
490
+ <p data-testid="concurrent-safe">safe</p>
491
+ <p data-testid="all-reads">{user && session && isAuthenticated ? 'success' : 'fail'}</p>
492
+ </section>
493
493
  );
494
494
  };
495
495
 
@@ -514,13 +514,13 @@ describe('UnifiedAuthProvider', () => {
514
514
  const auth = useUnifiedAuth();
515
515
 
516
516
  return (
517
- <div>
518
- <div data-testid="custom-app-name">{auth.appName}</div>
519
- <div data-testid="app-name-present">{auth.appName ? 'present' : 'missing'}</div>
520
- <div data-testid="app-name-consistent">
517
+ <section>
518
+ <p data-testid="custom-app-name">{auth.appName}</p>
519
+ <p data-testid="app-name-present">{auth.appName ? 'present' : 'missing'}</p>
520
+ <p data-testid="app-name-consistent">
521
521
  {auth.appName && auth.appName.length > 0 ? 'consistent' : 'inconsistent'}
522
- </div>
523
- </div>
522
+ </p>
523
+ </section>
524
524
  );
525
525
  };
526
526
 
@@ -542,14 +542,14 @@ describe('UnifiedAuthProvider', () => {
542
542
  const auth = useUnifiedAuth();
543
543
 
544
544
  return (
545
- <div>
546
- <div data-testid="rbac-enabled">
545
+ <section>
546
+ <p data-testid="rbac-enabled">
547
547
  {auth.isAuthenticated ? 'enabled' : 'disabled'}
548
- </div>
549
- <div data-testid="session-available">
548
+ </p>
549
+ <p data-testid="session-available">
550
550
  {auth.session ? 'available' : 'unavailable'}
551
- </div>
552
- </div>
551
+ </p>
552
+ </section>
553
553
  );
554
554
  };
555
555
 
@@ -564,7 +564,7 @@ describe('UnifiedAuthProvider', () => {
564
564
  expect(screen.getByTestId('rbac-enabled')).toHaveTextContent('enabled');
565
565
  }, { timeout: 3000 });
566
566
 
567
- expect(screen.getByTestId('session-available')).toBeInTheDocument();
567
+ expect(screen.getByTestId('session-available')).toBeDefined();
568
568
  });
569
569
 
570
570
  it('configures inactivity tracking when enabled', () => {
@@ -572,14 +572,14 @@ describe('UnifiedAuthProvider', () => {
572
572
  const auth = useUnifiedAuth();
573
573
 
574
574
  return (
575
- <div>
576
- <div data-testid="inactivity-config">
575
+ <section>
576
+ <p data-testid="inactivity-config">
577
577
  {auth.isLoading ? 'configuring' : 'configured'}
578
- </div>
579
- <div data-testid="context-complete">
578
+ </p>
579
+ <p data-testid="context-complete">
580
580
  {auth.user && auth.session ? 'complete' : 'incomplete'}
581
- </div>
582
- </div>
581
+ </p>
582
+ </section>
583
583
  );
584
584
  };
585
585
 
@@ -589,7 +589,7 @@ describe('UnifiedAuthProvider', () => {
589
589
  </UnifiedAuthProvider>
590
590
  );
591
591
 
592
- expect(screen.getByTestId('inactivity-config')).toBeInTheDocument();
592
+ expect(screen.getByTestId('inactivity-config')).toBeDefined();
593
593
  expect(screen.getByTestId('context-complete')).toHaveTextContent('complete');
594
594
  });
595
595
  });
@@ -73,16 +73,7 @@ export function EventServiceProvider({
73
73
  useEffect(() => {
74
74
  let isMounted = true;
75
75
 
76
- logger.debug('EventServiceProvider', 'useEffect triggered', {
77
- hasUser: !!user,
78
- userId: user?.id,
79
- hasSession: !!session,
80
- appName,
81
- isInitializing: initializingRef.current
82
- });
83
-
84
76
  if (initializingRef.current) {
85
- logger.debug('EventServiceProvider', 'Skipping - already initializing');
86
77
  return;
87
78
  }
88
79
 
@@ -90,14 +81,6 @@ export function EventServiceProvider({
90
81
  initializingRef.current = true;
91
82
 
92
83
  try {
93
- logger.debug('EventServiceProvider', 'Updating dependencies and initializing', {
94
- hasUser: !!user,
95
- userId: user?.id,
96
- hasSession: !!session,
97
- appName,
98
- hasSelectedOrganisation: !!selectedOrganisation
99
- });
100
-
101
84
  // Update dependencies (now async to handle user change cleanup)
102
85
  await eventService.updateDependencies(supabaseClient, user, session, appName, selectedOrganisation, setSelectedEventId);
103
86
 
@@ -106,19 +89,13 @@ export function EventServiceProvider({
106
89
  // Re-initialize service when dependencies change
107
90
  // Only initialize if we have a user (required for fetching events)
108
91
  if (user && session && supabaseClient && appName) {
109
- logger.debug('EventServiceProvider', 'Initializing event service');
110
92
  await eventService.initialize().catch(error => {
111
93
  if (isMounted) {
112
94
  logger.error('EventServiceProvider', 'Failed to initialize event service:', error);
113
95
  }
114
96
  });
115
97
  } else {
116
- logger.debug('EventServiceProvider', 'Skipping initialization - missing required dependencies', {
117
- hasUser: !!user,
118
- hasSession: !!session,
119
- hasSupabaseClient: !!supabaseClient,
120
- appName
121
- });
98
+ // Skipping initialization - missing required dependencies
122
99
  }
123
100
  } finally {
124
101
  initializingRef.current = false;
@@ -198,23 +198,10 @@ function UnifiedAuthContextProvider({
198
198
 
199
199
  // App config removed - scope is now page-level only (rbac_app_pages.scope_type)
200
200
 
201
- // Try to get event service, but provide fallback if not available
202
- let eventService;
203
- try {
204
- eventService = useEventService();
205
- } catch (error) {
206
- // EventService not available - provide fallback implementation
207
- // Include subscribe method to match BaseService interface
208
- eventService = {
209
- getEvents: () => [],
210
- getSelectedEvent: () => null,
211
- isLoading: () => false,
212
- getError: () => null,
213
- setSelectedEvent: () => {},
214
- refreshEvents: async () => {},
215
- subscribe: () => () => {} // No-op subscribe/unsubscribe for fallback
216
- };
217
- }
201
+ // Call hook unconditionally - if provider is missing, it will throw
202
+ // Errors should be handled by error boundaries at a higher level
203
+ // We cannot conditionally call hooks
204
+ const eventService = useEventService();
218
205
 
219
206
  // Get current auth state - these will trigger re-renders when services change
220
207
  const currentUser = authService.getUser();
@@ -232,14 +219,6 @@ function UnifiedAuthContextProvider({
232
219
  // This makes appId available early for navigation menu filtering
233
220
  const [appId, setAppId] = useState<string | undefined>(undefined);
234
221
 
235
- useEffect(() => {
236
- logger.debug('UnifiedAuthContextProvider', `Rendering [AuthService ID:${authService.getInstanceId?.() || 'unknown'}]`, {
237
- hasUser: !!currentUser,
238
- userId: currentUser?.id,
239
- hasSession: !!currentSession,
240
- isAuth
241
- });
242
- }, [currentUser?.id, currentSession?.access_token, isAuth, authService]);
243
222
 
244
223
  const isResolvingAppIdRef = useRef(false);
245
224
  const resolvedAppIdRef = useRef<string | undefined>(undefined);
@@ -668,12 +647,7 @@ function EventServiceProviderWrapper({
668
647
  }, []);
669
648
 
670
649
  useEffect(() => {
671
- logger.debug('EventServiceProviderWrapper', 'Rendering with props', {
672
- hasUser: !!user,
673
- userId: user?.id,
674
- hasSession: !!session,
675
- selectedOrganisationId: selectedOrganisation?.id
676
- });
650
+ // Render tracking removed for performance
677
651
  }, [user?.id, session?.access_token, selectedOrganisation?.id]);
678
652
 
679
653
  return (
@@ -720,12 +694,6 @@ function ServiceAwareProviders({
720
694
  const newUser = authService.getUser();
721
695
  const newSession = authService.getSession();
722
696
 
723
- logger.debug('ServiceAwareProviders', 'Auth service notified, updating state', {
724
- hasUser: !!newUser,
725
- userId: newUser?.id,
726
- hasSession: !!newSession
727
- });
728
-
729
697
  setUserState(newUser);
730
698
  setSessionState(newSession);
731
699
  });
@@ -737,15 +705,6 @@ function ServiceAwareProviders({
737
705
  const user = userState;
738
706
  const session = sessionState;
739
707
 
740
- // Log when user/session changes for debugging
741
- useEffect(() => {
742
- logger.debug('ServiceAwareProviders', `User/session state [AuthService ID:${authService.getInstanceId?.() || 'unknown'}]`, {
743
- hasUser: !!user,
744
- userId: user?.id,
745
- hasSession: !!session,
746
- sessionToken: session?.access_token ? 'present' : 'missing'
747
- });
748
- }, [user?.id, session?.access_token, authService]);
749
708
 
750
709
  return (
751
710
  <OrganisationServiceProvider
@@ -824,8 +783,6 @@ export function UnifiedAuthProvider({
824
783
  note: 'Ensure you create the Supabase client once and reuse it. Creating multiple clients can cause performance issues and the "Multiple GoTrueClient instances" warning.'
825
784
  });
826
785
  clientRef.current = supabaseClient;
827
- } else {
828
- logger.debug('UnifiedAuthProvider', 'Supabase client reference is stable');
829
786
  }
830
787
  }, [supabaseClient]);
831
788
 
@@ -67,12 +67,12 @@ function TestComponent() {
67
67
  }, [authService]);
68
68
 
69
69
  return (
70
- <div>
71
- <div data-testid="user-id">{authService.getUser()?.id || 'no-user'}</div>
72
- <div data-testid="is-authenticated">{authService.isAuthenticated().toString()}</div>
73
- <div data-testid="is-loading">{authService.isLoading().toString()}</div>
74
- <div data-testid="error">{authService.getError()?.message || 'no-error'}</div>
75
- </div>
70
+ <section>
71
+ <p data-testid="user-id">{authService.getUser()?.id || 'no-user'}</p>
72
+ <p data-testid="is-authenticated">{authService.isAuthenticated().toString()}</p>
73
+ <p data-testid="is-loading">{authService.isLoading().toString()}</p>
74
+ <p data-testid="error">{authService.getError()?.message || 'no-error'}</p>
75
+ </section>
76
76
  );
77
77
  }
78
78
 
@@ -198,7 +198,7 @@ describe('AuthServiceProvider Integration', () => {
198
198
  // The subscription is set up in useEffect, so we need to wait for that
199
199
  await waitFor(() => {
200
200
  // Check if subscription is set up by verifying the component has rendered
201
- expect(screen.getByTestId('user-id')).toBeInTheDocument();
201
+ expect(screen.getByTestId('user-id')).toBeDefined();
202
202
  }, { interval: 10, timeout: 1000 });
203
203
 
204
204
  // Wait a bit more to ensure subscription is fully set up
@@ -14,6 +14,9 @@ import { UnifiedAuthProvider, useUnifiedAuth } from '../UnifiedAuthProvider';
14
14
  import { type SupabaseClient, type User, type Session } from '@supabase/supabase-js';
15
15
  import { Logger, LogLevel } from '../../../utils/core/logger';
16
16
 
17
+ // Unmock UnifiedAuthProvider to test the real implementation
18
+ vi.unmock('../../../providers/services/UnifiedAuthProvider');
19
+
17
20
  // Mock Supabase client
18
21
  const createMockSupabaseClient = (): SupabaseClient => ({
19
22
  auth: {
@@ -58,16 +61,16 @@ function TestComponent() {
58
61
  const auth = useUnifiedAuth();
59
62
 
60
63
  return (
61
- <div>
62
- <div data-testid="user-id">{auth.user?.id || 'no-user'}</div>
63
- <div data-testid="is-authenticated">{auth.isAuthenticated.toString()}</div>
64
- <div data-testid="is-loading">{auth.isLoading.toString()}</div>
65
- <div data-testid="app-name">{auth.appName}</div>
66
- <div data-testid="permissions-count">{0}</div>
67
- <div data-testid="roles-count">{0}</div>
68
- <div data-testid="organisations-count">{auth.organisations.length}</div>
69
- <div data-testid="events-count">{auth.events.length}</div>
70
- </div>
64
+ <section>
65
+ <p data-testid="user-id">{auth.user?.id || 'no-user'}</p>
66
+ <p data-testid="is-authenticated">{auth.isAuthenticated.toString()}</p>
67
+ <p data-testid="is-loading">{auth.isLoading.toString()}</p>
68
+ <p data-testid="app-name">{auth.appName}</p>
69
+ <p data-testid="permissions-count">{0}</p>
70
+ <p data-testid="roles-count">{0}</p>
71
+ <p data-testid="organisations-count">{auth.organisations.length}</p>
72
+ <p data-testid="events-count">{auth.events.length}</p>
73
+ </section>
71
74
  );
72
75
  }
73
76