@jmruthers/pace-core 0.6.4 → 0.6.6

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 (387) hide show
  1. package/CHANGELOG.md +104 -0
  2. package/README.md +5 -403
  3. package/core-usage-manifest.json +93 -0
  4. package/cursor-rules/00-pace-core-compliance.mdc +128 -26
  5. package/cursor-rules/01-standards-compliance.mdc +49 -8
  6. package/cursor-rules/02-project-structure.mdc +6 -0
  7. package/cursor-rules/03-solid-principles.mdc +2 -0
  8. package/cursor-rules/04-testing-standards.mdc +2 -0
  9. package/cursor-rules/05-bug-reports-and-features.mdc +2 -0
  10. package/cursor-rules/06-code-quality.mdc +2 -0
  11. package/cursor-rules/07-tech-stack-compliance.mdc +2 -0
  12. package/cursor-rules/08-markup-quality.mdc +52 -27
  13. package/cursor-rules/09-rbac-compliance.mdc +462 -0
  14. package/cursor-rules/10-error-handling-patterns.mdc +179 -0
  15. package/cursor-rules/11-performance-optimization.mdc +169 -0
  16. package/cursor-rules/12-ci-cd-integration.mdc +150 -0
  17. package/dist/{AuthService-Cb34EQs3.d.ts → AuthService-DmfO5rGS.d.ts} +10 -0
  18. package/dist/{DataTable-BMRU8a1j.d.ts → DataTable-2N_tqbfq.d.ts} +1 -1
  19. package/dist/DataTable-LRJL4IRV.js +15 -0
  20. package/dist/{PublicPageProvider-DEMpysFR.d.ts → PublicPageProvider-BBH6Vqg7.d.ts} +72 -139
  21. package/dist/UnifiedAuthProvider-ZT6TIGM7.js +7 -0
  22. package/dist/api-Y4MQWOFW.js +4 -0
  23. package/dist/audit-MYQXYZFU.js +3 -0
  24. package/dist/{chunk-J36DSWQK.js → chunk-2HGJFNAH.js} +8 -28
  25. package/dist/{chunk-OEWDTMG7.js → chunk-3O3WHILE.js} +38 -121
  26. package/dist/{chunk-M43Y4SSO.js → chunk-3QC3KRHK.js} +1 -14
  27. package/dist/{chunk-DGUM43GV.js → chunk-3RG5ZIWI.js} +1 -4
  28. package/dist/{chunk-QXHPKYJV.js → chunk-4SXLQIZO.js} +1 -26
  29. package/dist/chunk-4T7OBVTU.js +62 -0
  30. package/dist/{chunk-E66EQZE6.js → chunk-6GLLNA6U.js} +3 -9
  31. package/dist/{chunk-ZSAAAMVR.js → chunk-6QYDGKQY.js} +1 -4
  32. package/dist/{chunk-NN6WWZ5U.js → chunk-7TYHROIV.js} +579 -563
  33. package/dist/{chunk-M7MPQISP.js → chunk-A55DK444.js} +9 -16
  34. package/dist/{chunk-63FOKYGO.js → chunk-AHU7G2R5.js} +2 -11
  35. package/dist/{chunk-L4OXEN46.js → chunk-BVP2BCJF.js} +2 -16
  36. package/dist/chunk-C7NSAPTL.js +1 -0
  37. package/dist/{chunk-YKRAFF5K.js → chunk-FENMYN2U.js} +73 -149
  38. package/dist/{chunk-AVMLPIM7.js → chunk-FTCRZOG2.js} +284 -432
  39. package/dist/{chunk-G37KK66H.js → chunk-FYHN4DD5.js} +60 -19
  40. package/dist/{chunk-VBXEHIUJ.js → chunk-HF6O3O37.js} +6 -88
  41. package/dist/{chunk-I6DAQMWX.js → chunk-LAZMKTTF.js} +930 -891
  42. package/dist/{chunk-5EC5MEWX.js → chunk-MAGBIDNS.js} +77 -222
  43. package/dist/chunk-MBADTM7L.js +64 -0
  44. package/dist/chunk-OHIK3MIO.js +994 -0
  45. package/dist/{chunk-6SOIHG6Z.js → chunk-S7DKJPLT.js} +115 -44
  46. package/dist/{chunk-FMUCXFII.js → chunk-SD6WQY43.js} +1 -5
  47. package/dist/{chunk-PWLANIRT.js → chunk-TTRFSOKR.js} +1 -7
  48. package/dist/{chunk-5DRSZLL2.js → chunk-UH3NTO3F.js} +1 -6
  49. package/dist/{chunk-FFQEQTNW.js → chunk-UIYSCEV7.js} +134 -45
  50. package/dist/{chunk-3LPHPB62.js → chunk-ZFYPMX46.js} +271 -87
  51. package/dist/{chunk-7JPAB3T5.js → chunk-ZS5VO5JB.js} +1989 -1283
  52. package/dist/components.d.ts +6 -6
  53. package/dist/components.js +57 -267
  54. package/dist/{database.generated-CzIvgcPu.d.ts → database.generated-CcnC_DRc.d.ts} +4795 -3691
  55. package/dist/eslint-rules/index.cjs +22 -0
  56. package/dist/eslint-rules/rules/compliance.cjs +348 -0
  57. package/dist/eslint-rules/rules/components.cjs +113 -0
  58. package/dist/eslint-rules/rules/imports.cjs +102 -0
  59. package/dist/eslint-rules/rules/rbac.cjs +790 -0
  60. package/dist/eslint-rules/utils/helpers.cjs +42 -0
  61. package/dist/eslint-rules/utils/manifest-loader.cjs +75 -0
  62. package/dist/hooks.d.ts +5 -5
  63. package/dist/hooks.js +62 -270
  64. package/dist/icons/index.d.ts +1 -0
  65. package/dist/icons/index.js +1 -0
  66. package/dist/index.d.ts +36 -26
  67. package/dist/index.js +87 -690
  68. package/dist/providers.d.ts +2 -2
  69. package/dist/providers.js +8 -35
  70. package/dist/rbac/eslint-rules.d.ts +46 -44
  71. package/dist/rbac/eslint-rules.js +7 -4
  72. package/dist/rbac/index.d.ts +124 -594
  73. package/dist/rbac/index.js +14 -207
  74. package/dist/styles/index.js +2 -12
  75. package/dist/theming/runtime.js +3 -19
  76. package/dist/{timezone-CHhWg6b4.d.ts → timezone-BZe_eUxx.d.ts} +175 -1
  77. package/dist/{types-CkbwOr4Y.d.ts → types-B-K_5VnO.d.ts} +4 -0
  78. package/dist/types-t9H8qKRw.d.ts +55 -0
  79. package/dist/types.d.ts +1 -1
  80. package/dist/types.js +7 -94
  81. package/dist/{usePublicRouteParams-i3qtoBgg.d.ts → usePublicRouteParams-COZ28Mvq.d.ts} +9 -9
  82. package/dist/utils.d.ts +24 -117
  83. package/dist/utils.js +54 -392
  84. package/docs/README.md +16 -6
  85. package/docs/api/README.md +4 -402
  86. package/docs/api/modules.md +454 -930
  87. package/docs/api-reference/components.md +3 -1
  88. package/docs/api-reference/deprecated.md +31 -6
  89. package/docs/api-reference/rpc-functions.md +78 -3
  90. package/docs/best-practices/accessibility.md +6 -3
  91. package/docs/getting-started/cursor-rules.md +3 -23
  92. package/docs/getting-started/dependencies.md +650 -0
  93. package/docs/getting-started/installation-guide.md +20 -7
  94. package/docs/getting-started/quick-start.md +23 -12
  95. package/docs/implementation-guides/permission-enforcement.md +4 -0
  96. package/docs/rbac/MIGRATION_GUIDE.md +819 -0
  97. package/docs/rbac/RBAC_CONTRACT.md +724 -0
  98. package/docs/rbac/README.md +12 -3
  99. package/docs/rbac/edge-functions-guide.md +376 -0
  100. package/docs/rbac/secure-client-protection.md +0 -34
  101. package/docs/standards/00-pace-core-compliance.md +967 -0
  102. package/docs/standards/01-standards-compliance.md +188 -0
  103. package/docs/standards/02-project-structure.md +985 -0
  104. package/docs/standards/03-solid-principles.md +39 -0
  105. package/docs/standards/04-testing-standards.md +36 -0
  106. package/docs/standards/05-bug-reports-and-features.md +27 -0
  107. package/docs/standards/{04-code-style-standard.md → 06-code-quality.md} +2 -0
  108. package/docs/standards/07-tech-stack-compliance.md +30 -0
  109. package/docs/standards/08-markup-quality.md +345 -0
  110. package/docs/standards/{07-rbac-and-rls-standard.md → 09-rbac-compliance.md} +149 -54
  111. package/docs/standards/10-error-handling-patterns.md +401 -0
  112. package/docs/standards/11-performance-optimization.md +348 -0
  113. package/docs/standards/12-ci-cd-integration.md +370 -0
  114. package/docs/standards/ALIGNMENT_REVIEW_SUMMARY.md +192 -0
  115. package/docs/standards/README.md +62 -33
  116. package/docs/troubleshooting/organisation-context-setup.md +42 -19
  117. package/eslint-config-pace-core.cjs +20 -4
  118. package/package.json +31 -21
  119. package/scripts/audit/audit-compliance.cjs +1295 -0
  120. package/scripts/audit/audit-components.cjs +260 -0
  121. package/scripts/audit/audit-dependencies.cjs +395 -0
  122. package/scripts/audit/audit-rbac.cjs +954 -0
  123. package/scripts/audit/audit-standards.cjs +1268 -0
  124. package/scripts/audit/index.cjs +1898 -194
  125. package/scripts/install-cursor-rules.cjs +259 -8
  126. package/scripts/validate-master.js +1 -1
  127. package/src/__tests__/fixtures/supabase.ts +1 -1
  128. package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +1 -1
  129. package/src/__tests__/helpers/__tests__/optimized-test-setup.test.ts +1 -1
  130. package/src/__tests__/helpers/__tests__/supabaseMock.test.ts +1 -1
  131. package/src/__tests__/helpers/__tests__/test-utils.test.tsx +3 -3
  132. package/src/__tests__/helpers/component-test-utils.tsx +1 -1
  133. package/src/__tests__/helpers/supabaseMock.ts +2 -2
  134. package/src/__tests__/public-recipe-view.test.ts +38 -9
  135. package/src/components/Button/Button.tsx +5 -1
  136. package/src/components/ContextSelector/ContextSelector.tsx +42 -39
  137. package/src/components/DataTable/__tests__/keyboard.test.tsx +15 -2
  138. package/src/components/DataTable/components/DataTableBody.tsx +55 -31
  139. package/src/components/DataTable/components/DataTableCore.tsx +186 -13
  140. package/src/components/DataTable/components/DataTableLayout.tsx +30 -5
  141. package/src/components/DataTable/components/EditFields.tsx +23 -3
  142. package/src/components/DataTable/components/EditableRow.tsx +7 -2
  143. package/src/components/DataTable/components/ImportModal.tsx +4 -6
  144. package/src/components/DataTable/components/RowComponent.tsx +12 -0
  145. package/src/components/DataTable/components/ViewRowModal.tsx +4 -4
  146. package/src/components/DataTable/components/__tests__/ImportModal.test.tsx +455 -96
  147. package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +122 -58
  148. package/src/components/DataTable/components/hooks/usePermissionTracking.ts +0 -4
  149. package/src/components/DataTable/core/DataTableContext.tsx +1 -1
  150. package/src/components/DataTable/hooks/__tests__/useDataTableState.test.ts +51 -47
  151. package/src/components/DataTable/hooks/useDataTablePermissions.ts +24 -21
  152. package/src/components/DataTable/hooks/useDataTableState.ts +125 -9
  153. package/src/components/DataTable/hooks/useTableColumns.ts +40 -2
  154. package/src/components/DataTable/hooks/useTableHandlers.ts +11 -0
  155. package/src/components/DataTable/types.ts +5 -0
  156. package/src/components/DateTimeField/DateTimeField.tsx +20 -20
  157. package/src/components/DateTimeField/README.md +5 -2
  158. package/src/components/Dialog/Dialog.test.tsx +361 -318
  159. package/src/components/Dialog/Dialog.tsx +1154 -323
  160. package/src/components/Dialog/index.ts +3 -3
  161. package/src/components/FileDisplay/FileDisplay.test.tsx +45 -2
  162. package/src/components/FileDisplay/FileDisplay.tsx +28 -22
  163. package/src/components/Form/Form.test.tsx +9 -10
  164. package/src/components/Form/Form.tsx +369 -9
  165. package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +28 -28
  166. package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +40 -54
  167. package/src/components/LoginForm/LoginForm.tsx +2 -2
  168. package/src/components/NavigationMenu/NavigationMenu.test.tsx +14 -13
  169. package/src/components/NavigationMenu/NavigationMenu.tsx +2 -2
  170. package/src/components/NavigationMenu/useNavigationFiltering.ts +11 -21
  171. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +6 -4
  172. package/src/components/PaceAppLayout/PaceAppLayout.tsx +30 -41
  173. package/src/components/PaceAppLayout/README.md +10 -9
  174. package/src/components/PaceAppLayout/test-setup.tsx +40 -31
  175. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +108 -61
  176. package/src/components/PaceLoginPage/PaceLoginPage.tsx +27 -3
  177. package/src/components/PasswordChange/PasswordChangeForm.test.tsx +61 -0
  178. package/src/components/PasswordChange/PasswordChangeForm.tsx +20 -13
  179. package/src/components/PublicLayout/PublicLayout.test.tsx +7 -3
  180. package/src/components/PublicLayout/PublicPageLayout.tsx +5 -8
  181. package/src/components/Select/Select.tsx +23 -21
  182. package/src/components/Select/types.ts +1 -1
  183. package/src/components/UserMenu/UserMenu.test.tsx +38 -6
  184. package/src/components/UserMenu/UserMenu.tsx +39 -34
  185. package/src/components/index.ts +3 -4
  186. package/src/eslint-rules/index.cjs +22 -0
  187. package/src/eslint-rules/rules/compliance.cjs +348 -0
  188. package/src/eslint-rules/rules/components.cjs +113 -0
  189. package/src/eslint-rules/rules/imports.cjs +102 -0
  190. package/src/eslint-rules/rules/rbac.cjs +790 -0
  191. package/src/eslint-rules/utils/helpers.cjs +42 -0
  192. package/src/eslint-rules/utils/manifest-loader.cjs +75 -0
  193. package/src/hooks/__tests__/hooks.integration.test.tsx +6 -8
  194. package/src/hooks/__tests__/useAppConfig.unit.test.ts +129 -67
  195. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +149 -67
  196. package/src/hooks/__tests__/usePublicEvent.test.ts +149 -79
  197. package/src/hooks/__tests__/usePublicEvent.unit.test.ts +158 -109
  198. package/src/hooks/__tests__/useSessionDraft.test.ts +163 -0
  199. package/src/hooks/__tests__/useSessionRestoration.unit.test.tsx +10 -5
  200. package/src/hooks/public/usePublicEvent.ts +62 -190
  201. package/src/hooks/public/usePublicEventLogo.test.ts +70 -17
  202. package/src/hooks/public/usePublicEventLogo.ts +19 -9
  203. package/src/hooks/useAppConfig.ts +26 -24
  204. package/src/hooks/useEventTheme.test.ts +211 -233
  205. package/src/hooks/useEventTheme.ts +19 -28
  206. package/src/hooks/useEvents.ts +11 -7
  207. package/src/hooks/useKeyboardShortcuts.ts +1 -1
  208. package/src/hooks/useOrganisationPermissions.ts +9 -11
  209. package/src/hooks/useOrganisations.ts +13 -7
  210. package/src/hooks/useQueryCache.ts +0 -1
  211. package/src/hooks/useSessionDraft.ts +380 -0
  212. package/src/hooks/useSessionRestoration.ts +3 -1
  213. package/src/icons/index.ts +27 -0
  214. package/src/index.ts +16 -1
  215. package/src/providers/OrganisationProvider.tsx +23 -14
  216. package/src/providers/services/EventServiceProvider.tsx +1 -24
  217. package/src/providers/services/UnifiedAuthProvider.tsx +5 -48
  218. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +3 -0
  219. package/src/rbac/README.md +20 -20
  220. package/src/rbac/__tests__/adapters.comprehensive.test.tsx +7 -457
  221. package/src/rbac/__tests__/auth-rbac.e2e.test.tsx +33 -7
  222. package/src/rbac/adapters.tsx +7 -295
  223. package/src/rbac/api.test.ts +44 -56
  224. package/src/rbac/api.ts +10 -17
  225. package/src/rbac/cache-invalidation.ts +0 -1
  226. package/src/rbac/compliance/index.ts +10 -0
  227. package/src/rbac/compliance/pattern-detector.ts +553 -0
  228. package/src/rbac/compliance/runtime-compliance.ts +22 -0
  229. package/src/rbac/components/AccessDenied.tsx +150 -0
  230. package/src/rbac/components/NavigationGuard.tsx +12 -20
  231. package/src/rbac/components/PagePermissionGuard.tsx +4 -24
  232. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +21 -8
  233. package/src/rbac/components/index.ts +3 -41
  234. package/src/rbac/eslint-rules.js +1 -1
  235. package/src/rbac/hooks/index.ts +0 -3
  236. package/src/rbac/hooks/permissions/index.ts +0 -3
  237. package/src/rbac/hooks/permissions/useAccessLevel.ts +4 -8
  238. package/src/rbac/hooks/usePermissions.ts +0 -3
  239. package/src/rbac/hooks/useRBAC.test.ts +21 -3
  240. package/src/rbac/hooks/useRBAC.ts +4 -3
  241. package/src/rbac/hooks/useResolvedScope.test.ts +57 -47
  242. package/src/rbac/hooks/useResolvedScope.ts +58 -140
  243. package/src/rbac/hooks/useResourcePermissions.test.ts +241 -60
  244. package/src/rbac/hooks/useResourcePermissions.ts +182 -63
  245. package/src/rbac/hooks/useRoleManagement.test.ts +65 -22
  246. package/src/rbac/hooks/useRoleManagement.ts +147 -19
  247. package/src/rbac/hooks/useSecureSupabase.ts +4 -8
  248. package/src/rbac/index.ts +7 -9
  249. package/src/rbac/permissions.ts +17 -17
  250. package/src/rbac/utils/contextValidator.ts +45 -7
  251. package/src/services/AuthService.ts +132 -23
  252. package/src/services/EventService.ts +4 -97
  253. package/src/services/InactivityService.ts +155 -58
  254. package/src/services/OrganisationService.ts +7 -44
  255. package/src/services/__tests__/OrganisationService.test.ts +26 -8
  256. package/src/services/base/BaseService.ts +0 -3
  257. package/src/styles/core.css +4 -0
  258. package/src/types/database.generated.ts +4733 -3809
  259. package/src/utils/__tests__/organisationContext.unit.test.ts +9 -10
  260. package/src/utils/context/organisationContext.test.ts +13 -28
  261. package/src/utils/context/organisationContext.ts +21 -52
  262. package/src/utils/dynamic/dynamicUtils.ts +1 -1
  263. package/src/utils/file-reference/index.ts +39 -15
  264. package/src/utils/formatting/formatDateTime.test.ts +3 -2
  265. package/src/utils/formatting/formatTime.test.ts +3 -2
  266. package/src/utils/google-places/loadGoogleMapsScript.ts +29 -4
  267. package/src/utils/index.ts +4 -1
  268. package/src/utils/persistence/__tests__/keyDerivation.test.ts +135 -0
  269. package/src/utils/persistence/__tests__/sensitiveFieldDetection.test.ts +123 -0
  270. package/src/utils/persistence/keyDerivation.ts +304 -0
  271. package/src/utils/persistence/sensitiveFieldDetection.ts +212 -0
  272. package/src/utils/security/secureStorage.ts +5 -5
  273. package/src/utils/storage/helpers.ts +3 -3
  274. package/src/utils/supabase/createBaseClient.ts +147 -0
  275. package/src/utils/timezone/timezone.test.ts +1 -2
  276. package/src/utils/timezone/timezone.ts +1 -1
  277. package/src/utils/validation/csrf.ts +4 -4
  278. package/cursor-rules/CHANGELOG.md +0 -119
  279. package/cursor-rules/README.md +0 -192
  280. package/dist/DataTable-E7YQZD7D.js +0 -175
  281. package/dist/DataTable-E7YQZD7D.js.map +0 -1
  282. package/dist/UnifiedAuthProvider-QPXO24B4.js +0 -18
  283. package/dist/UnifiedAuthProvider-QPXO24B4.js.map +0 -1
  284. package/dist/api-6LVZTHDS.js +0 -52
  285. package/dist/api-6LVZTHDS.js.map +0 -1
  286. package/dist/audit-V53FV5AG.js +0 -17
  287. package/dist/audit-V53FV5AG.js.map +0 -1
  288. package/dist/chunk-36LVWXB2.js +0 -227
  289. package/dist/chunk-36LVWXB2.js.map +0 -1
  290. package/dist/chunk-3LPHPB62.js.map +0 -1
  291. package/dist/chunk-5DRSZLL2.js.map +0 -1
  292. package/dist/chunk-5EC5MEWX.js.map +0 -1
  293. package/dist/chunk-63FOKYGO.js.map +0 -1
  294. package/dist/chunk-6SOIHG6Z.js.map +0 -1
  295. package/dist/chunk-7JPAB3T5.js.map +0 -1
  296. package/dist/chunk-ATKZM7RX.js +0 -2053
  297. package/dist/chunk-ATKZM7RX.js.map +0 -1
  298. package/dist/chunk-AVMLPIM7.js.map +0 -1
  299. package/dist/chunk-DGUM43GV.js.map +0 -1
  300. package/dist/chunk-E66EQZE6.js.map +0 -1
  301. package/dist/chunk-FFQEQTNW.js.map +0 -1
  302. package/dist/chunk-FMUCXFII.js.map +0 -1
  303. package/dist/chunk-G37KK66H.js.map +0 -1
  304. package/dist/chunk-I6DAQMWX.js.map +0 -1
  305. package/dist/chunk-J36DSWQK.js.map +0 -1
  306. package/dist/chunk-KQCRWDSA.js +0 -1
  307. package/dist/chunk-KQCRWDSA.js.map +0 -1
  308. package/dist/chunk-L4OXEN46.js.map +0 -1
  309. package/dist/chunk-LMC26NLJ.js +0 -84
  310. package/dist/chunk-LMC26NLJ.js.map +0 -1
  311. package/dist/chunk-M43Y4SSO.js.map +0 -1
  312. package/dist/chunk-M7MPQISP.js.map +0 -1
  313. package/dist/chunk-NN6WWZ5U.js.map +0 -1
  314. package/dist/chunk-OEWDTMG7.js.map +0 -1
  315. package/dist/chunk-PWLANIRT.js.map +0 -1
  316. package/dist/chunk-QXHPKYJV.js.map +0 -1
  317. package/dist/chunk-VBXEHIUJ.js.map +0 -1
  318. package/dist/chunk-YKRAFF5K.js.map +0 -1
  319. package/dist/chunk-ZSAAAMVR.js.map +0 -1
  320. package/dist/components.js.map +0 -1
  321. package/dist/contextValidator-OOPCLPZW.js +0 -9
  322. package/dist/contextValidator-OOPCLPZW.js.map +0 -1
  323. package/dist/eslint-rules/pace-core-compliance.cjs +0 -510
  324. package/dist/hooks.js.map +0 -1
  325. package/dist/index.js.map +0 -1
  326. package/dist/providers.js.map +0 -1
  327. package/dist/rbac/eslint-rules.js.map +0 -1
  328. package/dist/rbac/index.js.map +0 -1
  329. package/dist/styles/index.js.map +0 -1
  330. package/dist/theming/runtime.js.map +0 -1
  331. package/dist/types.js.map +0 -1
  332. package/dist/utils.js.map +0 -1
  333. package/docs/standards/01-architecture-standard.md +0 -44
  334. package/docs/standards/02-api-and-rpc-standard.md +0 -39
  335. package/docs/standards/03-component-standard.md +0 -32
  336. package/docs/standards/05-security-standard.md +0 -44
  337. package/docs/standards/06-testing-and-docs-standard.md +0 -29
  338. package/docs/standards/pace-core-compliance.md +0 -432
  339. package/scripts/audit/core/checks/accessibility.cjs +0 -197
  340. package/scripts/audit/core/checks/api-usage.cjs +0 -191
  341. package/scripts/audit/core/checks/bundle.cjs +0 -142
  342. package/scripts/audit/core/checks/compliance.cjs +0 -2706
  343. package/scripts/audit/core/checks/config.cjs +0 -54
  344. package/scripts/audit/core/checks/coverage.cjs +0 -84
  345. package/scripts/audit/core/checks/dependencies.cjs +0 -994
  346. package/scripts/audit/core/checks/documentation.cjs +0 -268
  347. package/scripts/audit/core/checks/environment.cjs +0 -116
  348. package/scripts/audit/core/checks/error-handling.cjs +0 -340
  349. package/scripts/audit/core/checks/forms.cjs +0 -172
  350. package/scripts/audit/core/checks/heuristics.cjs +0 -68
  351. package/scripts/audit/core/checks/hooks.cjs +0 -334
  352. package/scripts/audit/core/checks/imports.cjs +0 -244
  353. package/scripts/audit/core/checks/performance.cjs +0 -325
  354. package/scripts/audit/core/checks/routes.cjs +0 -117
  355. package/scripts/audit/core/checks/state.cjs +0 -130
  356. package/scripts/audit/core/checks/structure.cjs +0 -65
  357. package/scripts/audit/core/checks/style.cjs +0 -584
  358. package/scripts/audit/core/checks/testing.cjs +0 -122
  359. package/scripts/audit/core/checks/typescript.cjs +0 -61
  360. package/scripts/audit/core/scanner.cjs +0 -199
  361. package/scripts/audit/core/utils.cjs +0 -137
  362. package/scripts/audit/reporters/console.cjs +0 -151
  363. package/scripts/audit/reporters/json.cjs +0 -54
  364. package/scripts/audit/reporters/markdown.cjs +0 -124
  365. package/scripts/audit-consuming-app.cjs +0 -86
  366. package/src/eslint-rules/pace-core-compliance.cjs +0 -510
  367. package/src/eslint-rules/pace-core-compliance.js +0 -638
  368. package/src/rbac/components/EnhancedNavigationMenu.test.tsx +0 -555
  369. package/src/rbac/components/EnhancedNavigationMenu.tsx +0 -293
  370. package/src/rbac/components/NavigationProvider.test.tsx +0 -481
  371. package/src/rbac/components/NavigationProvider.tsx +0 -345
  372. package/src/rbac/components/PagePermissionProvider.test.tsx +0 -476
  373. package/src/rbac/components/PagePermissionProvider.tsx +0 -279
  374. package/src/rbac/components/PermissionEnforcer.tsx +0 -312
  375. package/src/rbac/components/RoleBasedRouter.tsx +0 -440
  376. package/src/rbac/components/SecureDataProvider.test.tsx +0 -543
  377. package/src/rbac/components/SecureDataProvider.tsx +0 -339
  378. package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +0 -620
  379. package/src/rbac/components/__tests__/NavigationProvider.test.tsx +0 -726
  380. package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +0 -661
  381. package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +0 -881
  382. package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +0 -783
  383. package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +0 -645
  384. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +0 -659
  385. package/src/rbac/hooks/permissions/useCachedPermissions.ts +0 -79
  386. package/src/rbac/hooks/permissions/useHasAllPermissions.ts +0 -90
  387. package/src/rbac/hooks/permissions/useHasAnyPermission.ts +0 -90
@@ -13,9 +13,9 @@
13
13
  * for backward compatibility or standalone usage.
14
14
  */
15
15
 
16
- import React from 'react';
17
- import { useUnifiedAuth } from '../providers/services/UnifiedAuthProvider';
18
- import { OrganisationServiceProvider } from './services/OrganisationServiceProvider';
16
+ import React, { useContext } from 'react';
17
+ import { UnifiedAuthContext } from '../providers/services/UnifiedAuthProvider';
18
+ import { OrganisationServiceProvider, OrganisationServiceContext } from './services/OrganisationServiceProvider';
19
19
  import type { OrganisationProviderProps as BaseOrganisationProviderProps } from '../types/organisation';
20
20
 
21
21
  export interface OrganisationProviderProps extends BaseOrganisationProviderProps {
@@ -45,19 +45,29 @@ export function OrganisationProvider({
45
45
  autoSelectPrimaryOrganisation,
46
46
  onOrganisationChange
47
47
  }: OrganisationProviderProps) {
48
+ // Call all hooks unconditionally at the top level
49
+ // Hooks must be called in the same order on every render
50
+ // Check if we're already inside OrganisationServiceProvider (e.g., from UnifiedAuthProvider)
51
+ // If so, just pass through children to avoid double-wrapping
52
+ const existingOrganisationService = useContext(OrganisationServiceContext);
53
+
48
54
  // Get auth context from UnifiedAuthProvider
49
- const authContext = useUnifiedAuth();
55
+ // Use useContext directly instead of useUnifiedAuth() to avoid throwing
56
+ // if context isn't available yet (e.g., during initial render)
57
+ const authContext = useContext(UnifiedAuthContext);
50
58
 
51
- // If we're inside UnifiedAuthProvider, it already includes OrganisationServiceProvider
52
- // So we can just pass through the children
53
- // However, if the auth context is not available, we need to handle that
54
- if (!authContext) {
55
- // If no auth context, we can't provide organisation service
56
- // This might happen if used outside UnifiedAuthProvider
57
- // In that case, we should probably throw an error or show a message
58
- console.warn('OrganisationProvider: No auth context available. Make sure OrganisationProvider is used inside UnifiedAuthProvider.');
59
+ // Early return after all hooks have been called
60
+ if (existingOrganisationService) {
61
+ // We're already inside UnifiedAuthProvider which includes OrganisationServiceProvider
62
+ // Just pass through children - no need to wrap again
59
63
  return <>{children}</>;
60
64
  }
65
+
66
+ // If no auth context, we can't provide organisation service
67
+ // This might happen if used outside UnifiedAuthProvider
68
+ if (!authContext) {
69
+ throw new Error('OrganisationProvider must be used inside UnifiedAuthProvider, or OrganisationServiceProvider must be provided separately');
70
+ }
61
71
 
62
72
  const { supabase, user, session } = authContext;
63
73
 
@@ -66,8 +76,7 @@ export function OrganisationProvider({
66
76
  // are handled by the OrganisationService internally, not by the provider
67
77
  // Note: supabase is mapped to supabaseClient for OrganisationServiceProvider
68
78
  if (!supabase) {
69
- console.warn('OrganisationProvider: No supabase client available.');
70
- return <>{children}</>;
79
+ throw new Error('OrganisationProvider: No supabase client available from UnifiedAuthProvider');
71
80
  }
72
81
 
73
82
  return (
@@ -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
 
@@ -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: {
@@ -229,18 +229,18 @@ import { PermissionEnforcer } from '@jmruthers/pace-core/rbac';
229
229
 
230
230
  function Dashboard() {
231
231
  return (
232
- <div>
232
+ <main>
233
233
  <h1>Dashboard</h1>
234
234
 
235
235
  {/* Automatic scope resolution - no manual context needed */}
236
236
  <PermissionEnforcer
237
237
  permissions={['read:admin']}
238
238
  operation="admin-panel"
239
- fallback={<div>Access Denied</div>}
239
+ fallback={<main>Access Denied</main>}
240
240
  >
241
241
  <AdminPanel />
242
242
  </PermissionEnforcer>
243
- </div>
243
+ </main>
244
244
  );
245
245
  }
246
246
  ```
@@ -266,14 +266,14 @@ function UserActions() {
266
266
  }
267
267
  );
268
268
 
269
- if (isLoading) return <div>Loading permissions...</div>;
270
- if (error) return <div>Error: {error.message}</div>;
269
+ if (isLoading) return <main>Loading permissions...</main>;
270
+ if (error) return <main>Error: {error.message}</main>;
271
271
 
272
272
  return (
273
- <div>
273
+ <section>
274
274
  {permissions['page-1']?.includes('read') && <ReadButton />}
275
275
  {permissions['page-1']?.includes('update') && <UpdateButton />}
276
- </div>
276
+ </section>
277
277
  );
278
278
  }
279
279
  ```
@@ -301,13 +301,13 @@ function UserActions() {
301
301
  'page-123' // optional pageId
302
302
  );
303
303
 
304
- if (isLoading) return <div>Checking permission...</div>;
305
- if (error) return <div>Error: {error.message}</div>;
304
+ if (isLoading) return <main>Checking permission...</main>;
305
+ if (error) return <main>Error: {error.message}</main>;
306
306
 
307
307
  return (
308
- <div>
308
+ <section>
309
309
  {can ? <AdminPanel /> : <AccessDenied />}
310
- </div>
310
+ </section>
311
311
  );
312
312
  }
313
313
  ```
@@ -321,7 +321,7 @@ import { PermissionEnforcer, PagePermissionGuard } from '@jmruthers/pace-core/rb
321
321
 
322
322
  function EventDashboard() {
323
323
  return (
324
- <div>
324
+ <main>
325
325
  <h1>Event Dashboard</h1>
326
326
 
327
327
  {/* Organization is automatically resolved from event context */}
@@ -338,7 +338,7 @@ function EventDashboard() {
338
338
  >
339
339
  <EventSettings />
340
340
  </PagePermissionGuard>
341
- </div>
341
+ </main>
342
342
  );
343
343
  }
344
344
  ```
@@ -374,7 +374,7 @@ function EventDashboard() {
374
374
  ```tsx
375
375
  const { selectedOrganisationId } = useUnifiedAuth();
376
376
  if (!selectedOrganisationId) {
377
- return <div>Please select an organisation first</div>;
377
+ return <main>Please select an organisation first</main>;
378
378
  }
379
379
  ```
380
380
 
@@ -479,14 +479,14 @@ function MyComponent() {
479
479
  { organisationId: 'org-456' }
480
480
  );
481
481
 
482
- if (isLoading) return <div>Loading...</div>;
483
- if (error) return <div>Error: {error.message}</div>;
482
+ if (isLoading) return <main>Loading...</main>;
483
+ if (error) return <main>Error: {error.message}</main>;
484
484
 
485
485
  return (
486
- <div>
486
+ <section>
487
487
  {can && <AdminPanel />}
488
488
  {accessLevel === 'admin' && <AdminControls />}
489
- </div>
489
+ </section>
490
490
  );
491
491
  }
492
492
  ```
@@ -498,7 +498,7 @@ import { PermissionEnforcer, PagePermissionGuard } from '@jmruthers/pace-core/rb
498
498
 
499
499
  function App() {
500
500
  return (
501
- <div>
501
+ <main>
502
502
  <PermissionEnforcer
503
503
  permissions={['update:events']}
504
504
  operation="event-management"
@@ -514,7 +514,7 @@ function App() {
514
514
  >
515
515
  <AdminPanel />
516
516
  </PagePermissionGuard>
517
- </div>
517
+ </main>
518
518
  );
519
519
  }
520
520
  ```