@jmruthers/pace-core 0.4.1 → 0.5.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 (660) hide show
  1. package/CHANGELOG.md +26 -1
  2. package/README.md +231 -229
  3. package/dist/{DataTable-2LB6HI6V.js → DataTable-ZQDRE46Q.js} +15 -17
  4. package/dist/{DataTable-BDBqkU-i.d.ts → DataTable-ltTFXHS3.d.ts} +25 -51
  5. package/dist/{Table-CIm9IWqk.d.ts → PublicLoadingSpinner-Bq_-BeK-.d.ts} +635 -122
  6. package/dist/{UnifiedAuthProvider-V7y63NjT.d.ts → RBACProvider-BO4ilsQB.d.ts} +11 -36
  7. package/dist/UnifiedAuthProvider-DGQsy-vY.d.ts +103 -0
  8. package/dist/{api-AIJ3IJX3.js → api-H5A3H4IR.js} +6 -4
  9. package/dist/{appConfig-fB1pP_v3.d.ts → appConfig-BVGyuvI7.d.ts} +1 -1
  10. package/dist/appNameResolver-7GHF5ED2.js +22 -0
  11. package/dist/{audit-PD5L5ZSC.js → audit-BUW3LMJB.js} +3 -3
  12. package/dist/chunk-5H3C2SWM.js +3293 -0
  13. package/dist/chunk-5H3C2SWM.js.map +1 -0
  14. package/dist/chunk-5SIXIV7R.js +1925 -0
  15. package/dist/chunk-5SIXIV7R.js.map +1 -0
  16. package/dist/{chunk-YNU5QJ4S.js → chunk-7BNPOCLL.js} +22 -5
  17. package/dist/chunk-7BNPOCLL.js.map +1 -0
  18. package/dist/{chunk-4ZTIEYU2.js → chunk-CDQ3PX7L.js} +1 -1
  19. package/dist/chunk-CDQ3PX7L.js.map +1 -0
  20. package/dist/chunk-GNTALZV3.js +17 -0
  21. package/dist/chunk-GNTALZV3.js.map +1 -0
  22. package/dist/chunk-GWSBHC4J.js +1349 -0
  23. package/dist/chunk-GWSBHC4J.js.map +1 -0
  24. package/dist/{chunk-JUUNUW3O.js → chunk-HD7PYDUV.js} +14 -5
  25. package/dist/chunk-HD7PYDUV.js.map +1 -0
  26. package/dist/{chunk-H4PZ4B3Y.js → chunk-HXX35Q2M.js} +113 -27
  27. package/dist/chunk-HXX35Q2M.js.map +1 -0
  28. package/dist/chunk-K6B7BLSE.js +388 -0
  29. package/dist/chunk-K6B7BLSE.js.map +1 -0
  30. package/dist/chunk-M4RW7PIP.js +5441 -0
  31. package/dist/chunk-M4RW7PIP.js.map +1 -0
  32. package/dist/chunk-MZBUOP4P.js +119 -0
  33. package/dist/chunk-MZBUOP4P.js.map +1 -0
  34. package/dist/chunk-N2EUGZRW.js +98 -0
  35. package/dist/chunk-N2EUGZRW.js.map +1 -0
  36. package/dist/chunk-NQ4TOOO6.js +20 -0
  37. package/dist/chunk-NQ4TOOO6.js.map +1 -0
  38. package/dist/{chunk-DC5AMYBS.js → chunk-PLDDJCW6.js} +15 -5
  39. package/dist/chunk-PLDDJCW6.js.map +1 -0
  40. package/dist/{chunk-IOX76PSM.js → chunk-PVMYVQSM.js} +270 -28
  41. package/dist/chunk-PVMYVQSM.js.map +1 -0
  42. package/dist/{chunk-4MCJAK7J.js → chunk-QKHFMQ5R.js} +2155 -4853
  43. package/dist/chunk-QKHFMQ5R.js.map +1 -0
  44. package/dist/chunk-QVYBYGT2.js +428 -0
  45. package/dist/chunk-QVYBYGT2.js.map +1 -0
  46. package/dist/{chunk-WHLSWC6W.js → chunk-SS3E6QLB.js} +16 -61
  47. package/dist/chunk-SS3E6QLB.js.map +1 -0
  48. package/dist/chunk-WJARTBCT.js +128 -0
  49. package/dist/chunk-WJARTBCT.js.map +1 -0
  50. package/dist/chunk-YDJW5XTN.js +84 -0
  51. package/dist/chunk-YDJW5XTN.js.map +1 -0
  52. package/dist/components.d.ts +907 -10
  53. package/dist/components.js +3237 -204
  54. package/dist/components.js.map +1 -1
  55. package/dist/{database-CAMsquLm.d.ts → database-C3Szpi5J.d.ts} +28 -11
  56. package/dist/hooks.d.ts +7 -6
  57. package/dist/hooks.js +33 -11
  58. package/dist/hooks.js.map +1 -1
  59. package/dist/index.d.ts +247 -111
  60. package/dist/index.js +330 -185
  61. package/dist/index.js.map +1 -1
  62. package/dist/{organisation-DLNNQhPB.d.ts → organisation-CO3Sh3_D.d.ts} +1 -1
  63. package/dist/providers.d.ts +5 -4
  64. package/dist/providers.js +14 -5
  65. package/dist/rbac/index.d.ts +964 -839
  66. package/dist/rbac/index.js +58 -1970
  67. package/dist/rbac/index.js.map +1 -1
  68. package/dist/styles/core.css +364 -0
  69. package/dist/styles/fonts/georama-italic.woff2 +0 -0
  70. package/dist/styles/fonts/georama.woff2 +0 -0
  71. package/dist/styles/fonts/open-sans-italic.woff2 +0 -0
  72. package/dist/styles/fonts/open-sans.woff2 +0 -0
  73. package/dist/styles/fonts/reddit-mono.woff2 +0 -0
  74. package/dist/styles/index.d.ts +36 -0
  75. package/dist/styles/index.js +24 -0
  76. package/dist/styles/index.js.map +1 -0
  77. package/dist/theming/runtime.d.ts +73 -0
  78. package/dist/theming/runtime.js +16 -0
  79. package/dist/theming/runtime.js.map +1 -0
  80. package/dist/{types-Bavn44NW.d.ts → types-BRDU7N6w.d.ts} +79 -33
  81. package/dist/types.d.ts +5 -5
  82. package/dist/types.js +7 -2
  83. package/dist/types.js.map +1 -1
  84. package/dist/{unified-BtRpPbmp.d.ts → unified-CMPjE_fv.d.ts} +0 -1
  85. package/dist/usePublicRouteParams-B2OcAsur.d.ts +477 -0
  86. package/dist/utils.d.ts +83 -60
  87. package/dist/utils.js +293 -55651
  88. package/dist/utils.js.map +1 -1
  89. package/dist/validation.d.ts +1 -1
  90. package/dist/validation.js +1 -1
  91. package/docs/INDEX.md +192 -0
  92. package/docs/README.md +46 -32
  93. package/docs/api/README.md +231 -229
  94. package/docs/api/classes/ErrorBoundary.md +1 -1
  95. package/docs/api/classes/InvalidScopeError.md +73 -0
  96. package/docs/api/classes/MissingUserContextError.md +66 -0
  97. package/docs/api/classes/OrganisationContextRequiredError.md +66 -0
  98. package/docs/api/classes/PermissionDeniedError.md +73 -0
  99. package/docs/api/classes/PublicErrorBoundary.md +132 -0
  100. package/docs/api/classes/RBACAuditManager.md +270 -0
  101. package/docs/api/classes/RBACCache.md +284 -0
  102. package/docs/api/classes/RBACEngine.md +141 -0
  103. package/docs/api/classes/RBACError.md +76 -0
  104. package/docs/api/classes/RBACNotInitializedError.md +66 -0
  105. package/docs/api/classes/SecureSupabaseClient.md +135 -0
  106. package/docs/api/interfaces/AggregateConfig.md +4 -4
  107. package/docs/api/interfaces/ButtonProps.md +2 -2
  108. package/docs/api/interfaces/CardProps.md +2 -2
  109. package/docs/api/interfaces/ColorPalette.md +1 -1
  110. package/docs/api/interfaces/ColorShade.md +1 -1
  111. package/docs/api/interfaces/DataAccessRecord.md +96 -0
  112. package/docs/api/interfaces/DataTableAction.md +98 -7
  113. package/docs/api/interfaces/DataTableColumn.md +131 -12
  114. package/docs/api/interfaces/DataTableProps.md +77 -274
  115. package/docs/api/interfaces/DataTableToolbarButton.md +7 -7
  116. package/docs/api/interfaces/EmptyStateConfig.md +5 -5
  117. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +235 -0
  118. package/docs/api/interfaces/EventContextType.md +7 -7
  119. package/docs/api/interfaces/EventLogoProps.md +152 -0
  120. package/docs/api/interfaces/EventProviderProps.md +2 -2
  121. package/docs/api/interfaces/FileSizeLimits.md +7 -0
  122. package/docs/api/interfaces/FileUploadProps.md +154 -0
  123. package/docs/api/interfaces/FooterProps.md +1 -1
  124. package/docs/api/interfaces/InactivityWarningModalProps.md +115 -0
  125. package/docs/api/interfaces/InputProps.md +2 -2
  126. package/docs/api/interfaces/LabelProps.md +1 -1
  127. package/docs/api/interfaces/LoginFormProps.md +1 -1
  128. package/docs/api/interfaces/NavigationAccessRecord.md +107 -0
  129. package/docs/api/interfaces/NavigationContextType.md +164 -0
  130. package/docs/api/interfaces/NavigationGuardProps.md +139 -0
  131. package/docs/api/interfaces/NavigationItem.md +1 -1
  132. package/docs/api/interfaces/NavigationMenuProps.md +1 -1
  133. package/docs/api/interfaces/NavigationProviderProps.md +117 -0
  134. package/docs/api/interfaces/Organisation.md +1 -1
  135. package/docs/api/interfaces/OrganisationContextType.md +1 -1
  136. package/docs/api/interfaces/OrganisationMembership.md +1 -1
  137. package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
  138. package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
  139. package/docs/api/interfaces/PaceAppLayoutProps.md +26 -26
  140. package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
  141. package/docs/api/interfaces/PageAccessRecord.md +85 -0
  142. package/docs/api/interfaces/PagePermissionContextType.md +140 -0
  143. package/docs/api/interfaces/PagePermissionGuardProps.md +153 -0
  144. package/docs/api/interfaces/PagePermissionProviderProps.md +119 -0
  145. package/docs/api/interfaces/PaletteData.md +1 -1
  146. package/docs/api/interfaces/PermissionEnforcerProps.md +153 -0
  147. package/docs/api/interfaces/PublicErrorBoundaryProps.md +94 -0
  148. package/docs/api/interfaces/PublicErrorBoundaryState.md +68 -0
  149. package/docs/api/interfaces/PublicLoadingSpinnerProps.md +86 -0
  150. package/docs/api/interfaces/PublicPageFooterProps.md +112 -0
  151. package/docs/api/interfaces/PublicPageHeaderProps.md +138 -0
  152. package/docs/api/interfaces/PublicPageLayoutProps.md +138 -0
  153. package/docs/api/interfaces/RBACConfig.md +99 -0
  154. package/docs/api/interfaces/RBACContextType.md +474 -0
  155. package/docs/api/interfaces/RBACLogger.md +112 -0
  156. package/docs/api/interfaces/RBACProviderProps.md +107 -0
  157. package/docs/api/interfaces/RoleBasedRouterContextType.md +151 -0
  158. package/docs/api/interfaces/RoleBasedRouterProps.md +156 -0
  159. package/docs/api/interfaces/RouteAccessRecord.md +107 -0
  160. package/docs/api/interfaces/RouteConfig.md +121 -0
  161. package/docs/api/interfaces/SecureDataContextType.md +168 -0
  162. package/docs/api/interfaces/SecureDataProviderProps.md +132 -0
  163. package/docs/api/interfaces/StorageConfig.md +41 -0
  164. package/docs/api/interfaces/StorageFileInfo.md +74 -0
  165. package/docs/api/interfaces/StorageFileMetadata.md +140 -0
  166. package/docs/api/interfaces/StorageListOptions.md +86 -0
  167. package/docs/api/interfaces/StorageListResult.md +41 -0
  168. package/docs/api/interfaces/StorageUploadOptions.md +88 -0
  169. package/docs/api/interfaces/StorageUploadResult.md +63 -0
  170. package/docs/api/interfaces/StorageUrlOptions.md +47 -0
  171. package/docs/api/interfaces/StyleImport.md +2 -2
  172. package/docs/api/interfaces/ToastActionElement.md +1 -1
  173. package/docs/api/interfaces/ToastProps.md +1 -1
  174. package/docs/api/interfaces/UnifiedAuthContextType.md +465 -64
  175. package/docs/api/interfaces/UnifiedAuthProviderProps.md +95 -9
  176. package/docs/api/interfaces/UseInactivityTrackerOptions.md +136 -0
  177. package/docs/api/interfaces/UseInactivityTrackerReturn.md +123 -0
  178. package/docs/api/interfaces/UsePublicEventLogoOptions.md +87 -0
  179. package/docs/api/interfaces/UsePublicEventLogoReturn.md +81 -0
  180. package/docs/api/interfaces/UsePublicEventOptions.md +34 -0
  181. package/docs/api/interfaces/UsePublicEventReturn.md +68 -0
  182. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +94 -0
  183. package/docs/api/interfaces/UserEventAccess.md +14 -14
  184. package/docs/api/interfaces/UserMenuProps.md +6 -6
  185. package/docs/api/interfaces/UserProfile.md +1 -1
  186. package/docs/api/modules.md +4233 -1134
  187. package/docs/api-reference/components.md +761 -43
  188. package/docs/api-reference/hooks.md +126 -0
  189. package/docs/api-reference/providers.md +141 -65
  190. package/docs/api-reference/types.md +66 -36
  191. package/docs/api-reference/utilities.md +1 -1
  192. package/docs/architecture/README.md +1 -2
  193. package/docs/best-practices/README.md +400 -0
  194. package/docs/consuming-app-example.md +42 -96
  195. package/docs/consuming-app-vite-config.md +233 -0
  196. package/docs/core-concepts/events.md +3 -3
  197. package/docs/core-concepts/organisations.md +0 -1
  198. package/docs/core-concepts/rbac-system.md +23 -10
  199. package/docs/documentation-style-checklist.md +8 -2
  200. package/docs/examples/navigation-menu-auth-fix.md +344 -0
  201. package/docs/getting-started/examples/README.md +15 -1
  202. package/docs/getting-started/examples/basic-auth-app.md +444 -119
  203. package/docs/getting-started/examples/full-featured-app.md +6 -6
  204. package/docs/getting-started/installation.md +231 -52
  205. package/docs/getting-started/quick-start.md +121 -24
  206. package/docs/implementation-guides/app-layout.md +133 -108
  207. package/docs/implementation-guides/data-tables.md +1011 -29
  208. package/docs/implementation-guides/forms.md +3 -3
  209. package/docs/implementation-guides/hierarchical-datatable.md +850 -0
  210. package/docs/implementation-guides/large-datasets.md +2 -2
  211. package/docs/implementation-guides/navigation.md +1 -1
  212. package/docs/implementation-guides/permission-enforcement.md +4 -4
  213. package/docs/implementation-guides/public-pages.md +752 -0
  214. package/docs/migration/README.md +18 -8
  215. package/docs/migration/quick-migration-guide.md +320 -0
  216. package/docs/migration/rbac-migration.md +50 -0
  217. package/docs/migration/v0.4.15-tailwind-scanning.md +272 -0
  218. package/docs/migration/v0.4.16-css-first-approach.md +306 -0
  219. package/docs/migration/v0.4.17-source-path-fix.md +229 -0
  220. package/docs/migration-guide.md +77 -105
  221. package/docs/performance/README.md +1 -4
  222. package/docs/print-components/README.md +258 -0
  223. package/docs/print-components/api-reference.md +636 -0
  224. package/docs/print-components/examples/README.md +204 -0
  225. package/docs/print-components/examples/basic-report.tsx +92 -0
  226. package/docs/print-components/examples/card-catalog.tsx +149 -0
  227. package/docs/print-components/examples/cover-page-report.tsx +163 -0
  228. package/docs/print-components/quick-start.md +363 -0
  229. package/docs/quick-reference.md +53 -36
  230. package/docs/rbac/README.md +136 -69
  231. package/docs/rbac/api-reference.md +39 -8
  232. package/docs/rbac/examples.md +237 -66
  233. package/docs/rbac/getting-started.md +131 -16
  234. package/docs/rbac/quick-start.md +499 -323
  235. package/docs/rbac/troubleshooting.md +240 -262
  236. package/docs/security/README.md +50 -1
  237. package/docs/styles/README.md +226 -111
  238. package/docs/testing/README.md +6 -10
  239. package/docs/troubleshooting/README.md +497 -0
  240. package/docs/troubleshooting/common-issues.md +604 -14
  241. package/docs/troubleshooting/styling-issues.md +219 -0
  242. package/docs/troubleshooting/tailwind-content-scanning.md +213 -0
  243. package/docs/usage.md +54 -91
  244. package/docs/visual-testing.md +0 -7
  245. package/package.json +47 -25
  246. package/src/__mocks__/lucide-react.ts +181 -0
  247. package/src/__tests__/REBUILD_PLAN.md +223 -0
  248. package/src/__tests__/TESTING_GUIDELINES.md +341 -0
  249. package/src/__tests__/fixtures/mocks.ts +93 -0
  250. package/src/__tests__/helpers/component-test-utils.tsx +145 -0
  251. package/src/__tests__/helpers/test-utils.tsx +117 -0
  252. package/src/__tests__/integration/UserProfile.test.tsx +128 -0
  253. package/src/__tests__/setup.ts +71 -0
  254. package/src/__tests__/templates/accessibility.test.template.tsx +279 -0
  255. package/src/__tests__/templates/component.test.template.tsx +144 -0
  256. package/src/__tests__/templates/hook.test.template.ts +173 -0
  257. package/src/__tests__/templates/integration.test.template.tsx +199 -0
  258. package/src/__tests__/types/test.types.ts +106 -0
  259. package/src/components/Alert/Alert.test.tsx +496 -0
  260. package/src/components/Alert/Alert.tsx +134 -0
  261. package/src/components/Alert/index.ts +2 -0
  262. package/src/components/Avatar/Avatar.test.tsx +484 -0
  263. package/src/components/Avatar/Avatar.tsx +84 -0
  264. package/src/components/Avatar/index.ts +2 -0
  265. package/src/components/Button/Button.test.tsx +662 -0
  266. package/src/components/Button/Button.tsx +270 -0
  267. package/src/components/Button/index.ts +2 -0
  268. package/src/components/Card/Card.test.tsx +593 -0
  269. package/src/components/Card/Card.tsx +271 -0
  270. package/src/components/Card/index.ts +1 -0
  271. package/src/components/Checkbox/Checkbox.test.tsx +461 -0
  272. package/src/components/Checkbox/Checkbox.tsx +75 -0
  273. package/src/components/Checkbox/__mocks__/Checkbox.tsx +2 -0
  274. package/src/components/Checkbox/index.ts +2 -0
  275. package/src/components/DataTable/DataTable.tsx +446 -0
  276. package/src/components/DataTable/__tests__/README.md +145 -0
  277. package/src/components/DataTable/__tests__/mocks/MockRBACProvider.tsx +66 -0
  278. package/src/components/DataTable/__tests__/test-utils/dataFactories.ts +103 -0
  279. package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +381 -0
  280. package/src/components/DataTable/__tests__/test-utils.ts +94 -0
  281. package/src/components/DataTable/components/AccessDeniedPage.tsx +168 -0
  282. package/src/components/DataTable/components/ActionButtons.tsx +194 -0
  283. package/src/components/DataTable/components/BulkOperationsDropdown.tsx +160 -0
  284. package/src/components/DataTable/components/ColumnFilter.tsx +114 -0
  285. package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +100 -0
  286. package/src/components/DataTable/components/DataTableBody.tsx +461 -0
  287. package/src/components/DataTable/components/DataTableCore.tsx +1027 -0
  288. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +214 -0
  289. package/src/components/DataTable/components/DataTableModals.tsx +87 -0
  290. package/src/components/DataTable/components/DataTableToolbar.tsx +262 -0
  291. package/src/components/DataTable/components/DraggableColumnHeader.tsx +144 -0
  292. package/src/components/DataTable/components/EditableRow.tsx +159 -0
  293. package/src/components/DataTable/components/EmptyState.tsx +64 -0
  294. package/src/components/DataTable/components/ExpandButton.tsx +113 -0
  295. package/src/components/DataTable/components/FilterRow.tsx +100 -0
  296. package/src/components/DataTable/components/GroupHeader.tsx +42 -0
  297. package/src/components/DataTable/components/GroupingDropdown.tsx +96 -0
  298. package/src/components/DataTable/components/ImportModal.tsx +345 -0
  299. package/src/components/DataTable/components/LoadingState.tsx +12 -0
  300. package/src/components/DataTable/components/PaginationControls.tsx +332 -0
  301. package/src/components/DataTable/components/UnifiedTableBody.tsx +742 -0
  302. package/src/components/DataTable/components/ViewRowModal.tsx +68 -0
  303. package/src/components/DataTable/components/VirtualizedDataTable.tsx +513 -0
  304. package/src/components/DataTable/components/index.ts +16 -0
  305. package/src/components/DataTable/context/DataTableContext.tsx +97 -0
  306. package/src/components/DataTable/core/ActionManager.ts +235 -0
  307. package/src/components/DataTable/core/ColumnFactory.ts +268 -0
  308. package/src/components/DataTable/core/ColumnManager.ts +205 -0
  309. package/src/components/DataTable/core/DataManager.ts +188 -0
  310. package/src/components/DataTable/core/DataTableContext.tsx +181 -0
  311. package/src/components/DataTable/core/LocalDataAdapter.ts +264 -0
  312. package/src/components/DataTable/core/PluginRegistry.ts +229 -0
  313. package/src/components/DataTable/core/StateManager.ts +311 -0
  314. package/src/components/DataTable/core/index.ts +8 -0
  315. package/src/components/DataTable/core/interfaces.ts +338 -0
  316. package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +419 -0
  317. package/src/components/DataTable/examples/HierarchicalExample.tsx +475 -0
  318. package/src/components/DataTable/examples/InitialPageSizeExample.tsx +176 -0
  319. package/src/components/DataTable/examples/PerformanceExample.tsx +505 -0
  320. package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +95 -0
  321. package/src/components/DataTable/hooks/useColumnReordering.ts +110 -0
  322. package/src/components/DataTable/hooks/useDataTableState.ts +325 -0
  323. package/src/components/DataTable/hooks/useHierarchicalState.ts +174 -0
  324. package/src/components/DataTable/index.ts +68 -0
  325. package/src/components/DataTable/styles.ts +171 -0
  326. package/src/components/DataTable/types.ts +511 -0
  327. package/src/components/DataTable/utils/debugTools.ts +583 -0
  328. package/src/components/DataTable/utils/errorHandling.ts +494 -0
  329. package/src/components/DataTable/utils/exportUtils.ts +126 -0
  330. package/src/components/DataTable/utils/flexibleImport.ts +510 -0
  331. package/src/components/DataTable/utils/hierarchicalSorting.ts +151 -0
  332. package/src/components/DataTable/utils/hierarchicalUtils.ts +218 -0
  333. package/src/components/DataTable/utils/index.ts +1 -0
  334. package/src/components/DataTable/utils/performanceUtils.ts +351 -0
  335. package/src/components/Dialog/Dialog.test.tsx +1139 -0
  336. package/src/components/Dialog/Dialog.tsx +782 -0
  337. package/src/components/Dialog/README.md +804 -0
  338. package/src/components/Dialog/examples/BasicHtmlTest.tsx +55 -0
  339. package/src/components/Dialog/examples/DebugHtmlExample.tsx +68 -0
  340. package/src/components/Dialog/examples/HtmlDialogExample.tsx +202 -0
  341. package/src/components/Dialog/examples/SimpleHtmlTest.tsx +61 -0
  342. package/src/components/Dialog/examples/SmartDialogExample.tsx +322 -0
  343. package/src/components/Dialog/index.ts +12 -0
  344. package/src/components/Dialog/utils/safeHtml.ts +185 -0
  345. package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +752 -0
  346. package/src/components/ErrorBoundary/ErrorBoundary.tsx +312 -0
  347. package/src/components/ErrorBoundary/index.ts +8 -0
  348. package/src/components/EventSelector/EventSelector.tsx +360 -0
  349. package/src/components/EventSelector/index.ts +3 -0
  350. package/src/components/EventSelector/types.ts +79 -0
  351. package/src/components/FileUpload/FileUpload.example.tsx +218 -0
  352. package/src/components/FileUpload/FileUpload.test.tsx +665 -0
  353. package/src/components/FileUpload/FileUpload.tsx +237 -0
  354. package/src/components/FileUpload/index.ts +6 -0
  355. package/src/components/Footer/Footer.test.tsx +482 -0
  356. package/src/components/Footer/Footer.tsx +197 -0
  357. package/src/components/Footer/index.ts +17 -0
  358. package/src/components/Form/Form.test.tsx +1158 -0
  359. package/src/components/Form/Form.tsx +166 -0
  360. package/src/components/Form/FormErrorSummary.tsx +113 -0
  361. package/src/components/Form/FormField.tsx +249 -0
  362. package/src/components/Form/FormFieldset.tsx +127 -0
  363. package/src/components/Form/FormLiveRegion.tsx +198 -0
  364. package/src/components/Form/index.ts +26 -0
  365. package/src/components/Header/Header.test.tsx +582 -0
  366. package/src/components/Header/Header.tsx +301 -0
  367. package/src/components/Header/index.ts +4 -0
  368. package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +489 -0
  369. package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +164 -0
  370. package/src/components/InactivityWarningModal/index.ts +9 -0
  371. package/src/components/Input/Input.test.tsx +466 -0
  372. package/src/components/Input/Input.tsx +201 -0
  373. package/src/components/Input/__mocks__/Input.tsx +2 -0
  374. package/src/components/Input/index.ts +9 -0
  375. package/src/components/Label/Label.tsx +186 -0
  376. package/src/components/Label/index.ts +2 -0
  377. package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +450 -0
  378. package/src/components/LoadingSpinner/LoadingSpinner.tsx +98 -0
  379. package/src/components/LoadingSpinner/index.ts +3 -0
  380. package/src/components/LoginForm/LoginForm.test.tsx +816 -0
  381. package/src/components/LoginForm/LoginForm.tsx +273 -0
  382. package/src/components/LoginForm/index.ts +3 -0
  383. package/src/components/NavigationMenu/NavigationMenu.test.tsx +883 -0
  384. package/src/components/NavigationMenu/NavigationMenu.tsx +698 -0
  385. package/src/components/NavigationMenu/index.ts +10 -0
  386. package/src/components/NavigationMenu/types.ts +85 -0
  387. package/src/components/OrganisationSelector/OrganisationSelector.test.tsx +748 -0
  388. package/src/components/OrganisationSelector/OrganisationSelector.tsx +304 -0
  389. package/src/components/OrganisationSelector/index.ts +9 -0
  390. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +891 -0
  391. package/src/components/PaceAppLayout/PaceAppLayout.tsx +699 -0
  392. package/src/components/PaceAppLayout/README.md +278 -0
  393. package/src/components/PaceAppLayout/index.ts +1 -0
  394. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +475 -0
  395. package/src/components/PaceLoginPage/PaceLoginPage.tsx +221 -0
  396. package/src/components/PaceLoginPage/index.ts +1 -0
  397. package/src/components/PasswordReset/PasswordChangeForm.test.tsx +621 -0
  398. package/src/components/PasswordReset/PasswordChangeForm.tsx +186 -0
  399. package/src/components/PasswordReset/PasswordResetForm.test.tsx +605 -0
  400. package/src/components/PasswordReset/PasswordResetForm.tsx +201 -0
  401. package/src/components/PasswordReset/index.ts +4 -0
  402. package/src/components/PrintButton/PrintButton.tsx +321 -0
  403. package/src/components/PrintButton/PrintButtonGroup.tsx +84 -0
  404. package/src/components/PrintButton/PrintToolbar.tsx +94 -0
  405. package/src/components/PrintButton/examples/PrintButtonShowcase.tsx +438 -0
  406. package/src/components/PrintButton/index.ts +33 -0
  407. package/src/components/PrintButton/types.ts +173 -0
  408. package/src/components/PrintCard/PrintCard.tsx +154 -0
  409. package/src/components/PrintCard/PrintCardContent.tsx +57 -0
  410. package/src/components/PrintCard/PrintCardFooter.tsx +60 -0
  411. package/src/components/PrintCard/PrintCardGrid.tsx +91 -0
  412. package/src/components/PrintCard/PrintCardHeader.tsx +78 -0
  413. package/src/components/PrintCard/PrintCardImage.tsx +81 -0
  414. package/src/components/PrintCard/examples/PrintCardShowcase.tsx +239 -0
  415. package/src/components/PrintCard/index.ts +34 -0
  416. package/src/components/PrintCard/types.ts +171 -0
  417. package/src/components/PrintDataTable/PrintDataTable.tsx +215 -0
  418. package/src/components/PrintDataTable/PrintTableGroup.tsx +90 -0
  419. package/src/components/PrintDataTable/PrintTableRow.tsx +76 -0
  420. package/src/components/PrintDataTable/index.ts +25 -0
  421. package/src/components/PrintDataTable/types.ts +67 -0
  422. package/src/components/PrintFooter/PrintFooter.tsx +183 -0
  423. package/src/components/PrintFooter/PrintFooterContent.tsx +71 -0
  424. package/src/components/PrintFooter/PrintFooterInfo.tsx +86 -0
  425. package/src/components/PrintFooter/PrintPageNumber.tsx +90 -0
  426. package/src/components/PrintFooter/examples/PrintFooterShowcase.tsx +390 -0
  427. package/src/components/PrintFooter/index.ts +30 -0
  428. package/src/components/PrintFooter/types.ts +149 -0
  429. package/src/components/PrintGrid/PrintGrid.tsx +180 -0
  430. package/src/components/PrintGrid/PrintGridBreakpoint.tsx +109 -0
  431. package/src/components/PrintGrid/PrintGridContainer.tsx +128 -0
  432. package/src/components/PrintGrid/PrintGridItem.tsx +220 -0
  433. package/src/components/PrintGrid/examples/PrintGridShowcase.tsx +359 -0
  434. package/src/components/PrintGrid/index.ts +31 -0
  435. package/src/components/PrintGrid/types.ts +159 -0
  436. package/src/components/PrintHeader/PrintCoverHeader.tsx +230 -0
  437. package/src/components/PrintHeader/PrintHeader.tsx +150 -0
  438. package/src/components/PrintHeader/index.ts +17 -0
  439. package/src/components/PrintHeader/types.ts +42 -0
  440. package/src/components/PrintLayout/PrintLayout.tsx +122 -0
  441. package/src/components/PrintLayout/PrintLayoutContext.tsx +66 -0
  442. package/src/components/PrintLayout/PrintPageBreak.tsx +52 -0
  443. package/src/components/PrintLayout/examples/PrintShowcase.tsx +230 -0
  444. package/src/components/PrintLayout/index.ts +19 -0
  445. package/src/components/PrintLayout/types.ts +37 -0
  446. package/src/components/PrintPageBreak/PrintPageBreak.tsx +120 -0
  447. package/src/components/PrintPageBreak/PrintPageBreakGroup.tsx +90 -0
  448. package/src/components/PrintPageBreak/PrintPageBreakIndicator.tsx +112 -0
  449. package/src/components/PrintPageBreak/examples/PrintPageBreakShowcase.tsx +279 -0
  450. package/src/components/PrintPageBreak/index.ts +23 -0
  451. package/src/components/PrintPageBreak/types.ts +94 -0
  452. package/src/components/PrintSection/PrintColumn.tsx +104 -0
  453. package/src/components/PrintSection/PrintDivider.tsx +101 -0
  454. package/src/components/PrintSection/PrintSection.tsx +129 -0
  455. package/src/components/PrintSection/PrintSectionContent.tsx +75 -0
  456. package/src/components/PrintSection/PrintSectionHeader.tsx +97 -0
  457. package/src/components/PrintSection/examples/PrintSectionShowcase.tsx +258 -0
  458. package/src/components/PrintSection/index.ts +33 -0
  459. package/src/components/PrintSection/types.ts +155 -0
  460. package/src/components/PrintText/PrintText.tsx +116 -0
  461. package/src/components/PrintText/index.ts +16 -0
  462. package/src/components/PrintText/types.ts +24 -0
  463. package/src/components/Progress/Progress.tsx +116 -0
  464. package/src/components/Progress/index.ts +3 -0
  465. package/src/components/PublicLayout/EventLogo.tsx +287 -0
  466. package/src/components/PublicLayout/PublicErrorBoundary.tsx +279 -0
  467. package/src/components/PublicLayout/PublicLoadingSpinner.tsx +208 -0
  468. package/src/components/PublicLayout/PublicPageContextChecker.tsx +130 -0
  469. package/src/components/PublicLayout/PublicPageDebugger.tsx +104 -0
  470. package/src/components/PublicLayout/PublicPageDiagnostic.tsx +162 -0
  471. package/src/components/PublicLayout/PublicPageFooter.tsx +124 -0
  472. package/src/components/PublicLayout/PublicPageHeader.tsx +178 -0
  473. package/src/components/PublicLayout/PublicPageLayout.tsx +232 -0
  474. package/src/components/PublicLayout/PublicPageProvider.tsx +137 -0
  475. package/src/components/PublicLayout/index.ts +51 -0
  476. package/src/components/Select/Select.test.tsx +948 -0
  477. package/src/components/Select/Select.tsx +660 -0
  478. package/src/components/Select/index.ts +1 -0
  479. package/src/components/SuperAdminGuard.tsx +116 -0
  480. package/src/components/Table/Table.tsx +222 -0
  481. package/src/components/Table/index.ts +11 -0
  482. package/src/components/Toast/Toast.test.tsx +586 -0
  483. package/src/components/Toast/Toast.tsx +339 -0
  484. package/src/components/Toast/index.ts +14 -0
  485. package/src/components/Tooltip/Tooltip.test.tsx +852 -0
  486. package/src/components/Tooltip/Tooltip.tsx +167 -0
  487. package/src/components/Tooltip/index.ts +7 -0
  488. package/src/components/UserMenu/UserMenu.test.tsx +702 -0
  489. package/src/components/UserMenu/UserMenu.tsx +243 -0
  490. package/src/components/UserMenu/index.ts +3 -0
  491. package/src/components/examples/PermissionExample.tsx +150 -0
  492. package/src/components/index.ts +434 -0
  493. package/src/components.ts +19 -0
  494. package/src/constants/performance.ts +14 -0
  495. package/src/examples/CorrectPublicPageImplementation.tsx +301 -0
  496. package/src/examples/PublicEventPage.tsx +274 -0
  497. package/src/examples/PublicPageApp.tsx +308 -0
  498. package/src/examples/PublicPageUsageExample.tsx +216 -0
  499. package/src/hooks/index.ts +56 -0
  500. package/src/hooks/public/index.ts +34 -0
  501. package/src/hooks/public/usePublicEvent.ts +261 -0
  502. package/src/hooks/public/usePublicEventLogo.ts +285 -0
  503. package/src/hooks/public/usePublicRouteParams.ts +259 -0
  504. package/src/hooks/useAppConfig.ts +94 -0
  505. package/src/hooks/useComponentPerformance.ts +39 -0
  506. package/src/hooks/useCounter.test.ts +135 -0
  507. package/src/hooks/useDataTablePerformance.ts +387 -0
  508. package/src/hooks/useDataTableState.ts +110 -0
  509. package/src/hooks/useDebounce.test.ts +375 -0
  510. package/src/hooks/useDebounce.ts +18 -0
  511. package/src/hooks/useFocusManagement.ts +161 -0
  512. package/src/hooks/useFocusTrap.ts +155 -0
  513. package/src/hooks/useInactivityTracker.ts +372 -0
  514. package/src/hooks/useIsMobile.ts +42 -0
  515. package/src/hooks/useKeyboardShortcuts.ts +237 -0
  516. package/src/hooks/useOrganisationPermissions.test.ts +528 -0
  517. package/src/hooks/useOrganisationPermissions.ts +208 -0
  518. package/src/hooks/useOrganisationSecurity.test.ts +734 -0
  519. package/src/hooks/useOrganisationSecurity.ts +262 -0
  520. package/src/hooks/usePerformanceMonitor.ts +128 -0
  521. package/src/hooks/usePermissionCache.test.ts +542 -0
  522. package/src/hooks/usePermissionCache.ts +455 -0
  523. package/src/hooks/useSecureDataAccess.ts +586 -0
  524. package/src/hooks/useStorage.ts +274 -0
  525. package/src/hooks/useToast.ts +242 -0
  526. package/src/hooks/useZodForm.ts +28 -0
  527. package/src/index.ts +199 -0
  528. package/src/providers/AuthProvider.tsx +369 -0
  529. package/src/providers/EventProvider.tsx +324 -0
  530. package/src/providers/InactivityProvider.tsx +238 -0
  531. package/src/providers/OrganisationProvider.tsx +588 -0
  532. package/src/providers/UnifiedAuthProvider.tsx +327 -0
  533. package/src/providers/index.ts +17 -0
  534. package/src/rbac/README.md +885 -0
  535. package/src/rbac/__tests__/integration.test.tsx +218 -0
  536. package/src/rbac/adapters.tsx +726 -0
  537. package/src/rbac/api.test.ts +441 -0
  538. package/src/rbac/api.ts +339 -0
  539. package/src/rbac/audit-enhanced.ts +339 -0
  540. package/src/rbac/audit.ts +338 -0
  541. package/src/rbac/cache.ts +215 -0
  542. package/src/rbac/components/EnhancedNavigationMenu.tsx +294 -0
  543. package/src/rbac/components/NavigationGuard.tsx +294 -0
  544. package/src/rbac/components/NavigationProvider.tsx +314 -0
  545. package/src/rbac/components/PagePermissionGuard.tsx +430 -0
  546. package/src/rbac/components/PagePermissionProvider.tsx +274 -0
  547. package/src/rbac/components/PermissionEnforcer.tsx +307 -0
  548. package/src/rbac/components/RoleBasedRouter.tsx +425 -0
  549. package/src/rbac/components/SecureDataProvider.tsx +319 -0
  550. package/src/rbac/components/index.ts +64 -0
  551. package/src/rbac/config.ts +133 -0
  552. package/src/rbac/docs/event-based-apps.md +285 -0
  553. package/src/rbac/engine.ts +1026 -0
  554. package/src/rbac/eslint-rules.js +285 -0
  555. package/src/rbac/examples/CompleteRBACExample.tsx +323 -0
  556. package/src/rbac/examples/EventBasedApp.tsx +238 -0
  557. package/src/rbac/hooks/index.ts +21 -0
  558. package/src/rbac/hooks/useCan.test.ts +461 -0
  559. package/src/rbac/hooks/usePermissions.test.ts +359 -0
  560. package/src/rbac/hooks/usePermissions.ts +567 -0
  561. package/src/rbac/hooks/useRBAC.simple.test.ts +90 -0
  562. package/src/rbac/hooks/useRBAC.test.ts +503 -0
  563. package/src/rbac/hooks/useRBAC.ts +262 -0
  564. package/src/rbac/index.ts +109 -0
  565. package/src/rbac/permissions.ts +293 -0
  566. package/src/rbac/providers/RBACProvider.tsx +634 -0
  567. package/src/rbac/providers/__tests__/RBACProvider.test.tsx +687 -0
  568. package/src/rbac/providers/index.ts +11 -0
  569. package/src/rbac/secureClient.ts +244 -0
  570. package/src/rbac/security.ts +346 -0
  571. package/src/rbac/testing/index.tsx +340 -0
  572. package/src/rbac/types.ts +343 -0
  573. package/src/rbac/utils/eventContext.ts +83 -0
  574. package/src/styles/core.css +364 -0
  575. package/src/styles/index.ts +51 -0
  576. package/src/theming/runtime.ts +187 -0
  577. package/src/types/database.ts +472 -0
  578. package/src/types/guards.ts +30 -0
  579. package/src/types/index.ts +25 -0
  580. package/src/types/organisation.ts +184 -0
  581. package/src/types/security.ts +70 -0
  582. package/src/types/supabase.ts +166 -0
  583. package/src/types/theme.ts +6 -0
  584. package/src/types/unified.ts +262 -0
  585. package/src/types/validation.ts +164 -0
  586. package/src/types/vitest-globals.d.ts +43 -0
  587. package/src/utils/__mocks__/supabaseMock.ts +75 -0
  588. package/src/utils/__mocks__/supabaseMock.tsx +198 -0
  589. package/src/utils/appConfig.ts +47 -0
  590. package/src/utils/appIdResolver.ts +130 -0
  591. package/src/utils/appNameResolver.ts +190 -0
  592. package/src/utils/audit.ts +127 -0
  593. package/src/utils/auth-utils.ts +96 -0
  594. package/src/utils/bundleAnalysis.ts +129 -0
  595. package/src/utils/cn.ts +7 -0
  596. package/src/utils/debugLogger.ts +46 -0
  597. package/src/utils/deviceFingerprint.ts +215 -0
  598. package/src/utils/dynamicUtils.ts +105 -0
  599. package/src/utils/formatDate.test.ts +241 -0
  600. package/src/utils/formatting.ts +77 -0
  601. package/src/utils/index.ts +145 -0
  602. package/src/utils/lazyLoad.tsx +44 -0
  603. package/src/utils/organisationContext.ts +135 -0
  604. package/src/utils/performanceBenchmark.ts +64 -0
  605. package/src/utils/performanceBudgets.ts +111 -0
  606. package/src/utils/permissionTypes.ts +37 -0
  607. package/src/utils/permissionUtils.ts +31 -0
  608. package/src/utils/print/PrintDataProcessor.ts +390 -0
  609. package/src/utils/print/examples/PrintUtilitiesShowcase.tsx +397 -0
  610. package/src/utils/print/index.ts +29 -0
  611. package/src/utils/print/types.ts +196 -0
  612. package/src/utils/print/usePrintOptimization.ts +272 -0
  613. package/src/utils/sanitization.ts +264 -0
  614. package/src/utils/schemaUtils.ts +37 -0
  615. package/src/utils/secureDataAccess.ts +361 -0
  616. package/src/utils/secureErrors.ts +79 -0
  617. package/src/utils/secureStorage.ts +244 -0
  618. package/src/utils/security.ts +156 -0
  619. package/src/utils/securityMonitor.ts +45 -0
  620. package/src/utils/sessionTracking.ts +170 -0
  621. package/src/utils/storage/README.md +348 -0
  622. package/src/utils/storage/config.ts +100 -0
  623. package/src/utils/storage/helpers.ts +359 -0
  624. package/src/utils/storage/index.ts +36 -0
  625. package/src/utils/storage/types.ts +90 -0
  626. package/src/utils/validation.ts +111 -0
  627. package/src/utils/validationUtils.ts +120 -0
  628. package/src/validation/common.ts +53 -0
  629. package/src/validation/csrf.ts +214 -0
  630. package/src/validation/index.ts +43 -0
  631. package/src/validation/passwordSchema.ts +125 -0
  632. package/src/validation/sanitization.ts +96 -0
  633. package/src/validation/schemaUtils.ts +42 -0
  634. package/src/validation/sqlInjectionProtection.ts +242 -0
  635. package/src/validation/user.ts +34 -0
  636. package/dist/chunk-4MCJAK7J.js.map +0 -1
  637. package/dist/chunk-4ZTIEYU2.js.map +0 -1
  638. package/dist/chunk-H4PZ4B3Y.js.map +0 -1
  639. package/dist/chunk-IOX76PSM.js.map +0 -1
  640. package/dist/chunk-JUUNUW3O.js.map +0 -1
  641. package/dist/chunk-KK6WIDK6.js +0 -63
  642. package/dist/chunk-KK6WIDK6.js.map +0 -1
  643. package/dist/chunk-U7DY5T33.js +0 -11
  644. package/dist/chunk-U7DY5T33.js.map +0 -1
  645. package/dist/chunk-WHLSWC6W.js.map +0 -1
  646. package/dist/chunk-XI7QFSSC.js +0 -790
  647. package/dist/chunk-XI7QFSSC.js.map +0 -1
  648. package/dist/chunk-XIJMMBDD.js +0 -73
  649. package/dist/chunk-XIJMMBDD.js.map +0 -1
  650. package/dist/chunk-YNU5QJ4S.js.map +0 -1
  651. package/dist/chunk-YWYCNGWH.js +0 -2070
  652. package/dist/chunk-YWYCNGWH.js.map +0 -1
  653. package/dist/chunk-ZJ3UKPIW.js +0 -952
  654. package/dist/chunk-ZJ3UKPIW.js.map +0 -1
  655. package/dist/useAppConfig-CZNJJsT_.d.ts +0 -148
  656. package/dist/{DataTable-2LB6HI6V.js.map → DataTable-ZQDRE46Q.js.map} +0 -0
  657. package/dist/{api-AIJ3IJX3.js.map → api-H5A3H4IR.js.map} +0 -0
  658. package/dist/{audit-PD5L5ZSC.js.map → appNameResolver-7GHF5ED2.js.map} +0 -0
  659. package/dist/{chunk-DC5AMYBS.js.map → audit-BUW3LMJB.js.map} +0 -0
  660. package/dist/{validation-D2-NNCCE.d.ts → validation-PM_iOaTI.d.ts} +6 -6
@@ -1,7 +1,9 @@
1
1
  import { SupabaseClient } from '@supabase/supabase-js';
2
- import { D as Database } from '../database-CAMsquLm.js';
3
- import React__default, { ReactNode } from 'react';
2
+ import { D as Database } from '../database-C3Szpi5J.js';
4
3
  import * as react_jsx_runtime from 'react/jsx-runtime';
4
+ import React__default, { ReactNode } from 'react';
5
+ export { R as RBACContextType, a as RBACProvider, b as RBACProviderProps, U as UserEventAccess, u as useRBACProvider } from '../RBACProvider-BO4ilsQB.js';
6
+ import '../unified-CMPjE_fv.js';
5
7
 
6
8
  /**
7
9
  * RBAC (Role-Based Access Control) Types - Build Contract Compliant
@@ -26,13 +28,13 @@ type PermissionCheck = {
26
28
  userId: UUID;
27
29
  scope: Scope;
28
30
  permission: Permission;
29
- pageId?: UUID;
31
+ pageId?: UUID | string;
30
32
  };
31
33
  type PermissionMap = Record<string, Operation[]>;
32
34
  type GlobalRole = 'super_admin';
33
35
  type OrganisationRole = 'supporter' | 'member' | 'leader' | 'org_admin';
34
36
  type EventAppRole = 'viewer' | 'participant' | 'planner' | 'event_admin';
35
- type AuditEventType = 'permission_check' | 'permission_denied' | 'role_granted' | 'role_revoked' | 'rls_denied';
37
+ type AuditEventType = 'permission_check' | 'permission_denied' | 'role_granted' | 'role_denied' | 'rls_denied';
36
38
  type AuditEventSource = 'api' | 'ui' | 'middleware' | 'rls';
37
39
  interface RBACAuditEvent {
38
40
  id: UUID;
@@ -55,18 +57,23 @@ interface PermissionCacheKey {
55
57
  organisationId?: UUID;
56
58
  eventId?: string;
57
59
  appId?: UUID;
60
+ permission?: Permission;
61
+ pageId?: UUID | string;
58
62
  }
59
- interface UsePermissionsReturn {
60
- permissions: PermissionMap;
61
- isLoading: boolean;
62
- error: Error | null;
63
- refetch: () => Promise<void>;
64
- }
65
- interface UseCanReturn {
66
- can: boolean;
63
+ interface UserRBACContext {
64
+ user: any;
65
+ globalRole: GlobalRole | null;
66
+ organisationRole: OrganisationRole | null;
67
+ eventAppRole: EventAppRole | null;
68
+ hasPermission: (operation: Operation, targetPageId?: string) => Promise<boolean>;
69
+ hasGlobalPermission: (permission: Permission) => boolean;
70
+ isSuperAdmin: boolean;
71
+ isOrgAdmin: boolean;
72
+ isEventAdmin: boolean;
73
+ canManageOrganisation: boolean;
74
+ canManageEvent: boolean;
67
75
  isLoading: boolean;
68
76
  error: Error | null;
69
- check: () => Promise<void>;
70
77
  }
71
78
  declare class RBACError extends Error {
72
79
  code: string;
@@ -391,7 +398,7 @@ interface RoleGrantedAuditEvent {
391
398
  * Audit event payload for role revoked
392
399
  */
393
400
  interface RoleRevokedAuditEvent {
394
- type: 'role_revoked';
401
+ type: 'role_denied';
395
402
  userId: UUID;
396
403
  organisationId: UUID;
397
404
  eventId?: string;
@@ -516,6 +523,26 @@ declare function getGlobalAuditManager(): RBACAuditManager | null;
516
523
  */
517
524
  declare function emitAuditEvent(event: AuditEventPayload): Promise<void>;
518
525
 
526
+ /**
527
+ * RBAC Security Enhancements
528
+ * @package @jmruthers/pace-core
529
+ * @module RBAC/Security
530
+ * @since 1.0.0
531
+ *
532
+ * Additional security measures for the RBAC system
533
+ */
534
+
535
+ /**
536
+ * Security context for RBAC operations
537
+ */
538
+ interface SecurityContext {
539
+ userId: UUID;
540
+ organisationId: UUID;
541
+ ipAddress?: string;
542
+ userAgent?: string;
543
+ timestamp: Date;
544
+ }
545
+
519
546
  /**
520
547
  * RBAC Core Engine
521
548
  * @package @jmruthers/pace-core
@@ -532,14 +559,16 @@ declare function emitAuditEvent(event: AuditEventPayload): Promise<void>;
532
559
  */
533
560
  declare class RBACEngine {
534
561
  private supabase;
562
+ private securityMiddleware;
535
563
  constructor(supabase: SupabaseClient<Database>);
536
564
  /**
537
565
  * Check if a user has a specific permission
538
566
  *
539
567
  * @param input - Permission check input
568
+ * @param securityContext - Optional security context for enhanced validation
540
569
  * @returns Promise resolving to permission result
541
570
  */
542
- isPermitted(input: PermissionCheck): Promise<boolean>;
571
+ isPermitted(input: PermissionCheck, securityContext?: SecurityContext): Promise<boolean>;
543
572
  /**
544
573
  * Get user's access level in a scope
545
574
  *
@@ -567,6 +596,30 @@ declare class RBACEngine {
567
596
  * @returns Promise resolving to super admin status
568
597
  */
569
598
  private checkSuperAdmin;
599
+ /**
600
+ * Get app configuration including requires_event setting
601
+ *
602
+ * @param appId - App ID
603
+ * @returns Promise resolving to app configuration
604
+ */
605
+ getAppConfig(appId: UUID): Promise<{
606
+ requires_event: boolean;
607
+ } | null>;
608
+ /**
609
+ * Resolve organisation ID from event ID
610
+ *
611
+ * @param eventId - Event ID
612
+ * @returns Promise resolving to organisation ID
613
+ */
614
+ private resolveOrganisationFromEvent;
615
+ /**
616
+ * Validate context requirements based on app configuration
617
+ *
618
+ * @param scope - Permission scope
619
+ * @param appId - Optional app ID
620
+ * @returns Promise resolving to validated scope with resolved organisation ID
621
+ */
622
+ private validateContextRequirements;
570
623
  /**
571
624
  * Collect active grants for a user in a scope
572
625
  *
@@ -627,6 +680,14 @@ declare class RBACEngine {
627
680
  * @returns True if permissions match
628
681
  */
629
682
  private permissionMatches;
683
+ /**
684
+ * Resolve a page ID to UUID if it's a page name
685
+ *
686
+ * @param pageId - Page ID (UUID) or page name (string)
687
+ * @param appId - App ID to look up the page
688
+ * @returns Resolved page ID (UUID) or original pageId if it's already a UUID or can't be resolved
689
+ */
690
+ private resolvePageId;
630
691
  }
631
692
  /**
632
693
  * Create an RBAC engine instance
@@ -636,950 +697,1014 @@ declare class RBACEngine {
636
697
  */
637
698
  declare function createRBACEngine(supabase: SupabaseClient<Database>): RBACEngine;
638
699
 
700
+ interface PagePermissionContextType {
701
+ /** Check if user has permission for a page */
702
+ hasPagePermission: (pageName: string, operation: string, pageId?: string, scope?: Scope) => boolean;
703
+ /** Get all page permissions for current user */
704
+ getPagePermissions: () => Record<string, string[]>;
705
+ /** Check if page permission checking is enabled */
706
+ isEnabled: boolean;
707
+ /** Check if strict mode is enabled */
708
+ isStrictMode: boolean;
709
+ /** Check if audit logging is enabled */
710
+ isAuditLogEnabled: boolean;
711
+ /** Get page access history */
712
+ getPageAccessHistory: () => PageAccessRecord[];
713
+ /** Clear page access history */
714
+ clearPageAccessHistory: () => void;
715
+ }
716
+ interface PageAccessRecord {
717
+ pageName: string;
718
+ operation: string;
719
+ userId: UUID;
720
+ scope: Scope;
721
+ allowed: boolean;
722
+ timestamp: string;
723
+ pageId?: string;
724
+ }
725
+ interface PagePermissionProviderProps {
726
+ /** Child components */
727
+ children: React__default.ReactNode;
728
+ /** Enable strict mode to prevent bypassing (default: true) */
729
+ strictMode?: boolean;
730
+ /** Enable audit logging (default: true) */
731
+ auditLog?: boolean;
732
+ /** Callback when page access is attempted */
733
+ onPageAccess?: (pageName: string, operation: string, allowed: boolean, record: PageAccessRecord) => void;
734
+ /** Callback when strict mode violation occurs */
735
+ onStrictModeViolation?: (pageName: string, operation: string, record: PageAccessRecord) => void;
736
+ /** Maximum number of access records to keep in history */
737
+ maxHistorySize?: number;
738
+ }
639
739
  /**
640
- * RBAC React Hooks
641
- * @package @jmruthers/pace-core
642
- * @module RBAC/Hooks
643
- * @since 1.0.0
644
- *
645
- * This module provides React hooks for RBAC functionality.
646
- */
647
-
648
- /**
649
- * Hook to get user's permissions in a scope
650
- *
651
- * @param userId - User ID
652
- * @param scope - Permission scope
653
- * @returns Permission data and loading state
654
- *
655
- * @example
656
- * ```tsx
657
- * function MyComponent() {
658
- * const { permissions, isLoading, error } = usePermissions(
659
- * 'user-123',
660
- * { organisationId: 'org-456' }
661
- * );
740
+ * PagePermissionProvider - Manages page-level permissions across the app
662
741
  *
663
- * if (isLoading) return <div>Loading...</div>;
664
- * if (error) return <div>Error: {error.message}</div>;
742
+ * This provider ensures that all pages are properly protected and provides
743
+ * centralized page permission management with strict enforcement.
665
744
  *
666
- * return (
667
- * <div>
668
- * {permissions['page-1']?.includes('read') && <ReadButton />}
669
- * {permissions['page-1']?.includes('manage') && <ManageButton />}
670
- * </div>
671
- * );
672
- * }
673
- * ```
745
+ * @param props - Provider props
746
+ * @returns React element with page permission context
674
747
  */
675
- declare function usePermissions(userId: UUID, scope: Scope): UsePermissionsReturn;
748
+ declare function PagePermissionProvider({ children, strictMode, auditLog, onPageAccess, onStrictModeViolation, maxHistorySize }: PagePermissionProviderProps): react_jsx_runtime.JSX.Element;
676
749
  /**
677
- * Hook to check if user has a specific permission
678
- *
679
- * @param userId - User ID
680
- * @param scope - Permission scope
681
- * @param permission - Permission to check
682
- * @param pageId - Optional page ID
683
- * @param useCache - Whether to use cached results (default: true)
684
- * @returns Permission check result and loading state
685
- *
686
- * @example
687
- * ```tsx
688
- * function MyComponent() {
689
- * const { can, isLoading } = useCan(
690
- * 'user-123',
691
- * { organisationId: 'org-456' },
692
- * 'manage:events',
693
- * 'page-789'
694
- * );
695
- *
696
- * if (isLoading) return <div>Checking permission...</div>;
750
+ * Hook to use page permission context
697
751
  *
698
- * return (
699
- * <div>
700
- * {can ? <AdminPanel /> : <AccessDenied />}
701
- * </div>
702
- * );
703
- * }
704
- * ```
752
+ * @returns Page permission context
753
+ * @throws Error if used outside of PagePermissionProvider
705
754
  */
706
- declare function useCan(userId: UUID, scope: Scope, permission: Permission, pageId?: UUID, useCache?: boolean): UseCanReturn;
755
+ declare function usePagePermissions(): PagePermissionContextType;
756
+
757
+ interface PagePermissionGuardProps {
758
+ /** Name of the page being protected */
759
+ pageName: string;
760
+ /** Operation being performed on the page */
761
+ operation: 'read' | 'create' | 'update' | 'delete';
762
+ /** Content to render when user has permission */
763
+ children: React__default.ReactNode;
764
+ /** Content to render when user lacks permission */
765
+ fallback?: React__default.ReactNode;
766
+ /** Enable strict mode to prevent bypassing (default: true) */
767
+ strictMode?: boolean;
768
+ /** Force audit logging for this page access (default: true) */
769
+ auditLog?: boolean;
770
+ /** Custom page ID for permission checking */
771
+ pageId?: string;
772
+ /** Custom scope for permission checking */
773
+ scope?: Scope;
774
+ /** Callback when access is denied */
775
+ onDenied?: (pageName: string, operation: string) => void;
776
+ /** Loading state content */
777
+ loading?: React__default.ReactNode;
778
+ }
707
779
  /**
708
- * Hook to get user's access level in a scope
709
- *
710
- * @param userId - User ID
711
- * @param scope - Permission scope
712
- * @returns Access level and loading state
713
- *
714
- * @example
715
- * ```tsx
716
- * function MyComponent() {
717
- * const { accessLevel, isLoading } = useAccessLevel(
718
- * 'user-123',
719
- * { organisationId: 'org-456' }
720
- * );
780
+ * PagePermissionGuard - Enforces page-level permissions
721
781
  *
722
- * if (isLoading) return <div>Loading...</div>;
782
+ * This component ensures that users can only access pages they have permission for.
783
+ * It integrates with the existing RBAC system and provides strict enforcement to
784
+ * prevent apps from bypassing permission checks.
723
785
  *
724
- * return (
725
- * <div>
726
- * {accessLevel === 'super' && <SuperAdminPanel />}
727
- * {accessLevel === 'admin' && <AdminPanel />}
728
- * {accessLevel === 'planner' && <PlannerPanel />}
729
- * </div>
730
- * );
731
- * }
732
- * ```
786
+ * @param props - Component props
787
+ * @returns React element with permission enforcement
733
788
  */
734
- declare function useAccessLevel(userId: UUID, scope: Scope): {
735
- accessLevel: AccessLevel | null;
736
- isLoading: boolean;
737
- error: Error | null;
738
- refetch: () => Promise<void>;
739
- };
789
+ declare function PagePermissionGuard({ pageName, operation, children, fallback, strictMode, auditLog, pageId, scope, onDenied, loading }: PagePermissionGuardProps): react_jsx_runtime.JSX.Element;
790
+
791
+ interface DataAccessRecord {
792
+ table: string;
793
+ operation: string;
794
+ userId: UUID;
795
+ scope: Scope;
796
+ allowed: boolean;
797
+ timestamp: string;
798
+ query?: string;
799
+ filters?: Record<string, any>;
800
+ }
801
+ interface SecureDataContextType {
802
+ /** Check if data access is allowed for a table and operation */
803
+ isDataAccessAllowed: (table: string, operation: string, scope?: Scope) => boolean;
804
+ /** Get all data access permissions for current user */
805
+ getDataAccessPermissions: () => Record<string, string[]>;
806
+ /** Check if secure data access is enabled */
807
+ isEnabled: boolean;
808
+ /** Check if strict mode is enabled */
809
+ isStrictMode: boolean;
810
+ /** Check if audit logging is enabled */
811
+ isAuditLogEnabled: boolean;
812
+ /** Get data access history */
813
+ getDataAccessHistory: () => DataAccessRecord[];
814
+ /** Clear data access history */
815
+ clearDataAccessHistory: () => void;
816
+ /** Validate data access attempt */
817
+ validateDataAccess: (table: string, operation: string, scope?: Scope) => boolean;
818
+ }
819
+ interface SecureDataProviderProps {
820
+ /** Child components */
821
+ children: React__default.ReactNode;
822
+ /** Enable strict mode to prevent bypassing (default: true) */
823
+ strictMode?: boolean;
824
+ /** Enable audit logging (default: true) */
825
+ auditLog?: boolean;
826
+ /** Callback when data access is attempted */
827
+ onDataAccess?: (table: string, operation: string, allowed: boolean, record: DataAccessRecord) => void;
828
+ /** Callback when strict mode violation occurs */
829
+ onStrictModeViolation?: (table: string, operation: string, record: DataAccessRecord) => void;
830
+ /** Maximum number of access records to keep in history */
831
+ maxHistorySize?: number;
832
+ /** Enable RLS enforcement (default: true) */
833
+ enforceRLS?: boolean;
834
+ }
740
835
  /**
741
- * Hook to check multiple permissions at once
742
- *
743
- * @param userId - User ID
744
- * @param scope - Permission scope
745
- * @param permissions - Array of permissions to check
746
- * @param pageId - Optional page ID
747
- * @param useCache - Whether to use cached results (default: true)
748
- * @returns Object with permission results and loading state
836
+ * SecureDataProvider - Prevents direct Supabase access and enforces secure data patterns
749
837
  *
750
- * @example
751
- * ```tsx
752
- * function MyComponent() {
753
- * const { permissions, isLoading } = useMultiplePermissions(
754
- * 'user-123',
755
- * { organisationId: 'org-456' },
756
- * ['read:events', 'manage:events', 'delete:events']
757
- * );
838
+ * This provider ensures that all data access goes through the secure RBAC system
839
+ * and prevents apps from bypassing data access controls.
758
840
  *
759
- * return (
760
- * <div>
761
- * {permissions['read:events'] && <ReadButton />}
762
- * {permissions['manage:events'] && <ManageButton />}
763
- * {permissions['delete:events'] && <DeleteButton />}
764
- * </div>
765
- * );
766
- * }
767
- * ```
841
+ * @param props - Provider props
842
+ * @returns React element with secure data context
768
843
  */
769
- declare function useMultiplePermissions(userId: UUID, scope: Scope, permissions: Permission[], pageId?: UUID, useCache?: boolean): {
770
- permissions: Record<Permission, boolean>;
771
- isLoading: boolean;
772
- error: Error | null;
773
- refetch: () => Promise<void>;
774
- };
844
+ declare function SecureDataProvider({ children, strictMode, auditLog, onDataAccess, onStrictModeViolation, maxHistorySize, enforceRLS }: SecureDataProviderProps): react_jsx_runtime.JSX.Element;
775
845
  /**
776
- * Hook to check if user has any of the specified permissions
846
+ * Hook to use secure data context
777
847
  *
778
- * @param userId - User ID
779
- * @param scope - Permission scope
780
- * @param permissions - Array of permissions to check
781
- * @param pageId - Optional page ID
782
- * @returns True if user has any permission and loading state
783
- *
784
- * @example
785
- * ```tsx
786
- * function MyComponent() {
787
- * const { hasAny, isLoading } = useHasAnyPermission(
788
- * 'user-123',
789
- * { organisationId: 'org-456' },
790
- * ['read:events', 'manage:events']
791
- * );
792
- *
793
- * return (
794
- * <div>
795
- * {hasAny ? <EventContent /> : <AccessDenied />}
796
- * </div>
797
- * );
798
- * }
799
- * ```
848
+ * @returns Secure data context
849
+ * @throws Error if used outside of SecureDataProvider
800
850
  */
801
- declare function useHasAnyPermission(userId: UUID, scope: Scope, permissions: Permission[], pageId?: UUID): {
802
- hasAny: boolean;
803
- isLoading: boolean;
804
- error: Error | null;
805
- refetch: () => Promise<void>;
806
- };
851
+ declare function useSecureData(): SecureDataContextType;
852
+
853
+ interface PermissionEnforcerProps {
854
+ /** Permissions required for access */
855
+ permissions: Permission[];
856
+ /** Operation being performed */
857
+ operation: string;
858
+ /** Content to render when user has permission */
859
+ children: React__default.ReactNode;
860
+ /** Content to render when user lacks permission */
861
+ fallback?: React__default.ReactNode;
862
+ /** Enable strict mode to prevent bypassing (default: true) */
863
+ strictMode?: boolean;
864
+ /** Force audit logging for this operation (default: true) */
865
+ auditLog?: boolean;
866
+ /** Custom scope for permission checking */
867
+ scope?: Scope;
868
+ /** Callback when access is denied */
869
+ onDenied?: (permissions: Permission[], operation: string) => void;
870
+ /** Loading state content */
871
+ loading?: React__default.ReactNode;
872
+ /** Require all permissions (AND) or any permission (OR) */
873
+ requireAll?: boolean;
874
+ }
807
875
  /**
808
- * Hook to check if user has all of the specified permissions
809
- *
810
- * @param userId - User ID
811
- * @param scope - Permission scope
812
- * @param permissions - Array of permissions to check
813
- * @param pageId - Optional page ID
814
- * @returns True if user has all permissions and loading state
876
+ * PermissionEnforcer - Enforces permissions for operations
815
877
  *
816
- * @example
817
- * ```tsx
818
- * function MyComponent() {
819
- * const { hasAll, isLoading } = useHasAllPermissions(
820
- * 'user-123',
821
- * { organisationId: 'org-456' },
822
- * ['read:events', 'manage:events']
823
- * );
878
+ * This component ensures that users can only perform operations they have permission for.
879
+ * It integrates with the existing RBAC system and provides strict enforcement to
880
+ * prevent apps from bypassing permission checks.
824
881
  *
825
- * return (
826
- * <div>
827
- * {hasAll ? <FullAccessPanel /> : <LimitedAccessPanel />}
828
- * </div>
829
- * );
830
- * }
831
- * ```
882
+ * @param props - Component props
883
+ * @returns React element with permission enforcement
832
884
  */
833
- declare function useHasAllPermissions(userId: UUID, scope: Scope, permissions: Permission[], pageId?: UUID): {
834
- hasAll: boolean;
835
- isLoading: boolean;
836
- error: Error | null;
837
- refetch: () => Promise<void>;
838
- };
885
+ declare function PermissionEnforcer({ permissions, operation, children, fallback, strictMode, auditLog, scope, onDenied, loading, requireAll }: PermissionEnforcerProps): react_jsx_runtime.JSX.Element;
886
+
887
+ interface RouteConfig {
888
+ /** Route path */
889
+ path: string;
890
+ /** React component to render */
891
+ component: React__default.ComponentType;
892
+ /** Permissions required for this route */
893
+ permissions: Permission[];
894
+ /** Roles that can access this route */
895
+ roles?: string[];
896
+ /** Minimum access level required */
897
+ accessLevel?: AccessLevel;
898
+ /** Page ID for permission checking */
899
+ pageId?: string;
900
+ /** Enable strict mode for this route */
901
+ strictMode?: boolean;
902
+ /** Route metadata */
903
+ meta?: {
904
+ title?: string;
905
+ description?: string;
906
+ requiresAuth?: boolean;
907
+ hidden?: boolean;
908
+ };
909
+ }
910
+ interface RouteAccessRecord {
911
+ route: string;
912
+ permissions: Permission[];
913
+ userId: UUID;
914
+ scope: Scope;
915
+ allowed: boolean;
916
+ timestamp: string;
917
+ pageId?: string;
918
+ roles?: string[];
919
+ accessLevel?: AccessLevel;
920
+ }
921
+ interface RoleBasedRouterContextType {
922
+ /** Get all accessible routes for current user */
923
+ getAccessibleRoutes: () => RouteConfig[];
924
+ /** Check if user can access a specific route */
925
+ canAccessRoute: (path: string) => boolean;
926
+ /** Get route configuration for a path */
927
+ getRouteConfig: (path: string) => RouteConfig | null;
928
+ /** Get route access history */
929
+ getRouteAccessHistory: () => RouteAccessRecord[];
930
+ /** Clear route access history */
931
+ clearRouteAccessHistory: () => void;
932
+ /** Check if strict mode is enabled */
933
+ isStrictMode: boolean;
934
+ /** Check if audit logging is enabled */
935
+ isAuditLogEnabled: boolean;
936
+ }
937
+ interface RoleBasedRouterProps {
938
+ /** Route configuration */
939
+ routes: RouteConfig[];
940
+ /** Fallback route for unauthorized access */
941
+ fallbackRoute?: string;
942
+ /** Child components */
943
+ children: React__default.ReactNode;
944
+ /** Enable strict mode to prevent bypassing (default: true) */
945
+ strictMode?: boolean;
946
+ /** Enable audit logging (default: true) */
947
+ auditLog?: boolean;
948
+ /** Callback when route access is attempted */
949
+ onRouteAccess?: (route: string, allowed: boolean, record: RouteAccessRecord) => void;
950
+ /** Callback when strict mode violation occurs */
951
+ onStrictModeViolation?: (route: string, record: RouteAccessRecord) => void;
952
+ /** Maximum number of access records to keep in history */
953
+ maxHistorySize?: number;
954
+ /** Custom unauthorized component */
955
+ unauthorizedComponent?: React__default.ComponentType<{
956
+ route: string;
957
+ reason: string;
958
+ }>;
959
+ }
839
960
  /**
840
- * Hook to read cached permissions (contract requirement)
841
- *
842
- * This hook only reads from the core cache and does not perform
843
- * any bespoke caching as per the contract requirements.
844
- *
845
- * @param userId - User ID
846
- * @param scope - Permission scope
847
- * @returns Cached permission data and loading state
848
- *
849
- * @example
850
- * ```tsx
851
- * function MyComponent() {
852
- * const { permissions, isLoading, error } = useCachedPermissions(
853
- * 'user-123',
854
- * { organisationId: 'org-456' }
855
- * );
961
+ * RoleBasedRouter - Centralized routing control with role-based protection
856
962
  *
857
- * if (isLoading) return <div>Loading cached permissions...</div>;
858
- * if (error) return <div>Error: {error.message}</div>;
963
+ * This component ensures that all routes are properly protected and provides
964
+ * centralized routing control to prevent apps from bypassing route protection.
859
965
  *
860
- * return (
861
- * <div>
862
- * {permissions['page-1']?.includes('read') && <ReadButton />}
863
- * {permissions['page-1']?.includes('manage') && <ManageButton />}
864
- * </div>
865
- * );
866
- * }
867
- * ```
966
+ * @param props - Router props
967
+ * @returns React element with role-based routing
868
968
  */
869
- declare function useCachedPermissions(userId: UUID, scope: Scope): {
870
- permissions: PermissionMap;
871
- isLoading: boolean;
872
- error: Error | null;
873
- refetch: () => Promise<void>;
874
- };
875
-
969
+ declare function RoleBasedRouter({ routes, fallbackRoute, children, strictMode, auditLog, onRouteAccess, onStrictModeViolation, maxHistorySize, unauthorizedComponent: UnauthorizedComponent }: RoleBasedRouterProps): react_jsx_runtime.JSX.Element;
876
970
  /**
877
- * RBAC Adapters
878
- * @package @jmruthers/pace-core
879
- * @module RBAC/Adapters
880
- * @since 1.0.0
971
+ * Hook to use role-based router context
881
972
  *
882
- * This module provides adapters for different frameworks and server runtimes.
973
+ * @returns Role-based router context
974
+ * @throws Error if used outside of RoleBasedRouter
883
975
  */
976
+ declare function useRoleBasedRouter(): RoleBasedRouterContextType;
884
977
 
978
+ interface NavigationItem {
979
+ /** Unique identifier for the navigation item */
980
+ id: string;
981
+ /** Display label for the navigation item */
982
+ label: string;
983
+ /** Navigation path/URL */
984
+ path: string;
985
+ /** Permissions required for this navigation item */
986
+ permissions: Permission[];
987
+ /** Roles that can access this navigation item */
988
+ roles?: string[];
989
+ /** Minimum access level required */
990
+ accessLevel?: 'viewer' | 'participant' | 'planner' | 'admin' | 'super';
991
+ /** Page ID for permission checking */
992
+ pageId?: string;
993
+ /** Enable strict mode for this navigation item */
994
+ strictMode?: boolean;
995
+ /** Navigation item metadata */
996
+ meta?: {
997
+ icon?: string;
998
+ description?: string;
999
+ hidden?: boolean;
1000
+ order?: number;
1001
+ };
1002
+ }
1003
+ interface NavigationAccessRecord {
1004
+ navigationItem: string;
1005
+ permissions: Permission[];
1006
+ userId: UUID;
1007
+ scope: Scope;
1008
+ allowed: boolean;
1009
+ timestamp: string;
1010
+ pageId?: string;
1011
+ roles?: string[];
1012
+ accessLevel?: string;
1013
+ }
1014
+ interface NavigationContextType {
1015
+ /** Check if user has permission for a navigation item */
1016
+ hasNavigationPermission: (item: NavigationItem) => boolean;
1017
+ /** Get all navigation permissions for current user */
1018
+ getNavigationPermissions: () => Record<string, string[]>;
1019
+ /** Get filtered navigation items based on permissions */
1020
+ getFilteredNavigationItems: (items: NavigationItem[]) => NavigationItem[];
1021
+ /** Check if navigation permission checking is enabled */
1022
+ isEnabled: boolean;
1023
+ /** Check if strict mode is enabled */
1024
+ isStrictMode: boolean;
1025
+ /** Check if audit logging is enabled */
1026
+ isAuditLogEnabled: boolean;
1027
+ /** Get navigation access history */
1028
+ getNavigationAccessHistory: () => NavigationAccessRecord[];
1029
+ /** Clear navigation access history */
1030
+ clearNavigationAccessHistory: () => void;
1031
+ }
1032
+ interface NavigationProviderProps {
1033
+ /** Child components */
1034
+ children: React__default.ReactNode;
1035
+ /** Enable strict mode to prevent bypassing (default: true) */
1036
+ strictMode?: boolean;
1037
+ /** Enable audit logging (default: true) */
1038
+ auditLog?: boolean;
1039
+ /** Callback when navigation access is attempted */
1040
+ onNavigationAccess?: (item: NavigationItem, allowed: boolean, record: NavigationAccessRecord) => void;
1041
+ /** Callback when strict mode violation occurs */
1042
+ onStrictModeViolation?: (item: NavigationItem, record: NavigationAccessRecord) => void;
1043
+ /** Maximum number of access records to keep in history */
1044
+ maxHistorySize?: number;
1045
+ }
885
1046
  /**
886
- * Permission Guard Component
1047
+ * NavigationProvider - Manages navigation-level permissions across the app
887
1048
  *
888
- * A React component that conditionally renders children based on permissions.
889
- * Can auto-infer userId from context if not provided.
1049
+ * This provider ensures that all navigation items are properly protected and provides
1050
+ * centralized navigation permission management with strict enforcement.
890
1051
  *
891
- * @example
892
- * ```tsx
893
- * // With explicit userId and scope
894
- * <PermissionGuard
895
- * userId="user-123"
896
- * scope={{ organisationId: 'org-456' }}
897
- * permission="manage:events"
898
- * pageId="page-789"
899
- * fallback={<AccessDenied />}
900
- * >
901
- * <AdminPanel />
902
- * </PermissionGuard>
1052
+ * @param props - Provider props
1053
+ * @returns React element with navigation permission context
1054
+ */
1055
+ declare function NavigationProvider({ children, strictMode, auditLog, onNavigationAccess, onStrictModeViolation, maxHistorySize }: NavigationProviderProps): react_jsx_runtime.JSX.Element;
1056
+ /**
1057
+ * Hook to use navigation permission context
903
1058
  *
904
- * // With context inference (requires auth context)
905
- * <PermissionGuard
906
- * permission="manage:events"
907
- * scope={{ organisationId: 'org-456' }}
908
- * fallback={<AccessDenied />}
909
- * >
910
- * <AdminPanel />
911
- * </PermissionGuard>
912
- * ```
1059
+ * @returns Navigation permission context
1060
+ * @throws Error if used outside of NavigationProvider
913
1061
  */
914
- declare function PermissionGuard({ userId, scope, permission, pageId, children, fallback, onDenied, loading, strictMode, auditLog, enforceAudit, }: {
915
- userId?: UUID;
916
- scope: {
917
- organisationId: UUID;
918
- eventId?: string;
919
- appId?: UUID;
920
- };
921
- permission: Permission;
922
- pageId?: UUID;
923
- children: ReactNode;
924
- fallback?: ReactNode;
925
- onDenied?: () => void;
926
- loading?: ReactNode;
1062
+ declare function useNavigationPermissions(): NavigationContextType;
1063
+
1064
+ interface NavigationGuardProps {
1065
+ /** Navigation item being protected */
1066
+ navigationItem: NavigationItem;
1067
+ /** Content to render when user has permission */
1068
+ children: React__default.ReactNode;
1069
+ /** Content to render when user lacks permission */
1070
+ fallback?: React__default.ReactNode;
1071
+ /** Enable strict mode to prevent bypassing (default: true) */
927
1072
  strictMode?: boolean;
1073
+ /** Force audit logging for this navigation access (default: true) */
928
1074
  auditLog?: boolean;
929
- enforceAudit?: boolean;
930
- }): React__default.ReactNode;
1075
+ /** Custom scope for permission checking */
1076
+ scope?: Scope;
1077
+ /** Callback when access is denied */
1078
+ onDenied?: (item: NavigationItem) => void;
1079
+ /** Loading state content */
1080
+ loading?: React__default.ReactNode;
1081
+ /** Require all permissions (AND) or any permission (OR) */
1082
+ requireAll?: boolean;
1083
+ }
931
1084
  /**
932
- * Access Level Guard Component
933
- *
934
- * A React component that conditionally renders children based on access level.
935
- * Can auto-infer userId from context if not provided.
1085
+ * NavigationGuard - Enforces navigation-level permissions
936
1086
  *
937
- * @example
938
- * ```tsx
939
- * // With explicit userId and scope
940
- * <AccessLevelGuard
941
- * userId="user-123"
942
- * scope={{ organisationId: 'org-456' }}
943
- * minLevel="admin"
944
- * fallback={<AccessDenied />}
945
- * >
946
- * <AdminPanel />
947
- * </AccessLevelGuard>
1087
+ * This component ensures that users can only access navigation items they have permission for.
1088
+ * It integrates with the existing RBAC system and provides strict enforcement to
1089
+ * prevent apps from bypassing navigation permission checks.
948
1090
  *
949
- * // With context inference (requires auth context)
950
- * <AccessLevelGuard
951
- * minLevel="admin"
952
- * scope={{ organisationId: 'org-456' }}
953
- * fallback={<AccessDenied />}
954
- * >
955
- * <AdminPanel />
956
- * </AccessLevelGuard>
957
- * ```
1091
+ * @param props - Component props
1092
+ * @returns React element with navigation permission enforcement
958
1093
  */
959
- declare function AccessLevelGuard({ userId, scope, minLevel, children, fallback, loading, }: {
960
- userId?: UUID;
961
- scope: {
962
- organisationId: UUID;
963
- eventId?: string;
964
- appId?: UUID;
965
- };
966
- minLevel: 'viewer' | 'participant' | 'planner' | 'admin' | 'super';
967
- children: ReactNode;
968
- fallback?: ReactNode;
969
- loading?: ReactNode;
970
- }): React__default.ReactNode;
1094
+ declare function NavigationGuard({ navigationItem, children, fallback, strictMode, auditLog, scope, onDenied, loading, requireAll }: NavigationGuardProps): react_jsx_runtime.JSX.Element;
1095
+
1096
+ interface EnhancedNavigationMenuProps {
1097
+ /** Navigation items to display */
1098
+ items: NavigationItem[];
1099
+ /** Enable strict mode to prevent bypassing (default: true) */
1100
+ strictMode?: boolean;
1101
+ /** Enable audit logging (default: true) */
1102
+ auditLog?: boolean;
1103
+ /** Callback when navigation access is attempted */
1104
+ onNavigationAccess?: (item: NavigationItem, allowed: boolean) => void;
1105
+ /** Callback when strict mode violation occurs */
1106
+ onStrictModeViolation?: (item: NavigationItem) => void;
1107
+ /** Custom className for the navigation menu */
1108
+ className?: string;
1109
+ /** Custom className for navigation items */
1110
+ itemClassName?: string;
1111
+ /** Custom className for active navigation items */
1112
+ activeItemClassName?: string;
1113
+ /** Custom className for disabled navigation items */
1114
+ disabledItemClassName?: string;
1115
+ /** Show/hide navigation items that user doesn't have permission for */
1116
+ hideUnauthorizedItems?: boolean;
1117
+ /** Custom render function for navigation items */
1118
+ renderItem?: (item: NavigationItem, isAuthorized: boolean) => React__default.ReactNode;
1119
+ /** Current active path for highlighting */
1120
+ activePath?: string;
1121
+ /** Navigation item click handler */
1122
+ onItemClick?: (item: NavigationItem) => void;
1123
+ }
971
1124
  /**
972
- * Permission Guard for Server Handlers
973
- *
974
- * Wraps a server handler with permission checking.
1125
+ * EnhancedNavigationMenu - Secure navigation menu with RBAC integration
975
1126
  *
976
- * @param config - Permission guard configuration
977
- * @param handler - Handler function to wrap
978
- * @returns Wrapped handler function
1127
+ * This component provides a navigation menu that automatically filters items based on
1128
+ * user permissions and enforces strict security controls.
979
1129
  *
980
- * @example
981
- * ```typescript
982
- * const protectedHandler = withPermissionGuard(
983
- * { permission: 'manage:events', pageId: 'page-789' },
984
- * async (req, res) => {
985
- * // Handler logic here
986
- * res.json({ success: true });
987
- * }
988
- * );
989
- * ```
1130
+ * @param props - Component props
1131
+ * @returns React element with enhanced navigation menu
990
1132
  */
991
- declare function withPermissionGuard<T extends any[]>(config: {
992
- permission: Permission;
993
- pageId?: UUID;
994
- }, handler: (...args: T) => Promise<any>): (...args: T) => Promise<any>;
1133
+ declare function EnhancedNavigationMenu({ items, strictMode, auditLog, onNavigationAccess, onStrictModeViolation, className, itemClassName, activeItemClassName, disabledItemClassName, hideUnauthorizedItems, renderItem, activePath, onItemClick }: EnhancedNavigationMenuProps): react_jsx_runtime.JSX.Element;
1134
+
995
1135
  /**
996
- * Access Level Guard for Server Handlers
1136
+ * @file RBAC Hook
1137
+ * @package @jmruthers/pace-core
1138
+ * @module RBAC/Hooks
1139
+ * @since 0.3.0
997
1140
  *
998
- * Wraps a server handler with access level checking.
1141
+ * A React hook that provides access to the new RBAC (Role-Based Access Control) system.
1142
+ * This hook integrates with the database to provide real-time role and permission information.
999
1143
  *
1000
- * @param minLevel - Minimum access level required
1001
- * @param handler - Handler function to wrap
1002
- * @returns Wrapped handler function
1144
+ * Features:
1145
+ * - Real-time role detection (global, organisation, event-app)
1146
+ * - Permission checking with database validation
1147
+ * - Hierarchical permission resolution
1148
+ * - Loading states and error handling
1149
+ * - Type-safe permission operations
1150
+ * - Automatic context detection
1003
1151
  *
1004
1152
  * @example
1005
- * ```typescript
1006
- * const adminHandler = withAccessLevelGuard(
1007
- * 'admin',
1008
- * async (req, res) => {
1009
- * // Admin-only logic here
1010
- * res.json({ success: true });
1011
- * }
1012
- * );
1153
+ * ```tsx
1154
+ * import { useRBAC } from '@jmruthers/pace-core/rbac';
1155
+ *
1156
+ * function MyComponent() {
1157
+ * const {
1158
+ * globalRole,
1159
+ * organisationRole,
1160
+ * eventAppRole,
1161
+ * hasPermission,
1162
+ * isSuperAdmin,
1163
+ * isLoading,
1164
+ * error
1165
+ * } = useRBAC();
1166
+ *
1167
+ * if (isLoading) return <div>Loading permissions...</div>;
1168
+ * if (error) return <div>Error: {error.message}</div>;
1169
+ *
1170
+ * return (
1171
+ * <div>
1172
+ * {isSuperAdmin && <AdminPanel />}
1173
+ * {hasPermission('read', 'dashboard') && <Dashboard />}
1174
+ * {hasPermission('create', 'events') && <CreateEventButton />}
1175
+ * </div>
1176
+ * );
1177
+ * }
1013
1178
  * ```
1014
- */
1015
- declare function withAccessLevelGuard<T extends any[]>(minLevel: 'viewer' | 'participant' | 'planner' | 'admin' | 'super', handler: (...args: T) => Promise<any>): (...args: T) => Promise<any>;
1016
- /**
1017
- * Role Guard for Server Handlers
1018
1179
  *
1019
- * Wraps a server handler with role-based access control.
1020
- * This is the primary middleware for routing protection as specified in the contract.
1180
+ * @accessibility
1181
+ * - No direct accessibility concerns (hook)
1182
+ * - Enables accessible permission-based UI rendering
1183
+ * - Supports screen reader friendly conditional content
1021
1184
  *
1022
- * @param config - Role guard configuration
1023
- * @param handler - Handler function to wrap
1024
- * @returns Wrapped handler function
1185
+ * @security
1186
+ * - Database-backed permission validation
1187
+ * - Hierarchical permission resolution
1188
+ * - Organisation context enforcement
1189
+ * - Real-time permission updates
1025
1190
  *
1026
- * @example
1027
- * ```typescript
1028
- * const adminHandler = withRoleGuard(
1029
- * {
1030
- * globalRoles: ['super_admin'],
1031
- * organisationRoles: ['org_admin', 'leader'],
1032
- * eventAppRoles: ['event_admin', 'planner']
1033
- * },
1034
- * async (req, res) => {
1035
- * // Admin-only logic here
1036
- * res.json({ success: true });
1037
- * }
1038
- * );
1039
- * ```
1191
+ * @performance
1192
+ * - Optimized with useMemo and useCallback
1193
+ * - Permission caching
1194
+ * - Minimal re-renders
1195
+ * - Lazy loading of permissions
1196
+ *
1197
+ * @dependencies
1198
+ * - React 18+ - Hooks and effects
1199
+ * - @supabase/supabase-js - Database integration
1200
+ * - RBAC types - Type definitions
1040
1201
  */
1041
- declare function withRoleGuard<T extends any[]>(config: {
1042
- globalRoles?: string[];
1043
- organisationRoles?: string[];
1044
- eventAppRoles?: string[];
1045
- requireAll?: boolean;
1046
- }, handler: (...args: T) => Promise<any>): (...args: T) => Promise<any>;
1202
+
1203
+ declare function useRBAC(pageId?: string): UserRBACContext;
1204
+
1047
1205
  /**
1048
- * Next.js Middleware for RBAC
1206
+ * @file RBAC Permission Hooks
1207
+ * @package @jmruthers/pace-core
1208
+ * @module RBAC/Hooks
1209
+ * @since 1.0.0
1049
1210
  *
1050
- * Middleware that checks permissions before allowing access to pages.
1211
+ * This module provides React hooks for RBAC functionality.
1212
+ */
1213
+
1214
+ /**
1215
+ * Hook to get user's permissions in a scope
1051
1216
  *
1052
- * @param config - Middleware configuration
1053
- * @returns Next.js middleware function
1217
+ * @param userId - User ID
1218
+ * @param scope - Scope for permission checking
1219
+ * @returns Permission state and methods
1054
1220
  *
1055
1221
  * @example
1056
- * ```typescript
1057
- * // middleware.ts
1058
- * import { createRBACMiddleware } from '@jmruthers/pace-core/rbac';
1222
+ * ```tsx
1223
+ * function MyComponent() {
1224
+ * const { permissions, isLoading, error } = usePermissions(userId, scope);
1059
1225
  *
1060
- * export default createRBACMiddleware({
1061
- * protectedRoutes: [
1062
- * { path: '/admin', permission: 'manage:admin' },
1063
- * { path: '/events', permission: 'read:events' },
1064
- * ],
1065
- * fallbackUrl: '/access-denied',
1066
- * });
1226
+ * if (isLoading) return <div>Loading...</div>;
1227
+ * if (error) return <div>Error: {error.message}</div>;
1228
+ *
1229
+ * return (
1230
+ * <div>
1231
+ * {permissions['read:users'] && <UserList />}
1232
+ * {permissions['create:users'] && <CreateUserButton />}
1233
+ * </div>
1234
+ * );
1235
+ * }
1067
1236
  * ```
1068
1237
  */
1069
- declare function createRBACMiddleware(config: {
1070
- protectedRoutes: Array<{
1071
- path: string;
1072
- permission: Permission;
1073
- pageId?: UUID;
1074
- }>;
1075
- fallbackUrl?: string;
1076
- }): (req: {
1077
- nextUrl: {
1078
- pathname: string;
1079
- };
1080
- user?: {
1081
- id: string;
1082
- };
1083
- organisationId?: string;
1084
- }, res: {
1085
- redirect: (url: string) => void;
1086
- }, next: () => void) => Promise<void>;
1238
+ declare function usePermissions(userId: UUID, scope: Scope): {
1239
+ permissions: PermissionMap;
1240
+ isLoading: boolean;
1241
+ error: Error | null;
1242
+ hasPermission: (permission: Permission) => boolean;
1243
+ hasAnyPermission: (permissionList: Permission[]) => boolean;
1244
+ hasAllPermissions: (permissionList: Permission[]) => boolean;
1245
+ refetch: () => Promise<void>;
1246
+ };
1087
1247
  /**
1088
- * Express Middleware for RBAC
1089
- *
1090
- * Middleware that checks permissions for Express routes.
1248
+ * Hook to check if user can perform an action
1091
1249
  *
1092
- * @param config - Middleware configuration
1093
- * @returns Express middleware function
1250
+ * @param userId - User ID
1251
+ * @param scope - Scope for permission checking
1252
+ * @param permission - Permission to check
1253
+ * @param pageId - Optional page ID
1254
+ * @param useCache - Whether to use cached results
1255
+ * @returns Permission check state and methods
1094
1256
  *
1095
1257
  * @example
1096
- * ```typescript
1097
- * import { createRBACExpressMiddleware } from '@jmruthers/pace-core/rbac';
1258
+ * ```tsx
1259
+ * function MyComponent() {
1260
+ * const { can, isLoading, error } = useCan(userId, scope, 'read:users');
1098
1261
  *
1099
- * app.use(createRBACExpressMiddleware({
1100
- * permission: 'read:api',
1101
- * pageId: 'api-page-123',
1102
- * }));
1262
+ * if (isLoading) return <div>Checking permission...</div>;
1263
+ * if (error) return <div>Error: {error.message}</div>;
1264
+ *
1265
+ * return can ? <UserList /> : <div>Access denied</div>;
1266
+ * }
1103
1267
  * ```
1104
1268
  */
1105
- declare function createRBACExpressMiddleware(config: {
1106
- permission: Permission;
1107
- pageId?: UUID;
1108
- }): (req: {
1109
- user?: {
1110
- id: string;
1111
- };
1112
- organisationId?: string;
1113
- eventId?: string;
1114
- appId?: string;
1115
- }, res: {
1116
- status: (code: number) => {
1117
- json: (data: object) => void;
1118
- };
1119
- }, next: () => void) => Promise<void>;
1269
+ declare function useCan(userId: UUID, scope: Scope, permission: Permission, pageId?: UUID, useCache?: boolean): {
1270
+ can: boolean;
1271
+ isLoading: boolean;
1272
+ error: Error | null;
1273
+ refetch: () => Promise<void>;
1274
+ };
1120
1275
  /**
1121
- * Check if a user has a permission (synchronous cache check only)
1276
+ * Hook to get user's access level in a scope
1122
1277
  *
1123
1278
  * @param userId - User ID
1124
- * @param scope - Permission scope
1125
- * @param permission - Permission to check
1126
- * @param pageId - Optional page ID
1127
- * @returns True if permission is cached and granted
1279
+ * @param scope - Scope for access level checking
1280
+ * @returns Access level state and methods
1281
+ *
1282
+ * @example
1283
+ * ```tsx
1284
+ * function MyComponent() {
1285
+ * const { accessLevel, isLoading, error } = useAccessLevel(userId, scope);
1286
+ *
1287
+ * if (isLoading) return <div>Loading access level...</div>;
1288
+ * if (error) return <div>Error: {error.message}</div>;
1289
+ *
1290
+ * return (
1291
+ * <div>
1292
+ * Access Level: {accessLevel}
1293
+ * {accessLevel >= AccessLevel.ADMIN && <AdminPanel />}
1294
+ * </div>
1295
+ * );
1296
+ * }
1297
+ * ```
1128
1298
  */
1129
- declare function hasPermissionCached(userId: UUID, scope: {
1130
- organisationId: UUID;
1131
- eventId?: string;
1132
- appId?: UUID;
1133
- }, _permission: Permission, _pageId?: UUID): boolean;
1299
+ declare function useAccessLevel(userId: UUID, scope: Scope): {
1300
+ accessLevel: AccessLevel;
1301
+ isLoading: boolean;
1302
+ error: Error | null;
1303
+ refetch: () => Promise<void>;
1304
+ };
1134
1305
  /**
1135
- * Check if a user has any of the specified permissions (synchronous cache check only)
1306
+ * Hook to check multiple permissions at once
1136
1307
  *
1137
1308
  * @param userId - User ID
1138
- * @param scope - Permission scope
1309
+ * @param scope - Scope for permission checking
1139
1310
  * @param permissions - Array of permissions to check
1140
- * @param pageId - Optional page ID
1141
- * @returns True if any permission is cached and granted
1311
+ * @param useCache - Whether to use cached results
1312
+ * @returns Multiple permission check results
1313
+ *
1314
+ * @example
1315
+ * ```tsx
1316
+ * function MyComponent() {
1317
+ * const { results, isLoading, error } = useMultiplePermissions(
1318
+ * userId,
1319
+ * scope,
1320
+ * ['read:users', 'create:users', 'update:users']
1321
+ * );
1322
+ *
1323
+ * if (isLoading) return <div>Checking permissions...</div>;
1324
+ * if (error) return <div>Error: {error.message}</div>;
1325
+ *
1326
+ * return (
1327
+ * <div>
1328
+ * {results['read:users'] && <UserList />}
1329
+ * {results['create:users'] && <CreateUserButton />}
1330
+ * {results['update:users'] && <EditUserButton />}
1331
+ * </div>
1332
+ * );
1333
+ * }
1334
+ * ```
1142
1335
  */
1143
- declare function hasAnyPermissionCached(userId: UUID, scope: {
1144
- organisationId: UUID;
1145
- eventId?: string;
1146
- appId?: UUID;
1147
- }, permissions: Permission[], pageId?: UUID): boolean;
1148
-
1149
- interface PagePermissionContextType {
1150
- /** Check if user has permission for a page */
1151
- hasPagePermission: (pageName: string, operation: string, pageId?: string, scope?: Scope) => boolean;
1152
- /** Get all page permissions for current user */
1153
- getPagePermissions: () => Record<string, string[]>;
1154
- /** Check if page permission checking is enabled */
1155
- isEnabled: boolean;
1156
- /** Check if strict mode is enabled */
1157
- isStrictMode: boolean;
1158
- /** Check if audit logging is enabled */
1159
- isAuditLogEnabled: boolean;
1160
- /** Get page access history */
1161
- getPageAccessHistory: () => PageAccessRecord[];
1162
- /** Clear page access history */
1163
- clearPageAccessHistory: () => void;
1164
- }
1165
- interface PageAccessRecord {
1166
- pageName: string;
1167
- operation: string;
1168
- userId: UUID;
1169
- scope: Scope;
1170
- allowed: boolean;
1171
- timestamp: string;
1172
- pageId?: string;
1173
- }
1174
- interface PagePermissionProviderProps {
1175
- /** Child components */
1176
- children: React__default.ReactNode;
1177
- /** Enable strict mode to prevent bypassing (default: true) */
1178
- strictMode?: boolean;
1179
- /** Enable audit logging (default: true) */
1180
- auditLog?: boolean;
1181
- /** Callback when page access is attempted */
1182
- onPageAccess?: (pageName: string, operation: string, allowed: boolean, record: PageAccessRecord) => void;
1183
- /** Callback when strict mode violation occurs */
1184
- onStrictModeViolation?: (pageName: string, operation: string, record: PageAccessRecord) => void;
1185
- /** Maximum number of access records to keep in history */
1186
- maxHistorySize?: number;
1187
- }
1336
+ declare function useMultiplePermissions(userId: UUID, scope: Scope, permissions: Permission[], useCache?: boolean): {
1337
+ results: Record<Permission, boolean>;
1338
+ isLoading: boolean;
1339
+ error: Error | null;
1340
+ refetch: () => Promise<void>;
1341
+ };
1188
1342
  /**
1189
- * PagePermissionProvider - Manages page-level permissions across the app
1343
+ * Hook to check if user has any of the specified permissions
1190
1344
  *
1191
- * This provider ensures that all pages are properly protected and provides
1192
- * centralized page permission management with strict enforcement.
1345
+ * @param userId - User ID
1346
+ * @param scope - Scope for permission checking
1347
+ * @param permissions - Array of permissions to check
1348
+ * @param useCache - Whether to use cached results
1349
+ * @returns Whether user has any of the permissions
1193
1350
  *
1194
- * @param props - Provider props
1195
- * @returns React element with page permission context
1351
+ * @example
1352
+ * ```tsx
1353
+ * function MyComponent() {
1354
+ * const { hasAny, isLoading, error } = useHasAnyPermission(
1355
+ * userId,
1356
+ * scope,
1357
+ * ['read:users', 'create:users']
1358
+ * );
1359
+ *
1360
+ * if (isLoading) return <div>Checking permissions...</div>;
1361
+ * if (error) return <div>Error: {error.message}</div>;
1362
+ *
1363
+ * return hasAny ? <UserManagementPanel /> : <div>No user permissions</div>;
1364
+ * }
1365
+ * ```
1196
1366
  */
1197
- declare function PagePermissionProvider({ children, strictMode, auditLog, onPageAccess, onStrictModeViolation, maxHistorySize }: PagePermissionProviderProps): react_jsx_runtime.JSX.Element;
1367
+ declare function useHasAnyPermission(userId: UUID, scope: Scope, permissions: Permission[], useCache?: boolean): {
1368
+ hasAny: boolean;
1369
+ isLoading: boolean;
1370
+ error: Error | null;
1371
+ refetch: () => Promise<void>;
1372
+ };
1198
1373
  /**
1199
- * Hook to use page permission context
1374
+ * Hook to check if user has all of the specified permissions
1200
1375
  *
1201
- * @returns Page permission context
1202
- * @throws Error if used outside of PagePermissionProvider
1376
+ * @param userId - User ID
1377
+ * @param scope - Scope for permission checking
1378
+ * @param permissions - Array of permissions to check
1379
+ * @param useCache - Whether to use cached results
1380
+ * @returns Whether user has all of the permissions
1381
+ *
1382
+ * @example
1383
+ * ```tsx
1384
+ * function MyComponent() {
1385
+ * const { hasAll, isLoading, error } = useHasAllPermissions(
1386
+ * userId,
1387
+ * scope,
1388
+ * ['read:users', 'create:users', 'update:users']
1389
+ * );
1390
+ *
1391
+ * if (isLoading) return <div>Checking permissions...</div>;
1392
+ * if (error) return <div>Error: {error.message}</div>;
1393
+ *
1394
+ * return hasAll ? <FullUserManagementPanel /> : <div>Insufficient permissions</div>;
1395
+ * }
1396
+ * ```
1203
1397
  */
1204
- declare function usePagePermissions(): PagePermissionContextType;
1205
-
1206
- interface PagePermissionGuardProps {
1207
- /** Name of the page being protected */
1208
- pageName: string;
1209
- /** Operation being performed on the page */
1210
- operation: 'read' | 'create' | 'update' | 'delete';
1211
- /** Content to render when user has permission */
1212
- children: React__default.ReactNode;
1213
- /** Content to render when user lacks permission */
1214
- fallback?: React__default.ReactNode;
1215
- /** Enable strict mode to prevent bypassing (default: true) */
1216
- strictMode?: boolean;
1217
- /** Force audit logging for this page access (default: true) */
1218
- auditLog?: boolean;
1219
- /** Custom page ID for permission checking */
1220
- pageId?: string;
1221
- /** Custom scope for permission checking */
1222
- scope?: Scope;
1223
- /** Callback when access is denied */
1224
- onDenied?: (pageName: string, operation: string) => void;
1225
- /** Loading state content */
1226
- loading?: React__default.ReactNode;
1227
- }
1398
+ declare function useHasAllPermissions(userId: UUID, scope: Scope, permissions: Permission[], useCache?: boolean): {
1399
+ hasAll: boolean;
1400
+ isLoading: boolean;
1401
+ error: Error | null;
1402
+ refetch: () => Promise<void>;
1403
+ };
1228
1404
  /**
1229
- * PagePermissionGuard - Enforces page-level permissions
1405
+ * Hook to get cached permissions with TTL management
1230
1406
  *
1231
- * This component ensures that users can only access pages they have permission for.
1232
- * It integrates with the existing RBAC system and provides strict enforcement to
1233
- * prevent apps from bypassing permission checks.
1407
+ * @param userId - User ID
1408
+ * @param scope - Scope for permission checking
1409
+ * @returns Cached permission state and methods
1234
1410
  *
1235
- * @param props - Component props
1236
- * @returns React element with permission enforcement
1411
+ * @example
1412
+ * ```tsx
1413
+ * function MyComponent() {
1414
+ * const { permissions, isLoading, error, invalidateCache } = useCachedPermissions(userId, scope);
1415
+ *
1416
+ * if (isLoading) return <div>Loading cached permissions...</div>;
1417
+ * if (error) return <div>Error: {error.message}</div>;
1418
+ *
1419
+ * return (
1420
+ * <div>
1421
+ * {permissions['read:users'] && <UserList />}
1422
+ * <button onClick={invalidateCache}>Refresh Permissions</button>
1423
+ * </div>
1424
+ * );
1425
+ * }
1426
+ * ```
1237
1427
  */
1238
- declare function PagePermissionGuard({ pageName, operation, children, fallback, strictMode, auditLog, pageId, scope, onDenied, loading }: PagePermissionGuardProps): react_jsx_runtime.JSX.Element;
1428
+ declare function useCachedPermissions(userId: UUID, scope: Scope): {
1429
+ permissions: PermissionMap;
1430
+ isLoading: boolean;
1431
+ error: Error | null;
1432
+ invalidateCache: () => void;
1433
+ refetch: () => Promise<void>;
1434
+ };
1239
1435
 
1240
- interface DataAccessRecord {
1241
- table: string;
1242
- operation: string;
1243
- userId: UUID;
1244
- scope: Scope;
1245
- allowed: boolean;
1246
- timestamp: string;
1247
- query?: string;
1248
- filters?: Record<string, any>;
1249
- }
1250
- interface SecureDataContextType {
1251
- /** Check if data access is allowed for a table and operation */
1252
- isDataAccessAllowed: (table: string, operation: string, scope?: Scope) => boolean;
1253
- /** Get all data access permissions for current user */
1254
- getDataAccessPermissions: () => Record<string, string[]>;
1255
- /** Check if secure data access is enabled */
1256
- isEnabled: boolean;
1257
- /** Check if strict mode is enabled */
1258
- isStrictMode: boolean;
1259
- /** Check if audit logging is enabled */
1260
- isAuditLogEnabled: boolean;
1261
- /** Get data access history */
1262
- getDataAccessHistory: () => DataAccessRecord[];
1263
- /** Clear data access history */
1264
- clearDataAccessHistory: () => void;
1265
- /** Validate data access attempt */
1266
- validateDataAccess: (table: string, operation: string, scope?: Scope) => boolean;
1267
- }
1268
- interface SecureDataProviderProps {
1269
- /** Child components */
1270
- children: React__default.ReactNode;
1271
- /** Enable strict mode to prevent bypassing (default: true) */
1272
- strictMode?: boolean;
1273
- /** Enable audit logging (default: true) */
1274
- auditLog?: boolean;
1275
- /** Callback when data access is attempted */
1276
- onDataAccess?: (table: string, operation: string, allowed: boolean, record: DataAccessRecord) => void;
1277
- /** Callback when strict mode violation occurs */
1278
- onStrictModeViolation?: (table: string, operation: string, record: DataAccessRecord) => void;
1279
- /** Maximum number of access records to keep in history */
1280
- maxHistorySize?: number;
1281
- /** Enable RLS enforcement (default: true) */
1282
- enforceRLS?: boolean;
1283
- }
1284
1436
  /**
1285
- * SecureDataProvider - Prevents direct Supabase access and enforces secure data patterns
1286
- *
1287
- * This provider ensures that all data access goes through the secure RBAC system
1288
- * and prevents apps from bypassing data access controls.
1437
+ * RBAC Adapters
1438
+ * @package @jmruthers/pace-core
1439
+ * @module RBAC/Adapters
1440
+ * @since 1.0.0
1289
1441
  *
1290
- * @param props - Provider props
1291
- * @returns React element with secure data context
1442
+ * This module provides adapters for different frameworks and server runtimes.
1292
1443
  */
1293
- declare function SecureDataProvider({ children, strictMode, auditLog, onDataAccess, onStrictModeViolation, maxHistorySize, enforceRLS }: SecureDataProviderProps): react_jsx_runtime.JSX.Element;
1444
+
1294
1445
  /**
1295
- * Hook to use secure data context
1446
+ * Permission Guard Component
1296
1447
  *
1297
- * @returns Secure data context
1298
- * @throws Error if used outside of SecureDataProvider
1448
+ * A React component that conditionally renders children based on permissions.
1449
+ * Can auto-infer userId from context if not provided.
1450
+ *
1451
+ * @example
1452
+ * ```tsx
1453
+ * // With explicit userId and scope
1454
+ * <PermissionGuard
1455
+ * userId="user-123"
1456
+ * scope={{ organisationId: 'org-456' }}
1457
+ * permission="manage:events"
1458
+ * pageId="page-789"
1459
+ * fallback={<AccessDenied />}
1460
+ * >
1461
+ * <AdminPanel />
1462
+ * </PermissionGuard>
1463
+ *
1464
+ * // With context inference (requires auth context)
1465
+ * <PermissionGuard
1466
+ * permission="manage:events"
1467
+ * scope={{ organisationId: 'org-456' }}
1468
+ * fallback={<AccessDenied />}
1469
+ * >
1470
+ * <AdminPanel />
1471
+ * </PermissionGuard>
1472
+ * ```
1299
1473
  */
1300
- declare function useSecureData(): SecureDataContextType;
1301
-
1302
- interface PermissionEnforcerProps {
1303
- /** Permissions required for access */
1304
- permissions: Permission[];
1305
- /** Operation being performed */
1306
- operation: string;
1307
- /** Content to render when user has permission */
1308
- children: React__default.ReactNode;
1309
- /** Content to render when user lacks permission */
1310
- fallback?: React__default.ReactNode;
1311
- /** Enable strict mode to prevent bypassing (default: true) */
1474
+ declare function PermissionGuard({ userId, scope, permission, pageId, children, fallback, onDenied, loading, strictMode, auditLog, enforceAudit, }: {
1475
+ userId?: UUID;
1476
+ scope: {
1477
+ organisationId: UUID;
1478
+ eventId?: string;
1479
+ appId?: UUID;
1480
+ };
1481
+ permission: Permission;
1482
+ pageId?: UUID;
1483
+ children: ReactNode;
1484
+ fallback?: ReactNode;
1485
+ onDenied?: () => void;
1486
+ loading?: ReactNode;
1312
1487
  strictMode?: boolean;
1313
- /** Force audit logging for this operation (default: true) */
1314
1488
  auditLog?: boolean;
1315
- /** Custom scope for permission checking */
1316
- scope?: Scope;
1317
- /** Callback when access is denied */
1318
- onDenied?: (permissions: Permission[], operation: string) => void;
1319
- /** Loading state content */
1320
- loading?: React__default.ReactNode;
1321
- /** Require all permissions (AND) or any permission (OR) */
1322
- requireAll?: boolean;
1323
- }
1489
+ enforceAudit?: boolean;
1490
+ }): React__default.ReactNode;
1324
1491
  /**
1325
- * PermissionEnforcer - Enforces permissions for operations
1492
+ * Access Level Guard Component
1326
1493
  *
1327
- * This component ensures that users can only perform operations they have permission for.
1328
- * It integrates with the existing RBAC system and provides strict enforcement to
1329
- * prevent apps from bypassing permission checks.
1494
+ * A React component that conditionally renders children based on access level.
1495
+ * Can auto-infer userId from context if not provided.
1330
1496
  *
1331
- * @param props - Component props
1332
- * @returns React element with permission enforcement
1497
+ * @example
1498
+ * ```tsx
1499
+ * // With explicit userId and scope
1500
+ * <AccessLevelGuard
1501
+ * userId="user-123"
1502
+ * scope={{ organisationId: 'org-456' }}
1503
+ * minLevel="admin"
1504
+ * fallback={<AccessDenied />}
1505
+ * >
1506
+ * <AdminPanel />
1507
+ * </AccessLevelGuard>
1508
+ *
1509
+ * // With context inference (requires auth context)
1510
+ * <AccessLevelGuard
1511
+ * minLevel="admin"
1512
+ * scope={{ organisationId: 'org-456' }}
1513
+ * fallback={<AccessDenied />}
1514
+ * >
1515
+ * <AdminPanel />
1516
+ * </AccessLevelGuard>
1517
+ * ```
1333
1518
  */
1334
- declare function PermissionEnforcer({ permissions, operation, children, fallback, strictMode, auditLog, scope, onDenied, loading, requireAll }: PermissionEnforcerProps): react_jsx_runtime.JSX.Element;
1335
-
1336
- interface RouteConfig {
1337
- /** Route path */
1338
- path: string;
1339
- /** React component to render */
1340
- component: React__default.ComponentType;
1341
- /** Permissions required for this route */
1342
- permissions: Permission[];
1343
- /** Roles that can access this route */
1344
- roles?: string[];
1345
- /** Minimum access level required */
1346
- accessLevel?: AccessLevel;
1347
- /** Page ID for permission checking */
1348
- pageId?: string;
1349
- /** Enable strict mode for this route */
1350
- strictMode?: boolean;
1351
- /** Route metadata */
1352
- meta?: {
1353
- title?: string;
1354
- description?: string;
1355
- requiresAuth?: boolean;
1356
- hidden?: boolean;
1519
+ declare function AccessLevelGuard({ userId, scope, minLevel, children, fallback, loading, }: {
1520
+ userId?: UUID;
1521
+ scope: {
1522
+ organisationId: UUID;
1523
+ eventId?: string;
1524
+ appId?: UUID;
1357
1525
  };
1358
- }
1359
- interface RouteAccessRecord {
1360
- route: string;
1361
- permissions: Permission[];
1362
- userId: UUID;
1363
- scope: Scope;
1364
- allowed: boolean;
1365
- timestamp: string;
1366
- pageId?: string;
1367
- roles?: string[];
1368
- accessLevel?: AccessLevel;
1369
- }
1370
- interface RoleBasedRouterContextType {
1371
- /** Get all accessible routes for current user */
1372
- getAccessibleRoutes: () => RouteConfig[];
1373
- /** Check if user can access a specific route */
1374
- canAccessRoute: (path: string) => boolean;
1375
- /** Get route configuration for a path */
1376
- getRouteConfig: (path: string) => RouteConfig | null;
1377
- /** Get route access history */
1378
- getRouteAccessHistory: () => RouteAccessRecord[];
1379
- /** Clear route access history */
1380
- clearRouteAccessHistory: () => void;
1381
- /** Check if strict mode is enabled */
1382
- isStrictMode: boolean;
1383
- /** Check if audit logging is enabled */
1384
- isAuditLogEnabled: boolean;
1385
- }
1386
- interface RoleBasedRouterProps {
1387
- /** Route configuration */
1388
- routes: RouteConfig[];
1389
- /** Fallback route for unauthorized access */
1390
- fallbackRoute?: string;
1391
- /** Child components */
1392
- children: React__default.ReactNode;
1393
- /** Enable strict mode to prevent bypassing (default: true) */
1394
- strictMode?: boolean;
1395
- /** Enable audit logging (default: true) */
1396
- auditLog?: boolean;
1397
- /** Callback when route access is attempted */
1398
- onRouteAccess?: (route: string, allowed: boolean, record: RouteAccessRecord) => void;
1399
- /** Callback when strict mode violation occurs */
1400
- onStrictModeViolation?: (route: string, record: RouteAccessRecord) => void;
1401
- /** Maximum number of access records to keep in history */
1402
- maxHistorySize?: number;
1403
- /** Custom unauthorized component */
1404
- unauthorizedComponent?: React__default.ComponentType<{
1405
- route: string;
1406
- reason: string;
1407
- }>;
1408
- }
1526
+ minLevel: 'viewer' | 'participant' | 'planner' | 'admin' | 'super';
1527
+ children: ReactNode;
1528
+ fallback?: ReactNode;
1529
+ loading?: ReactNode;
1530
+ }): React__default.ReactNode;
1531
+ /**
1532
+ * Permission Guard for Server Handlers
1533
+ *
1534
+ * Wraps a server handler with permission checking.
1535
+ *
1536
+ * @param config - Permission guard configuration
1537
+ * @param handler - Handler function to wrap
1538
+ * @returns Wrapped handler function
1539
+ *
1540
+ * @example
1541
+ * ```typescript
1542
+ * const protectedHandler = withPermissionGuard(
1543
+ * { permission: 'manage:events', pageId: 'page-789' },
1544
+ * async (req, res) => {
1545
+ * // Handler logic here
1546
+ * res.json({ success: true });
1547
+ * }
1548
+ * );
1549
+ * ```
1550
+ */
1551
+ declare function withPermissionGuard<T extends any[]>(config: {
1552
+ permission: Permission;
1553
+ pageId?: UUID;
1554
+ }, handler: (...args: T) => Promise<any>): (...args: T) => Promise<any>;
1555
+ /**
1556
+ * Access Level Guard for Server Handlers
1557
+ *
1558
+ * Wraps a server handler with access level checking.
1559
+ *
1560
+ * @param minLevel - Minimum access level required
1561
+ * @param handler - Handler function to wrap
1562
+ * @returns Wrapped handler function
1563
+ *
1564
+ * @example
1565
+ * ```typescript
1566
+ * const adminHandler = withAccessLevelGuard(
1567
+ * 'admin',
1568
+ * async (req, res) => {
1569
+ * // Admin-only logic here
1570
+ * res.json({ success: true });
1571
+ * }
1572
+ * );
1573
+ * ```
1574
+ */
1575
+ declare function withAccessLevelGuard<T extends any[]>(minLevel: 'viewer' | 'participant' | 'planner' | 'admin' | 'super', handler: (...args: T) => Promise<any>): (...args: T) => Promise<any>;
1576
+ /**
1577
+ * Role Guard for Server Handlers
1578
+ *
1579
+ * Wraps a server handler with role-based access control.
1580
+ * This is the primary middleware for routing protection as specified in the contract.
1581
+ *
1582
+ * @param config - Role guard configuration
1583
+ * @param handler - Handler function to wrap
1584
+ * @returns Wrapped handler function
1585
+ *
1586
+ * @example
1587
+ * ```typescript
1588
+ * const adminHandler = withRoleGuard(
1589
+ * {
1590
+ * globalRoles: ['super_admin'],
1591
+ * organisationRoles: ['org_admin', 'leader'],
1592
+ * eventAppRoles: ['event_admin', 'planner']
1593
+ * },
1594
+ * async (req, res) => {
1595
+ * // Admin-only logic here
1596
+ * res.json({ success: true });
1597
+ * }
1598
+ * );
1599
+ * ```
1600
+ */
1601
+ declare function withRoleGuard<T extends any[]>(config: {
1602
+ globalRoles?: string[];
1603
+ organisationRoles?: string[];
1604
+ eventAppRoles?: string[];
1605
+ requireAll?: boolean;
1606
+ }, handler: (...args: T) => Promise<any>): (...args: T) => Promise<any>;
1409
1607
  /**
1410
- * RoleBasedRouter - Centralized routing control with role-based protection
1608
+ * Next.js Middleware for RBAC
1411
1609
  *
1412
- * This component ensures that all routes are properly protected and provides
1413
- * centralized routing control to prevent apps from bypassing route protection.
1610
+ * Middleware that checks permissions before allowing access to pages.
1414
1611
  *
1415
- * @param props - Router props
1416
- * @returns React element with role-based routing
1417
- */
1418
- declare function RoleBasedRouter({ routes, fallbackRoute, children, strictMode, auditLog, onRouteAccess, onStrictModeViolation, maxHistorySize, unauthorizedComponent: UnauthorizedComponent }: RoleBasedRouterProps): react_jsx_runtime.JSX.Element;
1419
- /**
1420
- * Hook to use role-based router context
1612
+ * @param config - Middleware configuration
1613
+ * @returns Next.js middleware function
1421
1614
  *
1422
- * @returns Role-based router context
1423
- * @throws Error if used outside of RoleBasedRouter
1615
+ * @example
1616
+ * ```typescript
1617
+ * // middleware.ts
1618
+ * import { createRBACMiddleware } from '@jmruthers/pace-core/rbac';
1619
+ *
1620
+ * export default createRBACMiddleware({
1621
+ * protectedRoutes: [
1622
+ * { path: '/admin', permission: 'manage:admin' },
1623
+ * { path: '/events', permission: 'read:events' },
1624
+ * ],
1625
+ * fallbackUrl: '/access-denied',
1626
+ * });
1627
+ * ```
1424
1628
  */
1425
- declare function useRoleBasedRouter(): RoleBasedRouterContextType;
1426
-
1427
- interface NavigationItem {
1428
- /** Unique identifier for the navigation item */
1429
- id: string;
1430
- /** Display label for the navigation item */
1431
- label: string;
1432
- /** Navigation path/URL */
1433
- path: string;
1434
- /** Permissions required for this navigation item */
1435
- permissions: Permission[];
1436
- /** Roles that can access this navigation item */
1437
- roles?: string[];
1438
- /** Minimum access level required */
1439
- accessLevel?: 'viewer' | 'participant' | 'planner' | 'admin' | 'super';
1440
- /** Page ID for permission checking */
1441
- pageId?: string;
1442
- /** Enable strict mode for this navigation item */
1443
- strictMode?: boolean;
1444
- /** Navigation item metadata */
1445
- meta?: {
1446
- icon?: string;
1447
- description?: string;
1448
- hidden?: boolean;
1449
- order?: number;
1629
+ declare function createRBACMiddleware(config: {
1630
+ protectedRoutes: Array<{
1631
+ path: string;
1632
+ permission: Permission;
1633
+ pageId?: UUID;
1634
+ }>;
1635
+ fallbackUrl?: string;
1636
+ }): (req: {
1637
+ nextUrl: {
1638
+ pathname: string;
1450
1639
  };
1451
- }
1452
- interface NavigationAccessRecord {
1453
- navigationItem: string;
1454
- permissions: Permission[];
1455
- userId: UUID;
1456
- scope: Scope;
1457
- allowed: boolean;
1458
- timestamp: string;
1459
- pageId?: string;
1460
- roles?: string[];
1461
- accessLevel?: string;
1462
- }
1463
- interface NavigationContextType {
1464
- /** Check if user has permission for a navigation item */
1465
- hasNavigationPermission: (item: NavigationItem) => boolean;
1466
- /** Get all navigation permissions for current user */
1467
- getNavigationPermissions: () => Record<string, string[]>;
1468
- /** Get filtered navigation items based on permissions */
1469
- getFilteredNavigationItems: (items: NavigationItem[]) => NavigationItem[];
1470
- /** Check if navigation permission checking is enabled */
1471
- isEnabled: boolean;
1472
- /** Check if strict mode is enabled */
1473
- isStrictMode: boolean;
1474
- /** Check if audit logging is enabled */
1475
- isAuditLogEnabled: boolean;
1476
- /** Get navigation access history */
1477
- getNavigationAccessHistory: () => NavigationAccessRecord[];
1478
- /** Clear navigation access history */
1479
- clearNavigationAccessHistory: () => void;
1480
- }
1481
- interface NavigationProviderProps {
1482
- /** Child components */
1483
- children: React__default.ReactNode;
1484
- /** Enable strict mode to prevent bypassing (default: true) */
1485
- strictMode?: boolean;
1486
- /** Enable audit logging (default: true) */
1487
- auditLog?: boolean;
1488
- /** Callback when navigation access is attempted */
1489
- onNavigationAccess?: (item: NavigationItem, allowed: boolean, record: NavigationAccessRecord) => void;
1490
- /** Callback when strict mode violation occurs */
1491
- onStrictModeViolation?: (item: NavigationItem, record: NavigationAccessRecord) => void;
1492
- /** Maximum number of access records to keep in history */
1493
- maxHistorySize?: number;
1494
- }
1640
+ user?: {
1641
+ id: string;
1642
+ };
1643
+ organisationId?: string;
1644
+ }, res: {
1645
+ redirect: (url: string) => void;
1646
+ }, next: () => void) => Promise<void>;
1495
1647
  /**
1496
- * NavigationProvider - Manages navigation-level permissions across the app
1648
+ * Express Middleware for RBAC
1497
1649
  *
1498
- * This provider ensures that all navigation items are properly protected and provides
1499
- * centralized navigation permission management with strict enforcement.
1650
+ * Middleware that checks permissions for Express routes.
1500
1651
  *
1501
- * @param props - Provider props
1502
- * @returns React element with navigation permission context
1503
- */
1504
- declare function NavigationProvider({ children, strictMode, auditLog, onNavigationAccess, onStrictModeViolation, maxHistorySize }: NavigationProviderProps): react_jsx_runtime.JSX.Element;
1505
- /**
1506
- * Hook to use navigation permission context
1652
+ * @param config - Middleware configuration
1653
+ * @returns Express middleware function
1507
1654
  *
1508
- * @returns Navigation permission context
1509
- * @throws Error if used outside of NavigationProvider
1655
+ * @example
1656
+ * ```typescript
1657
+ * import { createRBACExpressMiddleware } from '@jmruthers/pace-core/rbac';
1658
+ *
1659
+ * app.use(createRBACExpressMiddleware({
1660
+ * permission: 'read:api',
1661
+ * pageId: 'api-page-123',
1662
+ * }));
1663
+ * ```
1510
1664
  */
1511
- declare function useNavigationPermissions(): NavigationContextType;
1512
-
1513
- interface NavigationGuardProps {
1514
- /** Navigation item being protected */
1515
- navigationItem: NavigationItem;
1516
- /** Content to render when user has permission */
1517
- children: React__default.ReactNode;
1518
- /** Content to render when user lacks permission */
1519
- fallback?: React__default.ReactNode;
1520
- /** Enable strict mode to prevent bypassing (default: true) */
1521
- strictMode?: boolean;
1522
- /** Force audit logging for this navigation access (default: true) */
1523
- auditLog?: boolean;
1524
- /** Custom scope for permission checking */
1525
- scope?: Scope;
1526
- /** Callback when access is denied */
1527
- onDenied?: (item: NavigationItem) => void;
1528
- /** Loading state content */
1529
- loading?: React__default.ReactNode;
1530
- /** Require all permissions (AND) or any permission (OR) */
1531
- requireAll?: boolean;
1532
- }
1665
+ declare function createRBACExpressMiddleware(config: {
1666
+ permission: Permission;
1667
+ pageId?: UUID;
1668
+ }): (req: {
1669
+ user?: {
1670
+ id: string;
1671
+ };
1672
+ organisationId?: string;
1673
+ eventId?: string;
1674
+ appId?: string;
1675
+ }, res: {
1676
+ status: (code: number) => {
1677
+ json: (data: object) => void;
1678
+ };
1679
+ }, next: () => void) => Promise<void>;
1533
1680
  /**
1534
- * NavigationGuard - Enforces navigation-level permissions
1535
- *
1536
- * This component ensures that users can only access navigation items they have permission for.
1537
- * It integrates with the existing RBAC system and provides strict enforcement to
1538
- * prevent apps from bypassing navigation permission checks.
1681
+ * Check if a user has a permission (synchronous cache check only)
1539
1682
  *
1540
- * @param props - Component props
1541
- * @returns React element with navigation permission enforcement
1683
+ * @param userId - User ID
1684
+ * @param scope - Permission scope
1685
+ * @param permission - Permission to check
1686
+ * @param pageId - Optional page ID
1687
+ * @returns True if permission is cached and granted
1542
1688
  */
1543
- declare function NavigationGuard({ navigationItem, children, fallback, strictMode, auditLog, scope, onDenied, loading, requireAll }: NavigationGuardProps): react_jsx_runtime.JSX.Element;
1544
-
1545
- interface EnhancedNavigationMenuProps {
1546
- /** Navigation items to display */
1547
- items: NavigationItem[];
1548
- /** Enable strict mode to prevent bypassing (default: true) */
1549
- strictMode?: boolean;
1550
- /** Enable audit logging (default: true) */
1551
- auditLog?: boolean;
1552
- /** Callback when navigation access is attempted */
1553
- onNavigationAccess?: (item: NavigationItem, allowed: boolean) => void;
1554
- /** Callback when strict mode violation occurs */
1555
- onStrictModeViolation?: (item: NavigationItem) => void;
1556
- /** Custom className for the navigation menu */
1557
- className?: string;
1558
- /** Custom className for navigation items */
1559
- itemClassName?: string;
1560
- /** Custom className for active navigation items */
1561
- activeItemClassName?: string;
1562
- /** Custom className for disabled navigation items */
1563
- disabledItemClassName?: string;
1564
- /** Show/hide navigation items that user doesn't have permission for */
1565
- hideUnauthorizedItems?: boolean;
1566
- /** Custom render function for navigation items */
1567
- renderItem?: (item: NavigationItem, isAuthorized: boolean) => React__default.ReactNode;
1568
- /** Current active path for highlighting */
1569
- activePath?: string;
1570
- /** Navigation item click handler */
1571
- onItemClick?: (item: NavigationItem) => void;
1572
- }
1689
+ declare function hasPermissionCached(userId: UUID, scope: {
1690
+ organisationId: UUID;
1691
+ eventId?: string;
1692
+ appId?: UUID;
1693
+ }, _permission: Permission, _pageId?: UUID): boolean;
1573
1694
  /**
1574
- * EnhancedNavigationMenu - Secure navigation menu with RBAC integration
1575
- *
1576
- * This component provides a navigation menu that automatically filters items based on
1577
- * user permissions and enforces strict security controls.
1695
+ * Check if a user has any of the specified permissions (synchronous cache check only)
1578
1696
  *
1579
- * @param props - Component props
1580
- * @returns React element with enhanced navigation menu
1697
+ * @param userId - User ID
1698
+ * @param scope - Permission scope
1699
+ * @param permissions - Array of permissions to check
1700
+ * @param pageId - Optional page ID
1701
+ * @returns True if any permission is cached and granted
1581
1702
  */
1582
- declare function EnhancedNavigationMenu({ items, strictMode, auditLog, onNavigationAccess, onStrictModeViolation, className, itemClassName, activeItemClassName, disabledItemClassName, hideUnauthorizedItems, renderItem, activePath, onItemClick }: EnhancedNavigationMenuProps): react_jsx_runtime.JSX.Element;
1703
+ declare function hasAnyPermissionCached(userId: UUID, scope: {
1704
+ organisationId: UUID;
1705
+ eventId?: string;
1706
+ appId?: UUID;
1707
+ }, permissions: Permission[], pageId?: UUID): boolean;
1583
1708
 
1584
1709
  /**
1585
1710
  * RBAC Main API Functions
@@ -1861,4 +1986,4 @@ declare const ALL_PERMISSIONS: {
1861
1986
  };
1862
1987
  type AllPermissions = typeof ALL_PERMISSIONS;
1863
1988
 
1864
- export { ALL_PERMISSIONS, type AccessLevel, AccessLevelGuard, type AllPermissions, CACHE_PATTERNS, type DataAccessRecord, EVENT_APP_PERMISSIONS, EnhancedNavigationMenu, type EnhancedNavigationMenuProps, type EventAppRole, GLOBAL_PERMISSIONS, type GlobalRole, InvalidScopeError, type LogLevel, MissingUserContextError, type NavigationAccessRecord, type NavigationContextType, NavigationGuard, type NavigationGuardProps, type NavigationItem, NavigationProvider, type NavigationProviderProps, ORGANISATION_PERMISSIONS, type Operation, OrganisationContextRequiredError, type OrganisationRole, PAGE_PERMISSIONS, PERMISSION_GROUPS, type PageAccessRecord, type PagePermissionContextType, PagePermissionGuard, type PagePermissionGuardProps, PagePermissionProvider, type PagePermissionProviderProps, type Permission, type PermissionCheck, PermissionDeniedError, PermissionEnforcer, type PermissionEnforcerProps, PermissionGuard, type PermissionMap, RBACAuditManager, RBACCache, type RBACConfig, RBACEngine, RBACError, type RBACLogger, RBACNotInitializedError, RoleBasedRouter, type RoleBasedRouterContextType, type RoleBasedRouterProps, type RouteAccessRecord, type RouteConfig, type Scope, type SecureDataContextType, SecureDataProvider, type SecureDataProviderProps, SecureSupabaseClient, type UUID, createAuditManager, createRBACConfig, createRBACEngine, createRBACExpressMiddleware, createRBACMiddleware, createSecureClient, emitAuditEvent, fromSupabaseClient, getAccessLevel, getGlobalAuditManager, getPermissionMap, getPermissionsForRole, getRBACConfig, getRBACLogger, hasAllPermissions, hasAnyPermission, hasAnyPermissionCached, hasPermission, hasPermissionCached, isDebugMode, isDevelopmentMode, isPermitted, isPermittedCached, isValidPermission, rbacCache, setGlobalAuditManager, setupRBAC, useAccessLevel, useCachedPermissions, useCan, useHasAllPermissions, useHasAnyPermission, useMultiplePermissions, useNavigationPermissions, usePagePermissions, usePermissions, useRoleBasedRouter, useSecureData, withAccessLevelGuard, withPermissionGuard, withRoleGuard };
1989
+ export { ALL_PERMISSIONS, type AccessLevel, AccessLevelGuard, type AllPermissions, CACHE_PATTERNS, type DataAccessRecord, EVENT_APP_PERMISSIONS, EnhancedNavigationMenu, type EnhancedNavigationMenuProps, type EventAppRole, GLOBAL_PERMISSIONS, type GlobalRole, InvalidScopeError, type LogLevel, MissingUserContextError, type NavigationAccessRecord, type NavigationContextType, NavigationGuard, type NavigationGuardProps, type NavigationItem, NavigationProvider, type NavigationProviderProps, ORGANISATION_PERMISSIONS, type Operation, OrganisationContextRequiredError, type OrganisationRole, PAGE_PERMISSIONS, PERMISSION_GROUPS, type PageAccessRecord, type PagePermissionContextType, PagePermissionGuard, type PagePermissionGuardProps, PagePermissionProvider, type PagePermissionProviderProps, type Permission, type PermissionCheck, PermissionDeniedError, PermissionEnforcer, type PermissionEnforcerProps, PermissionGuard, type PermissionMap, RBACAuditManager, RBACCache, type RBACConfig, RBACEngine, RBACError, type RBACLogger, RBACNotInitializedError, RoleBasedRouter, type RoleBasedRouterContextType, type RoleBasedRouterProps, type RouteAccessRecord, type RouteConfig, type Scope, type SecureDataContextType, SecureDataProvider, type SecureDataProviderProps, SecureSupabaseClient, type UUID, createAuditManager, createRBACConfig, createRBACEngine, createRBACExpressMiddleware, createRBACMiddleware, createSecureClient, emitAuditEvent, fromSupabaseClient, getAccessLevel, getGlobalAuditManager, getPermissionMap, getPermissionsForRole, getRBACConfig, getRBACLogger, hasAllPermissions, hasAnyPermission, hasAnyPermissionCached, hasPermission, hasPermissionCached, isDebugMode, isDevelopmentMode, isPermitted, isPermittedCached, isValidPermission, rbacCache, setGlobalAuditManager, setupRBAC, useAccessLevel, useCachedPermissions, useCan, useHasAllPermissions, useHasAnyPermission, useMultiplePermissions, useNavigationPermissions, usePagePermissions, usePermissions, useRBAC, useRoleBasedRouter, useSecureData, withAccessLevelGuard, withPermissionGuard, withRoleGuard };