@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
@@ -1,20 +1,71 @@
1
- import {
2
- createAuditManager,
3
- emitAuditEvent,
4
- setGlobalAuditManager
5
- } from "./chunk-63FOKYGO.js";
6
- import {
7
- ContextValidator,
8
- InvalidScopeError,
9
- MissingUserContextError,
10
- OrganisationContextRequiredError,
11
- PermissionDeniedError,
12
- RBACError,
13
- RBACNotInitializedError
14
- } from "./chunk-36LVWXB2.js";
15
- import {
16
- createLogger
17
- } from "./chunk-PWLANIRT.js";
1
+ import { emitAuditEvent, createAuditManager, setGlobalAuditManager } from './chunk-AHU7G2R5.js';
2
+ import { createLogger } from './chunk-TTRFSOKR.js';
3
+
4
+ // src/rbac/types.ts
5
+ var RBACError = class extends Error {
6
+ constructor(message, code, context) {
7
+ super(message);
8
+ this.code = code;
9
+ this.context = context;
10
+ this.name = "RBACError";
11
+ }
12
+ };
13
+ var PermissionDeniedError = class extends RBACError {
14
+ constructor(permission, context) {
15
+ super(
16
+ `Permission denied: ${permission}`,
17
+ "PERMISSION_DENIED",
18
+ { permission, ...context }
19
+ );
20
+ this.name = "PermissionDeniedError";
21
+ }
22
+ };
23
+ var OrganisationContextRequiredError = class extends RBACError {
24
+ constructor() {
25
+ super(
26
+ "Organisation context is required for this operation",
27
+ "ORGANISATION_CONTEXT_REQUIRED"
28
+ );
29
+ this.name = "OrganisationContextRequiredError";
30
+ }
31
+ };
32
+ var EventContextRequiredError = class extends RBACError {
33
+ constructor() {
34
+ super(
35
+ "Event context is required for this operation",
36
+ "EVENT_CONTEXT_REQUIRED"
37
+ );
38
+ this.name = "EventContextRequiredError";
39
+ }
40
+ };
41
+ var RBACNotInitializedError = class extends RBACError {
42
+ constructor() {
43
+ super(
44
+ "RBAC system not initialized. Please call setupRBAC(supabase) before using any RBAC components or hooks. See: https://docs.pace-core.dev/rbac/setup",
45
+ "RBAC_NOT_INITIALIZED"
46
+ );
47
+ this.name = "RBACNotInitializedError";
48
+ }
49
+ };
50
+ var InvalidScopeError = class extends RBACError {
51
+ constructor(scope, reason) {
52
+ super(
53
+ `Invalid scope provided: ${JSON.stringify(scope)}. ${reason}`,
54
+ "INVALID_SCOPE",
55
+ { scope, reason }
56
+ );
57
+ this.name = "InvalidScopeError";
58
+ }
59
+ };
60
+ var MissingUserContextError = class extends RBACError {
61
+ constructor() {
62
+ super(
63
+ "User context is required but not available. Make sure to wrap your app with an auth provider.",
64
+ "MISSING_USER_CONTEXT"
65
+ );
66
+ this.name = "MissingUserContextError";
67
+ }
68
+ };
18
69
 
19
70
  // src/rbac/cache.ts
20
71
  var RBACCache = class {
@@ -512,7 +563,6 @@ var RBACCacheInvalidationManager = class {
512
563
  var globalCacheInvalidationManager = null;
513
564
  function initializeCacheInvalidation(supabase) {
514
565
  if (globalCacheInvalidationManager) {
515
- log.debug("Cleaning up existing cache invalidation manager before creating new one");
516
566
  globalCacheInvalidationManager.cleanup();
517
567
  }
518
568
  globalCacheInvalidationManager = new RBACCacheInvalidationManager(supabase);
@@ -554,8 +604,6 @@ function categorizeError(error) {
554
604
  return "validation_error" /* VALIDATION */;
555
605
  case "MISSING_USER_CONTEXT":
556
606
  return "authentication_error" /* AUTHENTICATION */;
557
- default:
558
- break;
559
607
  }
560
608
  }
561
609
  if (error && typeof error === "object") {
@@ -1141,27 +1189,27 @@ var RBACEngine = class {
1141
1189
  });
1142
1190
  return false;
1143
1191
  }
1144
- const hasPermission2 = data === true;
1145
- rbacCache.set(cacheKey, hasPermission2, 6e4);
1192
+ const hasPermission = data === true;
1193
+ rbacCache.set(cacheKey, hasPermission, 6e4);
1146
1194
  const duration = Date.now() - startTime;
1147
1195
  if (scope.organisationId) {
1148
1196
  const resolvedPageId = await this.resolvePageId(pageId, scope.appId);
1149
1197
  await emitAuditEvent({
1150
- type: hasPermission2 ? "permission_check" : "permission_denied",
1198
+ type: hasPermission ? "permission_check" : "permission_denied",
1151
1199
  userId,
1152
1200
  organisationId: scope.organisationId,
1153
1201
  eventId: scope.eventId,
1154
1202
  appId: scope.appId,
1155
1203
  pageId: resolvedPageId,
1156
1204
  permission,
1157
- decision: hasPermission2,
1205
+ decision: hasPermission,
1158
1206
  source: "api",
1159
1207
  duration_ms: duration,
1160
1208
  cache_hit: cacheHit,
1161
1209
  cache_source: cacheSource
1162
1210
  });
1163
1211
  }
1164
- return hasPermission2;
1212
+ return hasPermission;
1165
1213
  } catch (error) {
1166
1214
  const category = categorizeError(error);
1167
1215
  const eventType = mapErrorCategoryToSecurityEventType(category);
@@ -1280,7 +1328,7 @@ var RBACEngine = class {
1280
1328
  for (const page of pages) {
1281
1329
  for (const operation of ["read", "create", "update", "delete"]) {
1282
1330
  const permissionString = `${operation}:page.${page.page_name}`;
1283
- const hasPermission2 = await this.isPermitted(
1331
+ const hasPermission = await this.isPermitted(
1284
1332
  {
1285
1333
  userId,
1286
1334
  scope,
@@ -1290,7 +1338,7 @@ var RBACEngine = class {
1290
1338
  securityContext
1291
1339
  );
1292
1340
  const permissionKey = permissionString;
1293
- permissionMap[permissionKey] = hasPermission2;
1341
+ permissionMap[permissionKey] = hasPermission;
1294
1342
  }
1295
1343
  }
1296
1344
  }
@@ -1607,11 +1655,194 @@ function getInFlightRequestCount() {
1607
1655
  return inFlightRequests.size;
1608
1656
  }
1609
1657
 
1658
+ // src/rbac/utils/eventContext.ts
1659
+ var orgDerivationCache = /* @__PURE__ */ new Map();
1660
+ var MAX_CACHE_SIZE = 100;
1661
+ async function getOrganisationFromEvent(supabase, eventId) {
1662
+ if (orgDerivationCache.has(eventId)) {
1663
+ return orgDerivationCache.get(eventId) ?? null;
1664
+ }
1665
+ const { data, error } = await supabase.from("core_events").select("organisation_id").eq("event_id", eventId).single();
1666
+ let organisationId = null;
1667
+ if (error || !data) {
1668
+ organisationId = null;
1669
+ } else if (data.organisation_id) {
1670
+ organisationId = data.organisation_id;
1671
+ } else {
1672
+ organisationId = null;
1673
+ }
1674
+ if (orgDerivationCache.size >= MAX_CACHE_SIZE) {
1675
+ const firstKey = orgDerivationCache.keys().next().value;
1676
+ if (firstKey) {
1677
+ orgDerivationCache.delete(firstKey);
1678
+ }
1679
+ }
1680
+ orgDerivationCache.set(eventId, organisationId);
1681
+ return organisationId;
1682
+ }
1683
+
1684
+ // src/rbac/utils/contextValidator.ts
1685
+ var log3 = createLogger("ContextValidator");
1686
+ function allowsOptionalContexts(appName) {
1687
+ return appName === "PORTAL" || appName === "ADMIN";
1688
+ }
1689
+ var ContextValidator = class {
1690
+ /**
1691
+ * Derive organisation ID from event ID
1692
+ *
1693
+ * @param supabase - Supabase client
1694
+ * @param eventId - Event ID
1695
+ * @returns Organisation ID or null
1696
+ */
1697
+ static async deriveOrgFromEvent(supabase, eventId) {
1698
+ return getOrganisationFromEvent(supabase, eventId);
1699
+ }
1700
+ /**
1701
+ * Resolve scope based on page-level scope_type
1702
+ *
1703
+ * This method handles page-level scoping. All pages have explicit scope_type set.
1704
+ * Used for hybrid apps that have both event and organisation pages.
1705
+ *
1706
+ * @param scope - Current scope
1707
+ * @param pageScopeType - Page scope type ('event', 'organisation', or 'both')
1708
+ * @param appName - App name (for PORTAL/ADMIN special case)
1709
+ * @param supabase - Supabase client (for deriving org from event, only if not already provided)
1710
+ * @param immediateOrganisationId - Optional immediate organisation ID (from selectedEvent.organisation_id) - avoids querying
1711
+ * @returns Resolved scope with all required context
1712
+ */
1713
+ static async resolveScopeForPage(scope, pageScopeType, appName, supabase, immediateOrganisationId) {
1714
+ const effectiveScopeType = pageScopeType;
1715
+ if (effectiveScopeType === "both") {
1716
+ if (!scope.organisationId && !scope.eventId) {
1717
+ if (allowsOptionalContexts(appName)) {
1718
+ return {
1719
+ isValid: true,
1720
+ resolvedScope: {
1721
+ organisationId: void 0,
1722
+ eventId: void 0,
1723
+ appId: scope.appId
1724
+ },
1725
+ error: null
1726
+ };
1727
+ }
1728
+ return {
1729
+ isValid: false,
1730
+ resolvedScope: null,
1731
+ error: new Error("Page requires either organisation or event context")
1732
+ };
1733
+ }
1734
+ let organisationId = scope.organisationId || immediateOrganisationId || void 0;
1735
+ if (!organisationId && scope.eventId && supabase) {
1736
+ try {
1737
+ const derivedOrgId = await this.deriveOrgFromEvent(supabase, scope.eventId);
1738
+ organisationId = derivedOrgId || void 0;
1739
+ } catch (error) {
1740
+ log3.warn("Failed to derive org from event for both-scope page:", error);
1741
+ }
1742
+ }
1743
+ return {
1744
+ isValid: true,
1745
+ resolvedScope: {
1746
+ organisationId,
1747
+ eventId: scope.eventId,
1748
+ appId: scope.appId
1749
+ },
1750
+ error: null
1751
+ };
1752
+ }
1753
+ if (effectiveScopeType === "event") {
1754
+ if (!scope.eventId) {
1755
+ if (allowsOptionalContexts(appName)) {
1756
+ return {
1757
+ isValid: true,
1758
+ resolvedScope: {
1759
+ organisationId: scope.organisationId,
1760
+ eventId: void 0,
1761
+ appId: scope.appId
1762
+ },
1763
+ error: null
1764
+ };
1765
+ }
1766
+ return {
1767
+ isValid: false,
1768
+ resolvedScope: null,
1769
+ error: new EventContextRequiredError()
1770
+ };
1771
+ }
1772
+ let organisationId = scope.organisationId || immediateOrganisationId || void 0;
1773
+ if (!organisationId && supabase && scope.eventId) {
1774
+ try {
1775
+ const derivedOrgId = await this.deriveOrgFromEvent(supabase, scope.eventId);
1776
+ organisationId = derivedOrgId || void 0;
1777
+ if (!organisationId) {
1778
+ return {
1779
+ isValid: false,
1780
+ resolvedScope: null,
1781
+ error: new Error("Could not resolve organisation from event context")
1782
+ };
1783
+ }
1784
+ } catch (error) {
1785
+ log3.error("Failed to derive org from event:", error);
1786
+ return {
1787
+ isValid: false,
1788
+ resolvedScope: null,
1789
+ error: error instanceof Error ? error : new Error("Failed to derive organisation from event")
1790
+ };
1791
+ }
1792
+ }
1793
+ return {
1794
+ isValid: true,
1795
+ resolvedScope: {
1796
+ organisationId,
1797
+ eventId: scope.eventId,
1798
+ appId: scope.appId
1799
+ },
1800
+ error: null
1801
+ };
1802
+ }
1803
+ if (effectiveScopeType === "organisation") {
1804
+ if (!scope.organisationId) {
1805
+ if (allowsOptionalContexts(appName)) {
1806
+ return {
1807
+ isValid: true,
1808
+ resolvedScope: {
1809
+ organisationId: void 0,
1810
+ eventId: scope.eventId,
1811
+ appId: scope.appId
1812
+ },
1813
+ error: null
1814
+ };
1815
+ }
1816
+ return {
1817
+ isValid: false,
1818
+ resolvedScope: null,
1819
+ error: new OrganisationContextRequiredError()
1820
+ };
1821
+ }
1822
+ return {
1823
+ isValid: true,
1824
+ resolvedScope: {
1825
+ organisationId: scope.organisationId,
1826
+ eventId: scope.eventId,
1827
+ // Event is optional for org-scoped pages
1828
+ appId: scope.appId
1829
+ },
1830
+ error: null
1831
+ };
1832
+ }
1833
+ return {
1834
+ isValid: false,
1835
+ resolvedScope: null,
1836
+ error: new Error("Invalid scope type")
1837
+ };
1838
+ }
1839
+ };
1840
+
1610
1841
  // src/rbac/api.ts
1611
- var log3 = createLogger("RBACAPI");
1842
+ var log4 = createLogger("RBACAPI");
1612
1843
  var globalEngine = null;
1613
1844
  function setupRBAC(supabase, config) {
1614
- const logger = getRBACLogger();
1845
+ getRBACLogger();
1615
1846
  const isDevelopment = import.meta.env.MODE === "development";
1616
1847
  const fullConfig = {
1617
1848
  supabase,
@@ -1753,7 +1984,7 @@ async function isPermitted(input, appName, precomputedSuperAdmin = null) {
1753
1984
  }
1754
1985
  pageScopeType = scopeType;
1755
1986
  } catch (err) {
1756
- log3.error("Failed to get page scope type:", err);
1987
+ log4.error("Failed to get page scope type:", err);
1757
1988
  throw new Error(`Failed to determine page scope type: ${err instanceof Error ? err.message : String(err)}`);
1758
1989
  }
1759
1990
  } else {
@@ -1840,17 +2071,14 @@ async function isPermittedCached(input, appName) {
1840
2071
  return result;
1841
2072
  });
1842
2073
  }
1843
- async function hasPermission(input) {
1844
- return isPermitted(input);
1845
- }
1846
2074
  async function hasAnyPermission(input) {
1847
2075
  const { permissions, ...baseInput } = input;
1848
2076
  for (const permission of permissions) {
1849
- const hasPermission2 = await isPermitted({
2077
+ const hasPermission = await isPermitted({
1850
2078
  ...baseInput,
1851
2079
  permission
1852
2080
  });
1853
- if (hasPermission2) {
2081
+ if (hasPermission) {
1854
2082
  return true;
1855
2083
  }
1856
2084
  }
@@ -1859,11 +2087,11 @@ async function hasAnyPermission(input) {
1859
2087
  async function hasAllPermissions(input) {
1860
2088
  const { permissions, ...baseInput } = input;
1861
2089
  for (const permission of permissions) {
1862
- const hasPermission2 = await isPermitted({
2090
+ const hasPermission = await isPermitted({
1863
2091
  ...baseInput,
1864
2092
  permission
1865
2093
  });
1866
- if (!hasPermission2) {
2094
+ if (!hasPermission) {
1867
2095
  return false;
1868
2096
  }
1869
2097
  }
@@ -1893,19 +2121,17 @@ async function getPageScopeType(pageId, appId, appName) {
1893
2121
  if (!uuidRegex.test(resolvedPageId)) {
1894
2122
  throw new Error(`Could not resolve pageId ${pageId} to a valid UUID`);
1895
2123
  }
1896
- const { data, error } = await engine["supabase"].rpc("get_page_scope_type", {
1897
- p_page_id: resolvedPageId
1898
- });
2124
+ const { data: pageData, error } = await engine["supabase"].from("rbac_app_pages").select("scope_type").eq("id", resolvedPageId).single();
1899
2125
  if (error) {
1900
- log3.error("Error fetching page scope type:", { pageId, appId, error });
2126
+ log4.error("Error fetching page scope type:", { pageId, appId, error });
1901
2127
  throw new Error(`Failed to get page scope type: ${error.message}`);
1902
2128
  }
1903
- if (!data) {
2129
+ if (!pageData || !pageData.scope_type) {
1904
2130
  throw new Error(`Page ${resolvedPageId} does not have scope_type set`);
1905
2131
  }
1906
- return data;
2132
+ return pageData.scope_type;
1907
2133
  } catch (err) {
1908
- log3.error("Error fetching page scope type:", err);
2134
+ log4.error("Error fetching page scope type:", err);
1909
2135
  throw err instanceof Error ? err : new Error(`Failed to get page scope type: ${String(err)}`);
1910
2136
  }
1911
2137
  }
@@ -1948,46 +2174,4 @@ function clearCache() {
1948
2174
  rbacCache.clear();
1949
2175
  }
1950
2176
 
1951
- export {
1952
- RBACCache,
1953
- rbacCache,
1954
- CACHE_PATTERNS,
1955
- createRBACConfig,
1956
- getRBACConfig,
1957
- getRBACLogger,
1958
- isDebugMode,
1959
- isDevelopmentMode,
1960
- RBACEngine,
1961
- createRBACEngine,
1962
- enablePerformanceMonitoring,
1963
- disablePerformanceMonitoring,
1964
- isPerformanceMonitoringEnabled,
1965
- recordPermissionCheck,
1966
- recordAuditEvent,
1967
- getPerformanceMetrics,
1968
- resetPerformanceMetrics,
1969
- getPerformanceSummary,
1970
- clearInFlightRequests,
1971
- getInFlightRequestCount,
1972
- setupRBAC,
1973
- isRBACInitialized,
1974
- getAccessLevel,
1975
- getPermissionMap,
1976
- resolveAppContext,
1977
- getRoleContext,
1978
- isPermitted,
1979
- isPermittedCached,
1980
- hasPermission,
1981
- hasAnyPermission,
1982
- hasAllPermissions,
1983
- isSuperAdmin,
1984
- getPageScopeType,
1985
- isOrganisationAdmin,
1986
- isEventAdmin,
1987
- invalidateUserCache,
1988
- invalidateOrganisationCache,
1989
- invalidateEventCache,
1990
- invalidateAppCache,
1991
- clearCache
1992
- };
1993
- //# sourceMappingURL=chunk-3LPHPB62.js.map
2177
+ export { CACHE_PATTERNS, ContextValidator, EventContextRequiredError, OrganisationContextRequiredError, RBACCache, RBACEngine, RBACNotInitializedError, clearCache, clearInFlightRequests, createRBACConfig, createRBACEngine, disablePerformanceMonitoring, enablePerformanceMonitoring, getAccessLevel, getInFlightRequestCount, getPageScopeType, getPerformanceMetrics, getPerformanceSummary, getPermissionMap, getRBACConfig, getRBACLogger, getRoleContext, hasAllPermissions, hasAnyPermission, invalidateAppCache, invalidateEventCache, invalidateOrganisationCache, invalidateUserCache, isDebugMode, isDevelopmentMode, isEventAdmin, isOrganisationAdmin, isPerformanceMonitoringEnabled, isPermitted, isPermittedCached, isRBACInitialized, isSuperAdmin, rbacCache, recordAuditEvent, recordPermissionCheck, resetPerformanceMetrics, resolveAppContext, setupRBAC };