@jmruthers/pace-core 0.6.1 → 0.6.3

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 (549) hide show
  1. package/CHANGELOG.md +88 -10
  2. package/cursor-rules/00-pace-core-compliance.mdc +46 -87
  3. package/cursor-rules/01-standards-compliance.mdc +16 -47
  4. package/cursor-rules/02-project-structure.mdc +4 -4
  5. package/cursor-rules/03-solid-principles.mdc +45 -164
  6. package/cursor-rules/04-testing-standards.mdc +22 -69
  7. package/cursor-rules/05-bug-reports-and-features.mdc +2 -2
  8. package/cursor-rules/06-code-quality.mdc +42 -125
  9. package/cursor-rules/07-tech-stack-compliance.mdc +33 -128
  10. package/cursor-rules/08-markup-quality.mdc +452 -0
  11. package/cursor-rules/CHANGELOG.md +18 -0
  12. package/cursor-rules/README.md +2 -1
  13. package/dist/{AuthService-DjnJHDtC.d.ts → AuthService-Cb34EQs3.d.ts} +63 -1
  14. package/dist/{DataTable-CH1U5Tpy.d.ts → DataTable-BMRU8a1j.d.ts} +33 -1
  15. package/dist/{DataTable-DQ7RSOHE.js → DataTable-THFPBKTP.js} +12 -10
  16. package/dist/{PublicPageProvider-ce4xlHYA.d.ts → PublicPageProvider-DEMpysFR.d.ts} +394 -171
  17. package/dist/{UnifiedAuthProvider-185Ih4dj.d.ts → UnifiedAuthProvider-CKvHP1MK.d.ts} +30 -8
  18. package/dist/{UnifiedAuthProvider-ATAP5UTR.js → UnifiedAuthProvider-KAGUYQ4J.js} +5 -4
  19. package/dist/{api-N774RPUA.js → api-IAGWF3ZG.js} +10 -10
  20. package/dist/{audit-B5P6FFIR.js → audit-V53FV5AG.js} +2 -2
  21. package/dist/{chunk-JBKQ3SAO.js → chunk-2T2IG7T7.js} +107 -57
  22. package/dist/chunk-2T2IG7T7.js.map +1 -0
  23. package/dist/{chunk-3QRJFVBR.js → chunk-6SOIHG6Z.js} +1 -1
  24. package/dist/chunk-6SOIHG6Z.js.map +1 -0
  25. package/dist/{chunk-3XTALGJF.js → chunk-6Z7LTB3D.js} +69 -240
  26. package/dist/chunk-6Z7LTB3D.js.map +1 -0
  27. package/dist/{chunk-4ZC4GX36.js → chunk-CNCQDFLN.js} +199 -46
  28. package/dist/chunk-CNCQDFLN.js.map +1 -0
  29. package/dist/chunk-DGUM43GV.js +11 -0
  30. package/dist/{chunk-BYFSK72L.js → chunk-DWUBLJJM.js} +361 -187
  31. package/dist/chunk-DWUBLJJM.js.map +1 -0
  32. package/dist/{chunk-LXQLPRQ2.js → chunk-FFQEQTNW.js} +6 -8
  33. package/dist/chunk-FFQEQTNW.js.map +1 -0
  34. package/dist/chunk-FMUCXFII.js +76 -0
  35. package/dist/chunk-FMUCXFII.js.map +1 -0
  36. package/dist/{chunk-4N5C5XZU.js → chunk-HFZBI76P.js} +4 -4
  37. package/dist/chunk-HFZBI76P.js.map +1 -0
  38. package/dist/{chunk-SQGMNID3.js → chunk-L4OXEN46.js} +4 -5
  39. package/dist/chunk-L4OXEN46.js.map +1 -0
  40. package/dist/{chunk-R77UEZ4E.js → chunk-M43Y4SSO.js} +1 -1
  41. package/dist/chunk-M43Y4SSO.js.map +1 -0
  42. package/dist/{chunk-I7PSE6JW.js → chunk-M7MPQISP.js} +3 -76
  43. package/dist/chunk-M7MPQISP.js.map +1 -0
  44. package/dist/chunk-PQBSKX33.js +7793 -0
  45. package/dist/chunk-PQBSKX33.js.map +1 -0
  46. package/dist/chunk-QRPVRXYT.js +226 -0
  47. package/dist/chunk-QRPVRXYT.js.map +1 -0
  48. package/dist/{chunk-KNC55RTG.js → chunk-RWEBCB47.js} +194 -416
  49. package/dist/chunk-RWEBCB47.js.map +1 -0
  50. package/dist/{chunk-XM25TVIE.js → chunk-YDQHOZNA.js} +843 -388
  51. package/dist/chunk-YDQHOZNA.js.map +1 -0
  52. package/dist/{chunk-GLK6VM3F.js → chunk-ZNIWI3UC.js} +739 -737
  53. package/dist/chunk-ZNIWI3UC.js.map +1 -0
  54. package/dist/components.d.ts +5 -5
  55. package/dist/components.js +18 -16
  56. package/dist/components.js.map +1 -1
  57. package/dist/contextValidator-3JNZKUTX.js +9 -0
  58. package/dist/contextValidator-3JNZKUTX.js.map +1 -0
  59. package/dist/eslint-rules/pace-core-compliance.cjs +106 -0
  60. package/dist/{functions-D_kgHktt.d.ts → functions-DHebl8-F.d.ts} +1 -1
  61. package/dist/hooks.d.ts +55 -122
  62. package/dist/hooks.js +10 -13
  63. package/dist/hooks.js.map +1 -1
  64. package/dist/index.d.ts +60 -13
  65. package/dist/index.js +30 -25
  66. package/dist/index.js.map +1 -1
  67. package/dist/providers.d.ts +21 -3
  68. package/dist/providers.js +4 -3
  69. package/dist/rbac/index.d.ts +210 -139
  70. package/dist/rbac/index.js +17 -13
  71. package/dist/styles/index.js +1 -1
  72. package/dist/theming/runtime.d.ts +1 -13
  73. package/dist/theming/runtime.js +2 -2
  74. package/dist/{timezone-_pgH8qrY.d.ts → timezone-CHhWg6b4.d.ts} +3 -10
  75. package/dist/{types-UU913iLA.d.ts → types-BeoeWV5I.d.ts} +8 -0
  76. package/dist/{types-CEpcvwwF.d.ts → types-CkbwOr4Y.d.ts} +6 -0
  77. package/dist/types.d.ts +2 -2
  78. package/dist/types.js +1 -1
  79. package/dist/{usePublicRouteParams-BJAlWfuJ.d.ts → usePublicRouteParams-i3qtoBgg.d.ts} +38 -17
  80. package/dist/utils.d.ts +4 -5
  81. package/dist/utils.js +17 -19
  82. package/dist/utils.js.map +1 -1
  83. package/docs/api/README.md +21 -17
  84. package/docs/api/modules.md +4191 -2967
  85. package/docs/architecture/database-schema-requirements.md +161 -0
  86. package/docs/components/context-selector.md +126 -0
  87. package/docs/core-concepts/rbac-system.md +3 -3
  88. package/docs/documentation-index.md +2 -4
  89. package/docs/getting-started/cursor-rules.md +2 -1
  90. package/docs/migration/DOCUMENTATION_STRUCTURE.md +441 -0
  91. package/docs/migration/MIGRATION_GUIDE.md +2 -24
  92. package/docs/migration/RBAC_SCOPE_MIGRATION.md +385 -0
  93. package/docs/migration/README.md +52 -6
  94. package/docs/migration/V0.5.190_TO_V0.6.1_MIGRATION.md +1153 -0
  95. package/docs/migration/database-changes-december-2025.md +3 -3
  96. package/docs/pace-mint-fix-auto-selection.md +218 -0
  97. package/docs/pace-mint-rbac-setup.md +391 -0
  98. package/docs/rbac/event-based-apps.md +1 -1
  99. package/docs/rbac/getting-started.md +1 -1
  100. package/docs/rbac/quick-start.md +1 -1
  101. package/docs/rbac/secure-client-protection.md +330 -0
  102. package/docs/standards/README.md +1 -0
  103. package/package.json +4 -3
  104. package/scripts/audit/core/checks/accessibility.cjs +197 -0
  105. package/scripts/audit/core/checks/api-usage.cjs +191 -0
  106. package/scripts/audit/core/checks/bundle.cjs +142 -0
  107. package/scripts/{check-pace-core-compliance.cjs → audit/core/checks/compliance.cjs} +784 -685
  108. package/scripts/audit/core/checks/config.cjs +54 -0
  109. package/scripts/audit/core/checks/coverage.cjs +84 -0
  110. package/scripts/audit/core/checks/dependencies.cjs +985 -0
  111. package/scripts/audit/core/checks/documentation.cjs +268 -0
  112. package/scripts/audit/core/checks/environment.cjs +116 -0
  113. package/scripts/audit/core/checks/error-handling.cjs +340 -0
  114. package/scripts/audit/core/checks/forms.cjs +172 -0
  115. package/scripts/audit/core/checks/heuristics.cjs +68 -0
  116. package/scripts/audit/core/checks/hooks.cjs +334 -0
  117. package/scripts/audit/core/checks/imports.cjs +244 -0
  118. package/scripts/audit/core/checks/performance.cjs +325 -0
  119. package/scripts/audit/core/checks/routes.cjs +117 -0
  120. package/scripts/audit/core/checks/state.cjs +130 -0
  121. package/scripts/audit/core/checks/structure.cjs +65 -0
  122. package/scripts/audit/core/checks/style.cjs +584 -0
  123. package/scripts/audit/core/checks/testing.cjs +122 -0
  124. package/scripts/audit/core/checks/typescript.cjs +61 -0
  125. package/scripts/audit/core/scanner.cjs +199 -0
  126. package/scripts/audit/core/utils.cjs +137 -0
  127. package/scripts/audit/index.cjs +223 -0
  128. package/scripts/audit/reporters/console.cjs +151 -0
  129. package/scripts/audit/reporters/json.cjs +54 -0
  130. package/scripts/audit/reporters/markdown.cjs +124 -0
  131. package/scripts/audit-consuming-app.cjs +61 -936
  132. package/scripts/build-docs/build-decision.js +240 -0
  133. package/scripts/build-docs/cache-utils.js +105 -0
  134. package/scripts/build-docs/content-normalization.js +150 -0
  135. package/scripts/build-docs/file-utils.js +105 -0
  136. package/scripts/build-docs/git-utils.js +86 -0
  137. package/scripts/build-docs/hash-utils.js +116 -0
  138. package/scripts/build-docs/typedoc-runner.js +220 -0
  139. package/scripts/build-docs-incremental.js +77 -913
  140. package/scripts/utils/command-runner.js +16 -11
  141. package/scripts/validate-formats.js +61 -56
  142. package/scripts/validate-master.js +74 -69
  143. package/scripts/validate-pre-publish.js +70 -65
  144. package/src/__tests__/hooks/usePermissions.test.ts +2 -2
  145. package/src/components/Alert/Alert.test.tsx +12 -18
  146. package/src/components/Alert/Alert.tsx +5 -7
  147. package/src/components/Avatar/Avatar.test.tsx +4 -4
  148. package/src/components/Badge/Badge.tsx +14 -0
  149. package/src/components/Button/Button.tsx +22 -0
  150. package/src/components/Calendar/Calendar.tsx +8 -2
  151. package/src/components/Card/Card.tsx +4 -0
  152. package/src/components/Checkbox/Checkbox.test.tsx +12 -12
  153. package/src/components/Checkbox/Checkbox.tsx +2 -2
  154. package/src/components/ContextSelector/ContextSelector.tsx +384 -0
  155. package/src/components/ContextSelector/index.ts +3 -0
  156. package/src/components/DataTable/DataTable.tsx +38 -4
  157. package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +5 -6
  158. package/src/components/DataTable/__tests__/pagination.modes.test.tsx +18 -4
  159. package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +2 -3
  160. package/src/components/DataTable/components/AccessDeniedPage.tsx +16 -25
  161. package/src/components/DataTable/components/ActionButtons.tsx +10 -7
  162. package/src/components/DataTable/components/BulkOperationsDropdown.tsx +1 -1
  163. package/src/components/DataTable/components/ColumnFilter.tsx +10 -0
  164. package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +12 -0
  165. package/src/components/DataTable/components/DataTableBody.tsx +8 -0
  166. package/src/components/DataTable/components/DataTableCore.tsx +196 -554
  167. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +11 -0
  168. package/src/components/DataTable/components/DataTableLayout.tsx +559 -0
  169. package/src/components/DataTable/components/DataTableModals.tsx +8 -0
  170. package/src/components/DataTable/components/DataTableToolbar.tsx +8 -0
  171. package/src/components/DataTable/components/DraggableColumnHeader.tsx +12 -0
  172. package/src/components/DataTable/components/EditFields.tsx +307 -0
  173. package/src/components/DataTable/components/EditableRow.tsx +8 -0
  174. package/src/components/DataTable/components/EmptyState.tsx +10 -0
  175. package/src/components/DataTable/components/FilterRow.tsx +12 -0
  176. package/src/components/DataTable/components/GroupHeader.tsx +12 -0
  177. package/src/components/DataTable/components/GroupingDropdown.tsx +12 -0
  178. package/src/components/DataTable/components/ImportModal.tsx +7 -0
  179. package/src/components/DataTable/components/LoadingState.tsx +6 -0
  180. package/src/components/DataTable/components/PaginationControls.tsx +16 -1
  181. package/src/components/DataTable/components/RowComponent.tsx +391 -0
  182. package/src/components/DataTable/components/UnifiedTableBody.tsx +63 -851
  183. package/src/components/DataTable/components/VirtualizedDataTable.tsx +16 -4
  184. package/src/components/DataTable/components/__tests__/AccessDeniedPage.test.tsx +4 -2
  185. package/src/components/DataTable/components/cellValueUtils.ts +40 -0
  186. package/src/components/DataTable/components/hooks/useImportModalFocus.ts +53 -0
  187. package/src/components/DataTable/components/hooks/usePermissionTracking.ts +126 -0
  188. package/src/components/DataTable/context/DataTableContext.tsx +50 -0
  189. package/src/components/DataTable/core/ColumnFactory.ts +31 -0
  190. package/src/components/DataTable/core/DataTableContext.tsx +32 -1
  191. package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +10 -0
  192. package/src/components/DataTable/hooks/useColumnReordering.ts +12 -0
  193. package/src/components/DataTable/hooks/useColumnVisibilityPersistence.ts +10 -0
  194. package/src/components/DataTable/hooks/useDataTableDataPipeline.ts +16 -0
  195. package/src/components/DataTable/hooks/useDataTablePermissions.ts +127 -33
  196. package/src/components/DataTable/hooks/useDataTableState.ts +35 -1
  197. package/src/components/DataTable/hooks/useEffectiveColumnOrder.ts +12 -0
  198. package/src/components/DataTable/hooks/useServerSideDataEffect.ts +11 -0
  199. package/src/components/DataTable/hooks/useTableColumns.ts +8 -0
  200. package/src/components/DataTable/hooks/useTableHandlers.ts +14 -0
  201. package/src/components/DataTable/styles.ts +6 -6
  202. package/src/components/DataTable/types.ts +6 -10
  203. package/src/components/DataTable/utils/a11yUtils.ts +7 -0
  204. package/src/components/DataTable/utils/debugTools.ts +18 -113
  205. package/src/components/DataTable/utils/errorHandling.ts +12 -0
  206. package/src/components/DataTable/utils/exportUtils.ts +9 -0
  207. package/src/components/DataTable/utils/flexibleImport.ts +12 -48
  208. package/src/components/DataTable/utils/paginationUtils.ts +8 -0
  209. package/src/components/DataTable/utils/performanceUtils.ts +5 -1
  210. package/src/components/Dialog/Dialog.tsx +31 -3
  211. package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +180 -1
  212. package/src/components/ErrorBoundary/ErrorBoundary.tsx +45 -5
  213. package/src/components/ErrorBoundary/ErrorBoundaryContext.tsx +129 -0
  214. package/src/components/ErrorBoundary/index.ts +27 -2
  215. package/src/components/FileDisplay/FileDisplay.tsx +74 -28
  216. package/src/components/FileUpload/FileUpload.tsx +22 -2
  217. package/src/components/Footer/Footer.test.tsx +16 -16
  218. package/src/components/Footer/Footer.tsx +14 -11
  219. package/src/components/Form/Form.tsx +1 -0
  220. package/src/components/Header/Header.test.tsx +43 -73
  221. package/src/components/Header/Header.tsx +59 -49
  222. package/src/components/Input/Input.test.tsx +2 -2
  223. package/src/components/Input/Input.tsx +8 -4
  224. package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +4 -4
  225. package/src/components/LoginForm/LoginForm.tsx +4 -0
  226. package/src/components/NavigationMenu/NavigationMenu.tsx +14 -513
  227. package/src/components/NavigationMenu/types.ts +56 -0
  228. package/src/components/NavigationMenu/useNavigationFiltering.ts +390 -0
  229. package/src/components/PaceAppLayout/PaceAppLayout.integration.test.tsx +10 -19
  230. package/src/components/PaceAppLayout/PaceAppLayout.performance.test.tsx +2 -2
  231. package/src/components/PaceAppLayout/PaceAppLayout.security.test.tsx +5 -5
  232. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +13 -11
  233. package/src/components/PaceAppLayout/PaceAppLayout.tsx +167 -44
  234. package/src/components/PaceAppLayout/README.md +14 -17
  235. package/src/components/PaceAppLayout/test-setup.tsx +3 -4
  236. package/src/components/PaceLoginPage/PaceLoginPage.tsx +3 -0
  237. package/src/components/PasswordChange/PasswordChangeForm.tsx +9 -0
  238. package/src/components/ProtectedRoute/ProtectedRoute.tsx +3 -9
  239. package/src/components/PublicLayout/PublicPageLayout.tsx +2 -5
  240. package/src/components/PublicLayout/PublicPageProvider.tsx +4 -0
  241. package/src/components/Select/Select.tsx +80 -434
  242. package/src/components/Select/context.ts +23 -0
  243. package/src/components/Select/hooks/useSelectEvents.ts +87 -0
  244. package/src/components/Select/hooks/useSelectSearch.ts +91 -0
  245. package/src/components/Select/hooks/useSelectState.ts +104 -0
  246. package/src/components/Select/index.ts +9 -1
  247. package/src/components/Select/types.ts +123 -0
  248. package/src/components/Select/utils/text.ts +26 -0
  249. package/src/components/SessionRestorationLoader/SessionRestorationLoader.tsx +4 -5
  250. package/src/components/Switch/Switch.tsx +4 -4
  251. package/src/components/Tabs/Tabs.tsx +1 -1
  252. package/src/components/Toast/Toast.tsx +4 -0
  253. package/src/components/Tooltip/Tooltip.tsx +2 -2
  254. package/src/components/UserMenu/UserMenu.test.tsx +24 -11
  255. package/src/components/UserMenu/UserMenu.tsx +21 -18
  256. package/src/components/index.ts +7 -7
  257. package/src/eslint-rules/pace-core-compliance.cjs +106 -0
  258. package/src/hooks/__tests__/index.unit.test.ts +2 -5
  259. package/src/hooks/__tests__/useAppConfig.unit.test.ts +4 -98
  260. package/src/hooks/index.ts +1 -2
  261. package/src/hooks/public/usePublicEvent.ts +4 -0
  262. package/src/hooks/public/usePublicEventLogo.ts +4 -0
  263. package/src/hooks/public/usePublicFileDisplay.ts +4 -0
  264. package/src/hooks/public/usePublicRouteParams.ts +4 -0
  265. package/src/hooks/services/useAuth.ts +32 -0
  266. package/src/hooks/services/useCurrentEvent.ts +6 -0
  267. package/src/hooks/services/useCurrentOrganisation.ts +6 -0
  268. package/src/hooks/useAppConfig.ts +15 -30
  269. package/src/hooks/useDebounce.ts +9 -0
  270. package/src/hooks/useEventTheme.ts +6 -0
  271. package/src/hooks/useFileDisplay.ts +81 -50
  272. package/src/hooks/useFileReference.ts +25 -7
  273. package/src/hooks/useFileUrl.ts +11 -1
  274. package/src/hooks/useFocusManagement.ts +14 -0
  275. package/src/hooks/useFocusTrap.ts +3 -0
  276. package/src/hooks/useInactivityTracker.ts +3 -0
  277. package/src/hooks/useKeyboardShortcuts.ts +4 -0
  278. package/src/hooks/useOrganisationPermissions.ts +4 -0
  279. package/src/hooks/useOrganisationSecurity.ts +4 -0
  280. package/src/hooks/usePerformanceMonitor.ts +4 -0
  281. package/src/hooks/usePermissionCache.ts +7 -0
  282. package/src/hooks/useQueryCache.ts +12 -1
  283. package/src/hooks/useSessionRestoration.ts +4 -0
  284. package/src/hooks/useStorage.ts +4 -0
  285. package/src/hooks/useToast.ts +1 -1
  286. package/src/index.ts +6 -6
  287. package/src/providers/__tests__/OrganisationProvider.test.tsx +92 -70
  288. package/src/providers/services/AuthServiceProvider.tsx +35 -7
  289. package/src/providers/services/EventServiceProvider.tsx +51 -5
  290. package/src/providers/services/InactivityServiceProvider.tsx +18 -0
  291. package/src/providers/services/OrganisationServiceProvider.tsx +18 -0
  292. package/src/providers/services/UnifiedAuthProvider.tsx +126 -134
  293. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +29 -13
  294. package/src/rbac/README.md +1 -1
  295. package/src/rbac/__tests__/adapters.comprehensive.test.tsx +1 -1
  296. package/src/rbac/__tests__/scenarios.user-role.test.tsx +4 -5
  297. package/src/rbac/adapters.tsx +12 -3
  298. package/src/rbac/api.test.ts +59 -51
  299. package/src/rbac/api.ts +246 -167
  300. package/src/rbac/components/NavigationProvider.tsx +4 -1
  301. package/src/rbac/components/PagePermissionGuard.tsx +185 -17
  302. package/src/rbac/components/RoleBasedRouter.tsx +5 -1
  303. package/src/rbac/components/SecureDataProvider.test.tsx +84 -49
  304. package/src/rbac/components/SecureDataProvider.tsx +20 -5
  305. package/src/rbac/components/__tests__/PagePermissionGuard.race-condition.test.tsx +24 -14
  306. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +7 -0
  307. package/src/rbac/components/__tests__/PagePermissionGuard.verification.test.tsx +14 -6
  308. package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +15 -4
  309. package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +148 -24
  310. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +81 -15
  311. package/src/rbac/engine.ts +38 -14
  312. package/src/rbac/hooks/__tests__/useSecureSupabase.test.ts +32 -21
  313. package/src/rbac/hooks/permissions/index.ts +7 -0
  314. package/src/rbac/hooks/permissions/useAccessLevel.ts +105 -0
  315. package/src/rbac/hooks/permissions/useCachedPermissions.ts +79 -0
  316. package/src/rbac/hooks/permissions/useCan.ts +377 -0
  317. package/src/rbac/hooks/permissions/useHasAllPermissions.ts +90 -0
  318. package/src/rbac/hooks/permissions/useHasAnyPermission.ts +90 -0
  319. package/src/rbac/hooks/permissions/useMultiplePermissions.ts +93 -0
  320. package/src/rbac/hooks/permissions/usePermissions.ts +253 -0
  321. package/src/rbac/hooks/useCan.test.ts +64 -66
  322. package/src/rbac/hooks/usePermissions.ts +14 -995
  323. package/src/rbac/hooks/useRBAC.test.ts +1 -5
  324. package/src/rbac/hooks/useRBAC.ts +36 -37
  325. package/src/rbac/hooks/useResolvedScope.test.ts +120 -35
  326. package/src/rbac/hooks/useResolvedScope.ts +35 -40
  327. package/src/rbac/hooks/useResourcePermissions.test.ts +54 -18
  328. package/src/rbac/hooks/useResourcePermissions.ts +14 -4
  329. package/src/rbac/hooks/useSecureSupabase.ts +27 -7
  330. package/src/rbac/index.ts +7 -0
  331. package/src/rbac/permissions.ts +0 -30
  332. package/src/rbac/secureClient.test.ts +22 -18
  333. package/src/rbac/secureClient.ts +294 -68
  334. package/src/rbac/security.ts +0 -17
  335. package/src/rbac/types.ts +9 -0
  336. package/src/rbac/utils/__tests__/contextValidator.test.ts +64 -86
  337. package/src/rbac/utils/clientSecurity.ts +93 -0
  338. package/src/rbac/utils/contextValidator.ts +77 -168
  339. package/src/services/AuthService.ts +39 -7
  340. package/src/services/EventService.ts +186 -54
  341. package/src/services/OrganisationService.ts +81 -14
  342. package/src/services/__tests__/EventService.test.ts +1 -2
  343. package/src/services/base/BaseService.ts +3 -0
  344. package/src/theming/__tests__/parseEventColours.test.ts +6 -9
  345. package/src/theming/parseEventColours.ts +5 -19
  346. package/src/types/vitest-globals.d.ts +51 -26
  347. package/src/utils/__mocks__/supabaseMock.ts +1 -3
  348. package/src/utils/__tests__/formatting.unit.test.ts +4 -4
  349. package/src/utils/__tests__/index.unit.test.ts +2 -2
  350. package/src/utils/audit/audit.ts +0 -3
  351. package/src/utils/core/cn.ts +1 -1
  352. package/src/utils/dynamic/dynamicUtils.ts +7 -4
  353. package/src/utils/file-reference/index.ts +53 -1
  354. package/src/utils/formatting/formatting.ts +8 -18
  355. package/src/utils/index.ts +0 -1
  356. package/dist/chunk-3QRJFVBR.js.map +0 -1
  357. package/dist/chunk-3XTALGJF.js.map +0 -1
  358. package/dist/chunk-4N5C5XZU.js.map +0 -1
  359. package/dist/chunk-4ZC4GX36.js.map +0 -1
  360. package/dist/chunk-7D4SUZUM.js +0 -38
  361. package/dist/chunk-BYFSK72L.js.map +0 -1
  362. package/dist/chunk-EXUD6RNJ.js +0 -451
  363. package/dist/chunk-EXUD6RNJ.js.map +0 -1
  364. package/dist/chunk-GLK6VM3F.js.map +0 -1
  365. package/dist/chunk-I7PSE6JW.js.map +0 -1
  366. package/dist/chunk-JBKQ3SAO.js.map +0 -1
  367. package/dist/chunk-KNC55RTG.js.map +0 -1
  368. package/dist/chunk-LXQLPRQ2.js.map +0 -1
  369. package/dist/chunk-R77UEZ4E.js.map +0 -1
  370. package/dist/chunk-SQGMNID3.js.map +0 -1
  371. package/dist/chunk-T33XF5ZC.js +0 -12922
  372. package/dist/chunk-T33XF5ZC.js.map +0 -1
  373. package/dist/chunk-XM25TVIE.js.map +0 -1
  374. package/docs/api/classes/ColumnFactory.md +0 -243
  375. package/docs/api/classes/ErrorBoundary.md +0 -144
  376. package/docs/api/classes/InvalidScopeError.md +0 -73
  377. package/docs/api/classes/Logger.md +0 -178
  378. package/docs/api/classes/MissingUserContextError.md +0 -66
  379. package/docs/api/classes/OrganisationContextRequiredError.md +0 -66
  380. package/docs/api/classes/PermissionDeniedError.md +0 -73
  381. package/docs/api/classes/RBACAuditManager.md +0 -297
  382. package/docs/api/classes/RBACCache.md +0 -322
  383. package/docs/api/classes/RBACEngine.md +0 -171
  384. package/docs/api/classes/RBACError.md +0 -76
  385. package/docs/api/classes/RBACNotInitializedError.md +0 -66
  386. package/docs/api/classes/SecureSupabaseClient.md +0 -160
  387. package/docs/api/classes/StorageUtils.md +0 -328
  388. package/docs/api/enums/FileCategory.md +0 -184
  389. package/docs/api/enums/LogLevel.md +0 -54
  390. package/docs/api/enums/RBACErrorCode.md +0 -228
  391. package/docs/api/enums/RPCFunction.md +0 -118
  392. package/docs/api/interfaces/AddressFieldProps.md +0 -241
  393. package/docs/api/interfaces/AddressFieldRef.md +0 -94
  394. package/docs/api/interfaces/AggregateConfig.md +0 -43
  395. package/docs/api/interfaces/AutocompleteOptions.md +0 -75
  396. package/docs/api/interfaces/AvatarProps.md +0 -128
  397. package/docs/api/interfaces/BadgeProps.md +0 -27
  398. package/docs/api/interfaces/ButtonProps.md +0 -53
  399. package/docs/api/interfaces/CalendarProps.md +0 -70
  400. package/docs/api/interfaces/CardProps.md +0 -66
  401. package/docs/api/interfaces/ColorPalette.md +0 -7
  402. package/docs/api/interfaces/ColorShade.md +0 -66
  403. package/docs/api/interfaces/ComplianceResult.md +0 -30
  404. package/docs/api/interfaces/DataAccessRecord.md +0 -96
  405. package/docs/api/interfaces/DataRecord.md +0 -11
  406. package/docs/api/interfaces/DataTableAction.md +0 -249
  407. package/docs/api/interfaces/DataTableColumn.md +0 -504
  408. package/docs/api/interfaces/DataTableProps.md +0 -625
  409. package/docs/api/interfaces/DataTableToolbarButton.md +0 -96
  410. package/docs/api/interfaces/DatabaseComplianceResult.md +0 -85
  411. package/docs/api/interfaces/DatabaseIssue.md +0 -41
  412. package/docs/api/interfaces/EmptyStateConfig.md +0 -61
  413. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +0 -235
  414. package/docs/api/interfaces/EventAppRoleData.md +0 -71
  415. package/docs/api/interfaces/ExportColumn.md +0 -90
  416. package/docs/api/interfaces/ExportOptions.md +0 -126
  417. package/docs/api/interfaces/FileDisplayProps.md +0 -249
  418. package/docs/api/interfaces/FileMetadata.md +0 -129
  419. package/docs/api/interfaces/FileReference.md +0 -118
  420. package/docs/api/interfaces/FileSizeLimits.md +0 -7
  421. package/docs/api/interfaces/FileUploadOptions.md +0 -139
  422. package/docs/api/interfaces/FileUploadProps.md +0 -293
  423. package/docs/api/interfaces/FooterProps.md +0 -105
  424. package/docs/api/interfaces/FormFieldProps.md +0 -166
  425. package/docs/api/interfaces/FormProps.md +0 -113
  426. package/docs/api/interfaces/GrantEventAppRoleParams.md +0 -122
  427. package/docs/api/interfaces/InactivityWarningModalProps.md +0 -115
  428. package/docs/api/interfaces/InputProps.md +0 -53
  429. package/docs/api/interfaces/LabelProps.md +0 -107
  430. package/docs/api/interfaces/LoggerConfig.md +0 -62
  431. package/docs/api/interfaces/LoginFormProps.md +0 -184
  432. package/docs/api/interfaces/NavigationAccessRecord.md +0 -107
  433. package/docs/api/interfaces/NavigationContextType.md +0 -164
  434. package/docs/api/interfaces/NavigationGuardProps.md +0 -139
  435. package/docs/api/interfaces/NavigationItem.md +0 -120
  436. package/docs/api/interfaces/NavigationMenuProps.md +0 -221
  437. package/docs/api/interfaces/NavigationProviderProps.md +0 -117
  438. package/docs/api/interfaces/Organisation.md +0 -140
  439. package/docs/api/interfaces/OrganisationContextType.md +0 -388
  440. package/docs/api/interfaces/OrganisationMembership.md +0 -140
  441. package/docs/api/interfaces/OrganisationProviderProps.md +0 -76
  442. package/docs/api/interfaces/OrganisationSecurityError.md +0 -62
  443. package/docs/api/interfaces/PaceAppLayoutProps.md +0 -406
  444. package/docs/api/interfaces/PaceLoginPageProps.md +0 -47
  445. package/docs/api/interfaces/PageAccessRecord.md +0 -85
  446. package/docs/api/interfaces/PagePermissionContextType.md +0 -140
  447. package/docs/api/interfaces/PagePermissionGuardProps.md +0 -153
  448. package/docs/api/interfaces/PagePermissionProviderProps.md +0 -119
  449. package/docs/api/interfaces/PaletteData.md +0 -41
  450. package/docs/api/interfaces/ParsedAddress.md +0 -120
  451. package/docs/api/interfaces/PermissionEnforcerProps.md +0 -153
  452. package/docs/api/interfaces/ProgressProps.md +0 -42
  453. package/docs/api/interfaces/ProtectedRouteProps.md +0 -97
  454. package/docs/api/interfaces/PublicPageFooterProps.md +0 -112
  455. package/docs/api/interfaces/PublicPageHeaderProps.md +0 -125
  456. package/docs/api/interfaces/PublicPageLayoutProps.md +0 -198
  457. package/docs/api/interfaces/QuickFix.md +0 -52
  458. package/docs/api/interfaces/RBACAccessValidateParams.md +0 -52
  459. package/docs/api/interfaces/RBACAccessValidateResult.md +0 -41
  460. package/docs/api/interfaces/RBACAuditLogParams.md +0 -85
  461. package/docs/api/interfaces/RBACAuditLogResult.md +0 -52
  462. package/docs/api/interfaces/RBACConfig.md +0 -133
  463. package/docs/api/interfaces/RBACContext.md +0 -52
  464. package/docs/api/interfaces/RBACLogger.md +0 -112
  465. package/docs/api/interfaces/RBACPageAccessCheckParams.md +0 -74
  466. package/docs/api/interfaces/RBACPerformanceMetrics.md +0 -138
  467. package/docs/api/interfaces/RBACPermissionCheckParams.md +0 -74
  468. package/docs/api/interfaces/RBACPermissionCheckResult.md +0 -52
  469. package/docs/api/interfaces/RBACPermissionsGetParams.md +0 -63
  470. package/docs/api/interfaces/RBACPermissionsGetResult.md +0 -63
  471. package/docs/api/interfaces/RBACResult.md +0 -58
  472. package/docs/api/interfaces/RBACRoleGrantParams.md +0 -63
  473. package/docs/api/interfaces/RBACRoleGrantResult.md +0 -52
  474. package/docs/api/interfaces/RBACRoleRevokeParams.md +0 -63
  475. package/docs/api/interfaces/RBACRoleRevokeResult.md +0 -52
  476. package/docs/api/interfaces/RBACRoleValidateParams.md +0 -52
  477. package/docs/api/interfaces/RBACRoleValidateResult.md +0 -63
  478. package/docs/api/interfaces/RBACRolesListParams.md +0 -52
  479. package/docs/api/interfaces/RBACRolesListResult.md +0 -74
  480. package/docs/api/interfaces/RBACSessionTrackParams.md +0 -74
  481. package/docs/api/interfaces/RBACSessionTrackResult.md +0 -52
  482. package/docs/api/interfaces/ResourcePermissions.md +0 -155
  483. package/docs/api/interfaces/RevokeEventAppRoleParams.md +0 -100
  484. package/docs/api/interfaces/RoleBasedRouterContextType.md +0 -151
  485. package/docs/api/interfaces/RoleBasedRouterProps.md +0 -156
  486. package/docs/api/interfaces/RoleManagementResult.md +0 -52
  487. package/docs/api/interfaces/RouteAccessRecord.md +0 -107
  488. package/docs/api/interfaces/RouteConfig.md +0 -134
  489. package/docs/api/interfaces/RuntimeComplianceResult.md +0 -55
  490. package/docs/api/interfaces/SecureDataContextType.md +0 -168
  491. package/docs/api/interfaces/SecureDataProviderProps.md +0 -132
  492. package/docs/api/interfaces/SessionRestorationLoaderProps.md +0 -34
  493. package/docs/api/interfaces/SetupIssue.md +0 -41
  494. package/docs/api/interfaces/StorageConfig.md +0 -41
  495. package/docs/api/interfaces/StorageFileInfo.md +0 -74
  496. package/docs/api/interfaces/StorageFileMetadata.md +0 -151
  497. package/docs/api/interfaces/StorageListOptions.md +0 -99
  498. package/docs/api/interfaces/StorageListResult.md +0 -41
  499. package/docs/api/interfaces/StorageUploadOptions.md +0 -101
  500. package/docs/api/interfaces/StorageUploadResult.md +0 -63
  501. package/docs/api/interfaces/StorageUrlOptions.md +0 -60
  502. package/docs/api/interfaces/StyleImport.md +0 -19
  503. package/docs/api/interfaces/SwitchProps.md +0 -34
  504. package/docs/api/interfaces/TabsContentProps.md +0 -9
  505. package/docs/api/interfaces/TabsListProps.md +0 -9
  506. package/docs/api/interfaces/TabsProps.md +0 -9
  507. package/docs/api/interfaces/TabsTriggerProps.md +0 -50
  508. package/docs/api/interfaces/TextareaProps.md +0 -53
  509. package/docs/api/interfaces/ToastActionElement.md +0 -9
  510. package/docs/api/interfaces/ToastProps.md +0 -9
  511. package/docs/api/interfaces/UnifiedAuthContextType.md +0 -820
  512. package/docs/api/interfaces/UnifiedAuthProviderProps.md +0 -171
  513. package/docs/api/interfaces/UseFormDialogOptions.md +0 -62
  514. package/docs/api/interfaces/UseFormDialogReturn.md +0 -117
  515. package/docs/api/interfaces/UseInactivityTrackerOptions.md +0 -136
  516. package/docs/api/interfaces/UseInactivityTrackerReturn.md +0 -123
  517. package/docs/api/interfaces/UsePublicEventLogoOptions.md +0 -87
  518. package/docs/api/interfaces/UsePublicEventLogoReturn.md +0 -81
  519. package/docs/api/interfaces/UsePublicEventOptions.md +0 -34
  520. package/docs/api/interfaces/UsePublicEventReturn.md +0 -68
  521. package/docs/api/interfaces/UsePublicFileDisplayOptions.md +0 -47
  522. package/docs/api/interfaces/UsePublicFileDisplayReturn.md +0 -120
  523. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +0 -94
  524. package/docs/api/interfaces/UseResolvedScopeOptions.md +0 -47
  525. package/docs/api/interfaces/UseResolvedScopeReturn.md +0 -47
  526. package/docs/api/interfaces/UseResourcePermissionsOptions.md +0 -34
  527. package/docs/api/interfaces/UserEventAccess.md +0 -118
  528. package/docs/api/interfaces/UserMenuProps.md +0 -86
  529. package/docs/api/interfaces/UserProfile.md +0 -63
  530. package/docs/migration/quick-migration-guide.md +0 -356
  531. package/docs/migration/service-architecture.md +0 -281
  532. package/src/components/EventSelector/EventSelector.test.tsx +0 -720
  533. package/src/components/EventSelector/EventSelector.tsx +0 -420
  534. package/src/components/EventSelector/index.ts +0 -3
  535. package/src/components/OrganisationSelector/OrganisationSelector.test.tsx +0 -784
  536. package/src/components/OrganisationSelector/OrganisationSelector.tsx +0 -324
  537. package/src/components/OrganisationSelector/index.ts +0 -9
  538. package/src/hooks/__tests__/useSecureDataAccess.unit.test.tsx +0 -680
  539. package/src/hooks/useSecureDataAccess.test.ts +0 -559
  540. package/src/hooks/useSecureDataAccess.ts +0 -681
  541. /package/dist/{DataTable-DQ7RSOHE.js.map → DataTable-THFPBKTP.js.map} +0 -0
  542. /package/dist/{UnifiedAuthProvider-ATAP5UTR.js.map → UnifiedAuthProvider-KAGUYQ4J.js.map} +0 -0
  543. /package/dist/{api-N774RPUA.js.map → api-IAGWF3ZG.js.map} +0 -0
  544. /package/dist/{audit-B5P6FFIR.js.map → audit-V53FV5AG.js.map} +0 -0
  545. /package/dist/{chunk-7D4SUZUM.js.map → chunk-DGUM43GV.js.map} +0 -0
  546. /package/docs/migration/{organisation-context-timing-fix.md → V0.3.44_organisation-context-timing-fix.md} +0 -0
  547. /package/docs/migration/{rbac-migration.md → V0.4.0_rbac-migration.md} +0 -0
  548. /package/docs/migration/{person-scoped-profiles-migration-guide.md → V0.5.190_person-scoped-profiles-migration-guide.md} +0 -0
  549. /package/docs/migration/{REACT_19_MIGRATION.md → V0.6.0_REACT_19_MIGRATION.md} +0 -0
@@ -1,31 +1,12 @@
1
- import { U as UUID, g as PermissionCacheKey, h as AuditEventSource, i as RBACAuditEvent, a as PermissionCheck, S as Scope, A as AccessLevel, b as PermissionMap, j as RBACAppContext, k as RBACRoleContext, P as Permission, l as UserRBACContext } from '../types-UU913iLA.js';
2
- export { E as EventAppRole, G as GlobalRole, I as InvalidScopeError, M as MissingUserContextError, O as Operation, e as OrganisationContextRequiredError, c as OrganisationRole, d as PermissionDeniedError, R as RBACError, f as RBACNotInitializedError } from '../types-UU913iLA.js';
3
- export { A as AccessLevelContext, s as AuditEventType, P as PermissionSource, d as RBACAccessValidateParams, e as RBACAccessValidateResult, q as RBACAuditLogParams, r as RBACAuditLogResult, t as RBACContext, w as RBACErrorCode, v as RBACFunctionResponse, f as RBACPageAccessCheckParams, R as RBACPermissionCheckParams, a as RBACPermissionCheckResult, b as RBACPermissionsGetParams, c as RBACPermissionsGetResult, u as RBACResult, g as RBACRoleGrantParams, h as RBACRoleGrantResult, i as RBACRoleRevokeParams, j as RBACRoleRevokeResult, m as RBACRoleValidateParams, n as RBACRoleValidateResult, k as RBACRolesListParams, l as RBACRolesListResult, o as RBACSessionTrackParams, p as RBACSessionTrackResult, x as RPCFunction, S as SessionType } from '../functions-D_kgHktt.js';
1
+ import { U as UUID, g as PermissionCacheKey, h as AuditEventSource, i as RBACAuditEvent, a as PermissionCheck, S as Scope, A as AccessLevel, b as PermissionMap, j as RBACAppContext, k as RBACRoleContext, P as Permission, l as UserRBACContext } from '../types-BeoeWV5I.js';
2
+ export { E as EventAppRole, G as GlobalRole, I as InvalidScopeError, M as MissingUserContextError, O as Operation, e as OrganisationContextRequiredError, c as OrganisationRole, d as PermissionDeniedError, R as RBACError, f as RBACNotInitializedError } from '../types-BeoeWV5I.js';
3
+ export { A as AccessLevelContext, s as AuditEventType, P as PermissionSource, d as RBACAccessValidateParams, e as RBACAccessValidateResult, q as RBACAuditLogParams, r as RBACAuditLogResult, t as RBACContext, w as RBACErrorCode, v as RBACFunctionResponse, f as RBACPageAccessCheckParams, R as RBACPermissionCheckParams, a as RBACPermissionCheckResult, b as RBACPermissionsGetParams, c as RBACPermissionsGetResult, u as RBACResult, g as RBACRoleGrantParams, h as RBACRoleGrantResult, i as RBACRoleRevokeParams, j as RBACRoleRevokeResult, m as RBACRoleValidateParams, n as RBACRoleValidateResult, k as RBACRolesListParams, l as RBACRolesListResult, o as RBACSessionTrackParams, p as RBACSessionTrackResult, x as RPCFunction, S as SessionType } from '../functions-DHebl8-F.js';
4
4
  import { SupabaseClient } from '@supabase/supabase-js';
5
5
  import { D as Database } from '../database.generated-CzIvgcPu.js';
6
6
  import * as react_jsx_runtime from 'react/jsx-runtime';
7
7
  import React__default, { ReactNode } from 'react';
8
8
  import '../core-CUElvH_C.js';
9
9
 
10
- /**
11
- * Context Validator for RBAC
12
- * @package @jmruthers/pace-core
13
- * @module RBAC/ContextValidator
14
- * @since 1.0.0
15
- *
16
- * Centralized validation for RBAC context requirements based on app configuration.
17
- * Enforces app-specific context rules with single primary context:
18
- * - requires_event = TRUE: Event is PRIMARY context, org derived from event (org not required in input)
19
- * - requires_event = FALSE: Organisation is PRIMARY context, event optional
20
- * - PORTAL/ADMIN apps: Both contexts optional (allows users to view/edit own profiles, super admin access)
21
- *
22
- * Key principle: Only one primary context is required based on app config. The other is derived or optional.
23
- */
24
-
25
- interface AppConfig {
26
- requires_event: boolean;
27
- }
28
-
29
10
  /**
30
11
  * RBAC Security Enhancements
31
12
  * @package @jmruthers/pace-core
@@ -122,8 +103,10 @@ declare function isDevelopmentMode(): boolean;
122
103
  * This client automatically injects organisation context into all requests
123
104
  * and prevents queries that don't have the required context.
124
105
  *
125
- * Note: Callers should derive organisationId from eventId before creating this client
126
- * if working with event-required apps. The client requires organisationId.
106
+ * Note: For non-super-admins, organisationId is required. Super-admins can operate
107
+ * without organisationId to access system-wide tables (like core_organisations).
108
+ * Callers should derive organisationId from eventId before creating this client
109
+ * if working with event-required apps.
127
110
  */
128
111
  declare class SecureSupabaseClient {
129
112
  private supabase;
@@ -134,7 +117,20 @@ declare class SecureSupabaseClient {
134
117
  private eventId?;
135
118
  private appId?;
136
119
  private isSuperAdmin;
137
- constructor(supabaseUrl: string, supabaseKey: string, organisationId: UUID, eventId?: string, appId?: UUID, isSuperAdmin?: boolean);
120
+ private usesExistingClient;
121
+ private static rpcSignatureCache;
122
+ /**
123
+ * RPC functions that are safe to call without organisation context.
124
+ *
125
+ * These functions must:
126
+ * - rely on JWT context (auth.uid()) for authentication
127
+ * - not read or write organisation-scoped data
128
+ *
129
+ * This allowlist enables compliant consuming apps to use `secureSupabase.rpc(...)`
130
+ * even before an organisation is selected (common during initial page load/refresh).
131
+ */
132
+ private static readonly GLOBAL_RPC_ALLOWLIST;
133
+ constructor(supabaseUrl: string, supabaseKey: string, organisationId: UUID | null, eventId?: string, appId?: UUID, isSuperAdmin?: boolean, existingClient?: SupabaseClient<Database>);
138
134
  /**
139
135
  * Setup context injection for all database operations
140
136
  */
@@ -170,18 +166,36 @@ declare class SecureSupabaseClient {
170
166
  * - Super admins: No org filter (see all users) - RLS will allow access
171
167
  * - Non-super-admins: Apply org filter as defense in depth - RLS will also filter
172
168
  *
169
+ * For system-wide tables (like core_organisations):
170
+ * - Super admins: No org filter (see all records) - RLS will allow access
171
+ * - Non-super-admins: Apply org filter as defense in depth - RLS will also filter
172
+ *
173
173
  * For other tables:
174
174
  * - Always apply org filter unless super admin bypasses it
175
175
  */
176
176
  private addOrganisationFilter;
177
177
  /**
178
178
  * Validate that required context is present
179
+ * Super-admins can operate without organisation context
179
180
  */
180
181
  private validateContext;
182
+ /**
183
+ * Determine whether a table requires organisation context.
184
+ * Tables without an organisation_id column (or global configuration tables) are safe without org context.
185
+ */
186
+ private tableRequiresOrganisationContext;
187
+ /**
188
+ * Validate context for a specific table operation.
189
+ */
190
+ private validateContextForTable;
191
+ /**
192
+ * Validate context for a specific RPC call.
193
+ */
194
+ private validateContextForRpc;
181
195
  /**
182
196
  * Get the current organisation ID
183
197
  */
184
- getOrganisationId(): UUID;
198
+ getOrganisationId(): UUID | null;
185
199
  /**
186
200
  * Get the current event ID
187
201
  */
@@ -194,7 +208,7 @@ declare class SecureSupabaseClient {
194
208
  * Create a new client with updated context
195
209
  */
196
210
  withContext(updates: {
197
- organisationId?: UUID;
211
+ organisationId?: UUID | null;
198
212
  eventId?: string;
199
213
  appId?: UUID;
200
214
  isSuperAdmin?: boolean;
@@ -204,16 +218,28 @@ declare class SecureSupabaseClient {
204
218
  * @internal
205
219
  */
206
220
  getClient(): SupabaseClient<Database>;
221
+ /**
222
+ * Get the set of parameter names that an RPC function accepts.
223
+ * Uses a static whitelist of RPCs that we know accept context parameters.
224
+ *
225
+ * This is an opt-in approach: by default, we don't inject context unless
226
+ * the function is explicitly whitelisted. This prevents PGRST202 errors from
227
+ * injecting unexpected parameters.
228
+ *
229
+ * @param fn - The RPC function name
230
+ * @returns Set of parameter names the function accepts
231
+ */
232
+ private getRpcAcceptedParams;
207
233
  }
208
234
  /**
209
235
  * Create a secure Supabase client with organisation context
210
236
  *
211
237
  * @param supabaseUrl - Supabase project URL
212
238
  * @param supabaseKey - Supabase publishable key or anon key (accepts both legacy anon keys and modern publishable keys)
213
- * @param organisationId - Required organisation ID
239
+ * @param organisationId - Organisation ID (optional for super-admins)
214
240
  * @param eventId - Optional event ID
215
241
  * @param appId - Optional app ID
216
- * @param isSuperAdmin - Optional super admin flag (defaults to false)
242
+ * @param isSuperAdmin - Optional super admin flag (defaults to false). When true, organisationId can be null.
217
243
  * @returns SecureSupabaseClient instance
218
244
  *
219
245
  * @example
@@ -226,9 +252,19 @@ declare class SecureSupabaseClient {
226
252
  * 'app-789',
227
253
  * false // isSuperAdmin
228
254
  * );
255
+ *
256
+ * // For super-admins, organisationId can be null
257
+ * const superAdminClient = createSecureClient(
258
+ * 'https://your-project.supabase.co',
259
+ * 'your-publishable-key-or-anon-key',
260
+ * null, // organisationId not required for super-admins
261
+ * undefined,
262
+ * undefined,
263
+ * true // isSuperAdmin
264
+ * );
229
265
  * ```
230
266
  */
231
- declare function createSecureClient(supabaseUrl: string, supabaseKey: string, organisationId: UUID, eventId?: string, appId?: UUID, isSuperAdmin?: boolean): SecureSupabaseClient;
267
+ declare function createSecureClient(supabaseUrl: string, supabaseKey: string, organisationId: UUID | null, eventId?: string, appId?: UUID, isSuperAdmin?: boolean): SecureSupabaseClient;
232
268
  /**
233
269
  * Create a secure client from an existing Supabase client
234
270
  *
@@ -238,7 +274,54 @@ declare function createSecureClient(supabaseUrl: string, supabaseKey: string, or
238
274
  * @param appId - Optional app ID
239
275
  * @returns SecureSupabaseClient instance
240
276
  */
241
- declare function fromSupabaseClient(client: SupabaseClient<Database>, organisationId: UUID, eventId?: string, appId?: UUID): SecureSupabaseClient;
277
+ declare function fromSupabaseClient(client: SupabaseClient<Database>, organisationId: UUID | null, eventId?: string, appId?: UUID, isSuperAdmin?: boolean): SecureSupabaseClient;
278
+
279
+ /**
280
+ * Client Security Detection Utilities
281
+ * @package @jmruthers/pace-core
282
+ * @module RBAC/Utils/ClientSecurity
283
+ * @since 1.0.0
284
+ *
285
+ * Utilities to detect and warn about insecure Supabase client usage.
286
+ */
287
+
288
+ /**
289
+ * Symbol to mark secure clients
290
+ * This is attached to clients created by SecureSupabaseClient
291
+ */
292
+ declare const SECURE_CLIENT_SYMBOL: unique symbol;
293
+ /**
294
+ * Check if a Supabase client is a secure client (created via useSecureSupabase or createSecureClient)
295
+ *
296
+ * @param client - The Supabase client to check
297
+ * @returns true if the client is secure, false otherwise
298
+ *
299
+ * @example
300
+ * ```tsx
301
+ * import { isSecureClient } from '@jmruthers/pace-core/rbac/utils/clientSecurity';
302
+ *
303
+ * const supabase = useSecureSupabase();
304
+ * if (isSecureClient(supabase)) {
305
+ * // Client is secure, safe to use
306
+ * }
307
+ * ```
308
+ */
309
+ declare function isSecureClient(client: SupabaseClient<Database> | null | undefined): boolean;
310
+ /**
311
+ * Warn about insecure client usage in development
312
+ *
313
+ * @param client - The client being used
314
+ * @param context - Context about where the client is being used (for better error messages)
315
+ *
316
+ * @example
317
+ * ```tsx
318
+ * import { warnIfInsecureClient } from '@jmruthers/pace-core/rbac/utils/clientSecurity';
319
+ *
320
+ * const supabase = createClient(...); // Wrong!
321
+ * warnIfInsecureClient(supabase, 'MyComponent');
322
+ * ```
323
+ */
324
+ declare function warnIfInsecureClient(client: SupabaseClient<Database> | null | undefined, context?: string): void;
242
325
 
243
326
  /**
244
327
  * RBAC Cache Implementation
@@ -1376,126 +1459,118 @@ interface ResourcePermissions {
1376
1459
  declare function useResourcePermissions(resource: string, options?: UseResourcePermissionsOptions): ResourcePermissions;
1377
1460
 
1378
1461
  /**
1379
- * @file RBAC Permission Hooks
1380
- * @package @jmruthers/pace-core
1381
- * @module RBAC/Hooks
1382
- * @since 1.0.0
1383
- *
1384
- * This module provides React hooks for RBAC functionality.
1385
- */
1386
-
1387
- /**
1388
- * Hook to get user's permissions in a scope
1462
+ * Hook to get user's access level in a scope
1389
1463
  *
1390
1464
  * @param userId - User ID
1391
- * @param organisationId - Organisation ID
1392
- * @param eventId - Event ID (optional)
1393
- * @param appId - Application ID (optional)
1394
- * @returns Permission state and methods
1465
+ * @param scope - Scope for access level checking
1466
+ * @returns Access level state and methods
1395
1467
  *
1396
1468
  * @example
1397
1469
  * ```tsx
1398
1470
  * function MyComponent() {
1399
- * const { permissions, isLoading, error } = usePermissions(
1400
- * userId,
1401
- * organisationId,
1402
- * eventId,
1403
- * appId
1404
- * );
1471
+ * const { accessLevel, isLoading, error } = useAccessLevel(userId, scope);
1405
1472
  *
1406
- * if (isLoading) return <div>Loading...</div>;
1473
+ * if (isLoading) return <div>Loading access level...</div>;
1407
1474
  * if (error) return <div>Error: {error.message}</div>;
1408
1475
  *
1409
1476
  * return (
1410
1477
  * <div>
1411
- * {permissions['read:users'] && <UserList />}
1412
- * {permissions['create:users'] && <CreateUserButton />}
1478
+ * Access Level: {accessLevel}
1479
+ * {accessLevel >= AccessLevel.ADMIN && <AdminPanel />}
1413
1480
  * </div>
1414
1481
  * );
1415
1482
  * }
1416
1483
  * ```
1417
1484
  */
1418
- declare function usePermissions(userId: UUID, organisationId: string | undefined, eventId: string | undefined, appId: string | undefined): {
1419
- permissions: PermissionMap;
1485
+ declare function useAccessLevel(userId: UUID, scope: Scope): {
1486
+ accessLevel: AccessLevel;
1420
1487
  isLoading: boolean;
1421
1488
  error: Error | null;
1422
- hasPermission: (permission: Permission) => boolean;
1423
- hasAnyPermission: (permissionList: Permission[]) => boolean;
1424
- hasAllPermissions: (permissionList: Permission[]) => boolean;
1425
1489
  refetch: () => Promise<void>;
1426
1490
  };
1491
+
1427
1492
  /**
1428
- * Hook to check if user can perform an action
1493
+ * Hook to get cached permissions with TTL management
1429
1494
  *
1430
1495
  * @param userId - User ID
1431
1496
  * @param scope - Scope for permission checking
1432
- * @param permission - Permission to check
1433
- * @param pageId - Optional page ID
1434
- * @param useCache - Whether to use cached results
1435
- * @param appName - Optional app name (for PORTAL/ADMIN special case)
1436
- * @returns Permission check state and methods
1497
+ * @returns Cached permission state and methods
1437
1498
  *
1438
1499
  * @example
1439
1500
  * ```tsx
1440
1501
  * function MyComponent() {
1441
- * const { can, isLoading, error } = useCan(userId, scope, 'read:users');
1502
+ * const { permissions, isLoading, error, invalidateCache } = useCachedPermissions(userId, scope);
1442
1503
  *
1443
- * if (isLoading) return <div>Checking permission...</div>;
1504
+ * if (isLoading) return <div>Loading cached permissions...</div>;
1444
1505
  * if (error) return <div>Error: {error.message}</div>;
1445
1506
  *
1446
- * return can ? <UserList /> : <div>Access denied</div>;
1507
+ * return (
1508
+ * <div>
1509
+ * {permissions['read:users'] && <UserList />}
1510
+ * <button onClick={invalidateCache}>Refresh Permissions</button>
1511
+ * </div>
1512
+ * );
1447
1513
  * }
1448
1514
  * ```
1449
1515
  */
1450
- declare function useCan(userId: UUID, scope: Scope, permission: Permission, pageId?: UUID, useCache?: boolean, appName?: string): {
1451
- can: boolean;
1516
+ declare function useCachedPermissions(userId: UUID, scope: Scope): {
1517
+ permissions: PermissionMap;
1452
1518
  isLoading: boolean;
1453
1519
  error: Error | null;
1520
+ invalidateCache: () => void;
1454
1521
  refetch: () => Promise<void>;
1455
1522
  };
1523
+
1456
1524
  /**
1457
- * Hook to get user's access level in a scope
1525
+ * Hook to check if user can perform an action
1458
1526
  *
1459
1527
  * @param userId - User ID
1460
- * @param scope - Scope for access level checking
1461
- * @returns Access level state and methods
1528
+ * @param scope - Scope for permission checking
1529
+ * @param permission - Permission to check
1530
+ * @param pageId - Optional page ID
1531
+ * @param useCache - Whether to use cached results
1532
+ * @param appName - Optional app name (for PORTAL/ADMIN special case)
1533
+ * @returns Permission check state and methods
1462
1534
  *
1463
1535
  * @example
1464
1536
  * ```tsx
1465
1537
  * function MyComponent() {
1466
- * const { accessLevel, isLoading, error } = useAccessLevel(userId, scope);
1538
+ * const { can, isLoading, error } = useCan(userId, scope, 'read:users');
1467
1539
  *
1468
- * if (isLoading) return <div>Loading access level...</div>;
1540
+ * if (isLoading) return <div>Checking permission...</div>;
1469
1541
  * if (error) return <div>Error: {error.message}</div>;
1470
1542
  *
1471
- * return (
1472
- * <div>
1473
- * Access Level: {accessLevel}
1474
- * {accessLevel >= AccessLevel.ADMIN && <AdminPanel />}
1475
- * </div>
1476
- * );
1543
+ * return can ? <UserList /> : <div>Access denied</div>;
1477
1544
  * }
1478
1545
  * ```
1479
1546
  */
1480
- declare function useAccessLevel(userId: UUID, scope: Scope): {
1481
- accessLevel: AccessLevel;
1547
+ declare function useCan(userId: UUID, scope: Scope, permission: Permission, pageId?: UUID, useCache?: boolean,
1548
+ /**
1549
+ * Pre-computed super admin flag to avoid duplicate super admin checks.
1550
+ * Callers should check super admin once and pass the result to all useCan hooks.
1551
+ * Pass null if not checked yet, false/true if checked.
1552
+ * Defaults to null (not checked yet) - hook will check if needed.
1553
+ */
1554
+ precomputedSuperAdmin?: boolean | null, appName?: string): {
1555
+ can: boolean;
1482
1556
  isLoading: boolean;
1483
1557
  error: Error | null;
1484
1558
  refetch: () => Promise<void>;
1485
1559
  };
1560
+
1486
1561
  /**
1487
- * Hook to check multiple permissions at once
1562
+ * Hook to check if user has all of the specified permissions
1488
1563
  *
1489
1564
  * @param userId - User ID
1490
1565
  * @param scope - Scope for permission checking
1491
1566
  * @param permissions - Array of permissions to check
1492
1567
  * @param useCache - Whether to use cached results
1493
- * @returns Multiple permission check results
1568
+ * @returns Whether user has all of the permissions
1494
1569
  *
1495
1570
  * @example
1496
1571
  * ```tsx
1497
1572
  * function MyComponent() {
1498
- * const { results, isLoading, error } = useMultiplePermissions(
1573
+ * const { hasAll, isLoading, error } = useHasAllPermissions(
1499
1574
  * userId,
1500
1575
  * scope,
1501
1576
  * ['read:users', 'create:users', 'update:users']
@@ -1504,22 +1579,17 @@ declare function useAccessLevel(userId: UUID, scope: Scope): {
1504
1579
  * if (isLoading) return <div>Checking permissions...</div>;
1505
1580
  * if (error) return <div>Error: {error.message}</div>;
1506
1581
  *
1507
- * return (
1508
- * <div>
1509
- * {results['read:users'] && <UserList />}
1510
- * {results['create:users'] && <CreateUserButton />}
1511
- * {results['update:users'] && <EditUserButton />}
1512
- * </div>
1513
- * );
1582
+ * return hasAll ? <FullUserManagementPanel /> : <div>Insufficient permissions</div>;
1514
1583
  * }
1515
1584
  * ```
1516
1585
  */
1517
- declare function useMultiplePermissions(userId: UUID, scope: Scope, permissions: Permission[], useCache?: boolean): {
1518
- results: Record<Permission, boolean>;
1586
+ declare function useHasAllPermissions(userId: UUID, scope: Scope, permissions: Permission[], useCache?: boolean): {
1587
+ hasAll: boolean;
1519
1588
  isLoading: boolean;
1520
1589
  error: Error | null;
1521
1590
  refetch: () => Promise<void>;
1522
1591
  };
1592
+
1523
1593
  /**
1524
1594
  * Hook to check if user has any of the specified permissions
1525
1595
  *
@@ -1551,19 +1621,20 @@ declare function useHasAnyPermission(userId: UUID, scope: Scope, permissions: Pe
1551
1621
  error: Error | null;
1552
1622
  refetch: () => Promise<void>;
1553
1623
  };
1624
+
1554
1625
  /**
1555
- * Hook to check if user has all of the specified permissions
1626
+ * Hook to check multiple permissions at once
1556
1627
  *
1557
1628
  * @param userId - User ID
1558
1629
  * @param scope - Scope for permission checking
1559
1630
  * @param permissions - Array of permissions to check
1560
1631
  * @param useCache - Whether to use cached results
1561
- * @returns Whether user has all of the permissions
1632
+ * @returns Multiple permission check results
1562
1633
  *
1563
1634
  * @example
1564
1635
  * ```tsx
1565
1636
  * function MyComponent() {
1566
- * const { hasAll, isLoading, error } = useHasAllPermissions(
1637
+ * const { results, isLoading, error } = useMultiplePermissions(
1567
1638
  * userId,
1568
1639
  * scope,
1569
1640
  * ['read:users', 'create:users', 'update:users']
@@ -1572,45 +1643,61 @@ declare function useHasAnyPermission(userId: UUID, scope: Scope, permissions: Pe
1572
1643
  * if (isLoading) return <div>Checking permissions...</div>;
1573
1644
  * if (error) return <div>Error: {error.message}</div>;
1574
1645
  *
1575
- * return hasAll ? <FullUserManagementPanel /> : <div>Insufficient permissions</div>;
1646
+ * return (
1647
+ * <div>
1648
+ * {results['read:users'] && <UserList />}
1649
+ * {results['create:users'] && <CreateUserButton />}
1650
+ * {results['update:users'] && <EditUserButton />}
1651
+ * </div>
1652
+ * );
1576
1653
  * }
1577
1654
  * ```
1578
1655
  */
1579
- declare function useHasAllPermissions(userId: UUID, scope: Scope, permissions: Permission[], useCache?: boolean): {
1580
- hasAll: boolean;
1656
+ declare function useMultiplePermissions(userId: UUID, scope: Scope, permissions: Permission[], useCache?: boolean): {
1657
+ results: Record<Permission, boolean>;
1581
1658
  isLoading: boolean;
1582
1659
  error: Error | null;
1583
1660
  refetch: () => Promise<void>;
1584
1661
  };
1662
+
1585
1663
  /**
1586
- * Hook to get cached permissions with TTL management
1664
+ * Hook to get user's permissions in a scope
1587
1665
  *
1588
1666
  * @param userId - User ID
1589
- * @param scope - Scope for permission checking
1590
- * @returns Cached permission state and methods
1667
+ * @param organisationId - Organisation ID
1668
+ * @param eventId - Event ID (optional)
1669
+ * @param appId - Application ID (optional)
1670
+ * @returns Permission state and methods
1591
1671
  *
1592
1672
  * @example
1593
1673
  * ```tsx
1594
1674
  * function MyComponent() {
1595
- * const { permissions, isLoading, error, invalidateCache } = useCachedPermissions(userId, scope);
1675
+ * const { permissions, isLoading, error } = usePermissions(
1676
+ * userId,
1677
+ * organisationId,
1678
+ * eventId,
1679
+ * appId
1680
+ * );
1596
1681
  *
1597
- * if (isLoading) return <div>Loading cached permissions...</div>;
1682
+ * if (isLoading) return <div>Loading...</div>;
1598
1683
  * if (error) return <div>Error: {error.message}</div>;
1599
1684
  *
1600
1685
  * return (
1601
1686
  * <div>
1602
1687
  * {permissions['read:users'] && <UserList />}
1603
- * <button onClick={invalidateCache}>Refresh Permissions</button>
1688
+ * {permissions['create:users'] && <CreateUserButton />}
1604
1689
  * </div>
1605
1690
  * );
1606
1691
  * }
1607
1692
  * ```
1608
1693
  */
1609
- declare function useCachedPermissions(userId: UUID, scope: Scope): {
1694
+ declare function usePermissions(userId: UUID, organisationId: string | undefined, eventId: string | undefined, appId: string | undefined): {
1610
1695
  permissions: PermissionMap;
1611
1696
  isLoading: boolean;
1612
1697
  error: Error | null;
1613
- invalidateCache: () => void;
1698
+ hasPermission: (permission: Permission) => boolean;
1699
+ hasAnyPermission: (permissionList: Permission[]) => boolean;
1700
+ hasAllPermissions: (permissionList: Permission[]) => boolean;
1614
1701
  refetch: () => Promise<void>;
1615
1702
  };
1616
1703
 
@@ -2187,7 +2274,7 @@ declare function setupRBAC(supabase: SupabaseClient<Database>, config?: Partial<
2187
2274
  declare function getAccessLevel(input: {
2188
2275
  userId: UUID;
2189
2276
  scope: Scope;
2190
- }, appConfig?: AppConfig | null, appName?: string): Promise<AccessLevel>;
2277
+ }, appName?: string): Promise<AccessLevel>;
2191
2278
  /**
2192
2279
  * Get user's permission map for a scope
2193
2280
  *
@@ -2211,7 +2298,7 @@ declare function getAccessLevel(input: {
2211
2298
  declare function getPermissionMap(input: {
2212
2299
  userId: UUID;
2213
2300
  scope: Scope;
2214
- }, appConfig?: AppConfig | null, appName?: string): Promise<PermissionMap>;
2301
+ }, appName?: string): Promise<PermissionMap>;
2215
2302
  declare function resolveAppContext(input: {
2216
2303
  userId: UUID;
2217
2304
  appName: string;
@@ -2219,7 +2306,7 @@ declare function resolveAppContext(input: {
2219
2306
  declare function getRoleContext(input: {
2220
2307
  userId: UUID;
2221
2308
  scope: Scope;
2222
- }, appConfig?: AppConfig | null, appName?: string): Promise<RBACRoleContext>;
2309
+ }, appName?: string): Promise<RBACRoleContext>;
2223
2310
  /**
2224
2311
  * Check if user has a specific permission
2225
2312
  *
@@ -2238,7 +2325,14 @@ declare function getRoleContext(input: {
2238
2325
  * });
2239
2326
  * ```
2240
2327
  */
2241
- declare function isPermitted(input: PermissionCheck, appConfig?: AppConfig | null, appName?: string): Promise<boolean>;
2328
+ declare function isPermitted(input: PermissionCheck, appName?: string,
2329
+ /**
2330
+ * Pre-computed super admin status to avoid duplicate checks.
2331
+ * Pass null if not checked yet (will check), true if already checked and is super admin,
2332
+ * or false if already checked and is not super admin.
2333
+ * @default null
2334
+ */
2335
+ precomputedSuperAdmin?: boolean | null): Promise<boolean>;
2242
2336
  /**
2243
2337
  * Check if user has a specific permission (cached version)
2244
2338
  *
@@ -2246,11 +2340,10 @@ declare function isPermitted(input: PermissionCheck, appConfig?: AppConfig | nul
2246
2340
  * and checks cache before making new requests. Uses session cache for page-level checks.
2247
2341
  *
2248
2342
  * @param input - Permission check input
2249
- * @param appConfig - Optional app configuration
2250
- * @param appName - Optional app name
2343
+ * @param appName - Optional app name (for PORTAL/ADMIN special case)
2251
2344
  * @returns Promise resolving to permission result
2252
2345
  */
2253
- declare function isPermittedCached(input: PermissionCheck, appConfig?: AppConfig | null, appName?: string): Promise<boolean>;
2346
+ declare function isPermittedCached(input: PermissionCheck, appName?: string): Promise<boolean>;
2254
2347
  /**
2255
2348
  * Check if a user has a specific permission (alias for isPermitted)
2256
2349
  *
@@ -2375,28 +2468,6 @@ declare const PAGE_PERMISSIONS: {
2375
2468
  * @returns True if valid, false otherwise
2376
2469
  */
2377
2470
  declare function isValidPermission(permission: string): permission is Permission;
2378
- /**
2379
- * Get all permissions for a role - REMOVED
2380
- *
2381
- * @deprecated This function has been removed to ensure RBAC compliance.
2382
- * Permissions must be queried from the rbac_page_permissions database table,
2383
- * not hardcoded in application code. This allows organizations to customize
2384
- * their own page-level permissions as required by the RBAC specification.
2385
- *
2386
- * To get permissions for a role, query the database:
2387
- * ```typescript
2388
- * const { data } = await supabase
2389
- * .from('rbac_page_permissions')
2390
- * .select('operation, allowed')
2391
- * .eq('role_name', roleName)
2392
- * .eq('organisation_id', organisationId)
2393
- * .eq('allowed', true);
2394
- * ```
2395
- *
2396
- * @param role - Role name
2397
- * @returns Empty array (function deprecated)
2398
- */
2399
- declare function getPermissionsForRole(role: string): Permission[];
2400
2471
  declare const ALL_PERMISSIONS: {
2401
2472
  readonly READ_PAGE: Permission;
2402
2473
  readonly CREATE_PAGE: Permission;
@@ -2609,4 +2680,4 @@ declare function getDirectSupabaseAuthFixes(): QuickFix;
2609
2680
  */
2610
2681
  declare function getQuickFixes(issueType: string, details?: Record<string, any>): QuickFix[];
2611
2682
 
2612
- export { ALL_PERMISSIONS, AccessLevel, AccessLevelGuard, type AllPermissions, CACHE_PATTERNS, type ComplianceResult, type DataAccessRecord, type DatabaseComplianceResult, type DatabaseIssue, EVENT_APP_PERMISSIONS, EnhancedNavigationMenu, type EnhancedNavigationMenuProps, type EventAppRoleData, GLOBAL_PERMISSIONS, type GrantEventAppRoleParams, type LogLevel, type NavigationAccessRecord, type NavigationContextType, NavigationGuard, type NavigationGuardProps, type NavigationItem, NavigationProvider, type NavigationProviderProps, ORGANISATION_PERMISSIONS, PAGE_PERMISSIONS, type PageAccessRecord, type PagePermissionContextType, PagePermissionGuard, type PagePermissionGuardProps, PagePermissionProvider, type PagePermissionProviderProps, Permission, PermissionCheck, PermissionEnforcer, type PermissionEnforcerProps, PermissionGuard, PermissionMap, type QuickFix, RBACAuditManager, RBACCache, type RBACConfig, RBACEngine, type RBACLogger, type RBACPerformanceMetrics, type ResourcePermissions, type RevokeEventAppRoleParams, RoleBasedRouter, type RoleBasedRouterContextType, type RoleBasedRouterProps, type RoleManagementResult, type RouteAccessRecord, type RouteConfig, type RuntimeComplianceResult, Scope, type SecureDataContextType, SecureDataProvider, type SecureDataProviderProps, SecureSupabaseClient, type SetupIssue, UUID, type UseResolvedScopeOptions, type UseResolvedScopeReturn, type UseResourcePermissionsOptions, checkRuntimeCompliance, clearInFlightRequests, createAuditManager, createRBACConfig, createRBACEngine, createRBACExpressMiddleware, createRBACMiddleware, createSecureClient, disablePerformanceMonitoring, emitAuditEvent, enablePerformanceMonitoring, fromSupabaseClient, getAccessLevel, getCustomAuthCodeFixes, getDirectSupabaseAuthFixes, getDuplicateConfigFixes, getGlobalAuditManager, getInFlightRequestCount, getPerformanceMetrics, getPerformanceSummary, getPermissionMap, getPermissionsForRole, getQuickFixes, getRBACConfig, getRBACLogger, getRoleContext, getSetupIssues, getUnprotectedPageFixes, hasAllPermissions, hasAnyPermission, hasAnyPermissionCached, hasPermission, hasPermissionCached, isDebugMode, isDevelopmentMode, isPerformanceMonitoringEnabled, isPermitted, isPermittedCached, isRBACInitialized, isValidPermission, rbacCache, recordAuditEvent, recordPermissionCheck, resetPerformanceMetrics, resolveAppContext, setGlobalAuditManager, setupRBAC, useAccessLevel, useCachedPermissions, useCan, useHasAllPermissions, useHasAnyPermission, useMultiplePermissions, useNavigationPermissions, usePagePermissions, usePermissions, useRBAC, useResolvedScope, useResourcePermissions, useRoleBasedRouter, useRoleManagement, useSecureData, useSecureSupabase, validateAndWarn, validateDatabaseConfiguration, validateRBACSetup, withAccessLevelGuard, withPermissionGuard, withRoleGuard };
2683
+ export { ALL_PERMISSIONS, AccessLevel, AccessLevelGuard, type AllPermissions, CACHE_PATTERNS, type ComplianceResult, type DataAccessRecord, type DatabaseComplianceResult, type DatabaseIssue, EVENT_APP_PERMISSIONS, EnhancedNavigationMenu, type EnhancedNavigationMenuProps, type EventAppRoleData, GLOBAL_PERMISSIONS, type GrantEventAppRoleParams, type LogLevel, type NavigationAccessRecord, type NavigationContextType, NavigationGuard, type NavigationGuardProps, type NavigationItem, NavigationProvider, type NavigationProviderProps, ORGANISATION_PERMISSIONS, PAGE_PERMISSIONS, type PageAccessRecord, type PagePermissionContextType, PagePermissionGuard, type PagePermissionGuardProps, PagePermissionProvider, type PagePermissionProviderProps, Permission, PermissionCheck, PermissionEnforcer, type PermissionEnforcerProps, PermissionGuard, PermissionMap, type QuickFix, RBACAuditManager, RBACCache, type RBACConfig, RBACEngine, type RBACLogger, type RBACPerformanceMetrics, type ResourcePermissions, type RevokeEventAppRoleParams, RoleBasedRouter, type RoleBasedRouterContextType, type RoleBasedRouterProps, type RoleManagementResult, type RouteAccessRecord, type RouteConfig, type RuntimeComplianceResult, SECURE_CLIENT_SYMBOL, Scope, type SecureDataContextType, SecureDataProvider, type SecureDataProviderProps, SecureSupabaseClient, type SetupIssue, UUID, type UseResolvedScopeOptions, type UseResolvedScopeReturn, type UseResourcePermissionsOptions, checkRuntimeCompliance, clearInFlightRequests, createAuditManager, createRBACConfig, createRBACEngine, createRBACExpressMiddleware, createRBACMiddleware, createSecureClient, disablePerformanceMonitoring, emitAuditEvent, enablePerformanceMonitoring, fromSupabaseClient, getAccessLevel, getCustomAuthCodeFixes, getDirectSupabaseAuthFixes, getDuplicateConfigFixes, getGlobalAuditManager, getInFlightRequestCount, getPerformanceMetrics, getPerformanceSummary, getPermissionMap, getQuickFixes, getRBACConfig, getRBACLogger, getRoleContext, getSetupIssues, getUnprotectedPageFixes, hasAllPermissions, hasAnyPermission, hasAnyPermissionCached, hasPermission, hasPermissionCached, isDebugMode, isDevelopmentMode, isPerformanceMonitoringEnabled, isPermitted, isPermittedCached, isRBACInitialized, isSecureClient, isValidPermission, rbacCache, recordAuditEvent, recordPermissionCheck, resetPerformanceMetrics, resolveAppContext, setGlobalAuditManager, setupRBAC, useAccessLevel, useCachedPermissions, useCan, useHasAllPermissions, useHasAnyPermission, useMultiplePermissions, useNavigationPermissions, usePagePermissions, usePermissions, useRBAC, useResolvedScope, useResourcePermissions, useRoleBasedRouter, useRoleManagement, useSecureData, useSecureSupabase, validateAndWarn, validateDatabaseConfiguration, validateRBACSetup, warnIfInsecureClient, withAccessLevelGuard, withPermissionGuard, withRoleGuard };