@jmruthers/pace-core 0.5.180 → 0.5.182

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 (750) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/README.md +16 -2
  3. package/dist/{AuthService-DYuQPJj6.d.ts → AuthService-B-cd2MA4.d.ts} +9 -11
  4. package/dist/{DataTable-CWAZZcXC.d.ts → DataTable-Bz8ffqyA.d.ts} +1 -1
  5. package/dist/{DataTable-4VSEJQ7D.js → DataTable-QAB34V6K.js} +14 -15
  6. package/dist/UnifiedAuthProvider-7F6T4B6K.js +13 -0
  7. package/dist/{UnifiedAuthProvider-DJxGTftH.d.ts → UnifiedAuthProvider-F86d7dSi.d.ts} +5 -6
  8. package/dist/{api-45XYYO2A.js → api-ROMBCNKU.js} +5 -5
  9. package/dist/{audit-64X3VJXB.js → audit-WRS3KJKI.js} +4 -4
  10. package/dist/auth-BZOJqrdd.d.ts +49 -0
  11. package/dist/{chunk-CX5M4ZAG.js → chunk-5DRSZLL2.js} +1 -1
  12. package/dist/chunk-5DRSZLL2.js.map +1 -0
  13. package/dist/{chunk-BESYRHQM.js → chunk-6C4YBBJM.js} +10 -7
  14. package/dist/chunk-6C4YBBJM.js.map +1 -0
  15. package/dist/{chunk-PLDDJCW6.js → chunk-7D4SUZUM.js} +2 -13
  16. package/dist/{chunk-6HLVGAZG.js → chunk-CSOFYHAG.js} +55 -162
  17. package/dist/chunk-CSOFYHAG.js.map +1 -0
  18. package/dist/{chunk-ANBQRTPX.js → chunk-E66EQZE6.js} +3 -5
  19. package/dist/{chunk-ANBQRTPX.js.map → chunk-E66EQZE6.js.map} +1 -1
  20. package/dist/{chunk-Q5QRDWKI.js → chunk-F2IMUDXZ.js} +4 -6
  21. package/dist/chunk-F2IMUDXZ.js.map +1 -0
  22. package/dist/{chunk-SBVILCCA.js → chunk-FSFQFJCU.js} +28 -6
  23. package/dist/chunk-FSFQFJCU.js.map +1 -0
  24. package/dist/chunk-FUEYYMX5.js +2296 -0
  25. package/dist/chunk-FUEYYMX5.js.map +1 -0
  26. package/dist/{chunk-FFKNH6U5.js → chunk-HKIT6O7W.js} +3 -5
  27. package/dist/{chunk-FFKNH6U5.js.map → chunk-HKIT6O7W.js.map} +1 -1
  28. package/dist/chunk-KQCRWDSA.js +1 -0
  29. package/dist/{chunk-S5OFRT4M.js → chunk-KUEN3HFB.js} +6 -6
  30. package/dist/chunk-KUEN3HFB.js.map +1 -0
  31. package/dist/chunk-LMC26NLJ.js +84 -0
  32. package/dist/chunk-LMC26NLJ.js.map +1 -0
  33. package/dist/{chunk-BVYWGZVV.js → chunk-M7W4CP3M.js} +52 -19
  34. package/dist/chunk-M7W4CP3M.js.map +1 -0
  35. package/dist/{chunk-CPTUD43C.js → chunk-MI7HBHN3.js} +164 -243
  36. package/dist/chunk-MI7HBHN3.js.map +1 -0
  37. package/dist/{chunk-N5YCCUG5.js → chunk-PWAHJW4G.js} +180 -29
  38. package/dist/chunk-PWAHJW4G.js.map +1 -0
  39. package/dist/chunk-PWLANIRT.js +127 -0
  40. package/dist/{chunk-XDNLUEXI.js.map → chunk-PWLANIRT.js.map} +1 -1
  41. package/dist/chunk-QCDXODCA.js +75 -0
  42. package/dist/chunk-QCDXODCA.js.map +1 -0
  43. package/dist/{chunk-P6UUHOIF.js → chunk-QETLRQI6.js} +526 -887
  44. package/dist/chunk-QETLRQI6.js.map +1 -0
  45. package/dist/{chunk-GQA2LIAE.js → chunk-QUVSNGIP.js} +264 -262
  46. package/dist/chunk-QUVSNGIP.js.map +1 -0
  47. package/dist/chunk-QXHPKYJV.js +113 -0
  48. package/dist/chunk-QXHPKYJV.js.map +1 -0
  49. package/dist/{chunk-OWAG3GSU.js → chunk-R77UEZ4E.js} +11 -1
  50. package/dist/chunk-R77UEZ4E.js.map +1 -0
  51. package/dist/{chunk-ONI7Y733.js → chunk-RA3JUFMW.js} +314 -161
  52. package/dist/chunk-RA3JUFMW.js.map +1 -0
  53. package/dist/{chunk-ERISIBYU.js → chunk-SQGMNID3.js} +3 -8
  54. package/dist/chunk-SQGMNID3.js.map +1 -0
  55. package/dist/{chunk-XJ2HZOBU.js → chunk-UHNYIBXL.js} +1 -1
  56. package/dist/chunk-UHNYIBXL.js.map +1 -0
  57. package/{src/utils/secureStorage.ts → dist/chunk-VBXEHIUJ.js} +113 -88
  58. package/dist/{chunk-7QCC6MCP.js.map → chunk-VBXEHIUJ.js.map} +1 -1
  59. package/dist/{chunk-R53TUSFK.js → chunk-W22JP75J.js} +5 -13
  60. package/dist/{chunk-R53TUSFK.js.map → chunk-W22JP75J.js.map} +1 -1
  61. package/dist/components.d.ts +12 -93
  62. package/dist/components.js +23 -106
  63. package/dist/components.js.map +1 -1
  64. package/dist/core-CUElvH_C.d.ts +164 -0
  65. package/dist/database.generated-CBmg2950.d.ts +8284 -0
  66. package/dist/event-CW5YB_2p.d.ts +239 -0
  67. package/dist/{file-reference-C6Gkn77H.d.ts → file-reference-D06mEEWW.d.ts} +7 -5
  68. package/dist/functions-D_kgHktt.d.ts +208 -0
  69. package/dist/hooks.d.ts +54 -7
  70. package/dist/hooks.js +204 -17
  71. package/dist/hooks.js.map +1 -1
  72. package/dist/{EventLogo-B3V3otev.d.ts → index-Bl--n7-T.d.ts} +387 -397
  73. package/dist/index.d.ts +94 -261
  74. package/dist/index.js +314 -126
  75. package/dist/index.js.map +1 -1
  76. package/dist/providers.d.ts +7 -8
  77. package/dist/providers.js +6 -13
  78. package/dist/rbac/index.d.ts +171 -101
  79. package/dist/rbac/index.js +23 -17
  80. package/dist/styles/index.d.ts +1 -3
  81. package/dist/styles/index.js +2 -17
  82. package/dist/theming/runtime.js +3 -3
  83. package/dist/types-UU913iLA.d.ts +102 -0
  84. package/dist/{types-Dfz9dmVH.d.ts → types-_x1f4QBF.d.ts} +6 -6
  85. package/dist/types.d.ts +88 -227
  86. package/dist/types.js +64 -112
  87. package/dist/types.js.map +1 -1
  88. package/dist/{usePublicRouteParams-B7PabvuH.d.ts → usePublicRouteParams-JJczomYq.d.ts} +203 -6
  89. package/dist/utils.d.ts +299 -13
  90. package/dist/utils.js +481 -55
  91. package/dist/utils.js.map +1 -1
  92. package/dist/validation-643vUDZW.d.ts +177 -0
  93. package/docs/DOCUMENTATION_REVIEW_TRACKER.md +511 -0
  94. package/docs/README.md +9 -8
  95. package/docs/api/README.md +16 -2
  96. package/docs/api/classes/ColumnFactory.md +1 -1
  97. package/docs/api/classes/ErrorBoundary.md +1 -1
  98. package/docs/api/classes/InvalidScopeError.md +4 -4
  99. package/docs/api/classes/MissingUserContextError.md +4 -4
  100. package/docs/api/classes/OrganisationContextRequiredError.md +4 -4
  101. package/docs/api/classes/PermissionDeniedError.md +4 -4
  102. package/docs/api/classes/RBACAuditManager.md +14 -14
  103. package/docs/api/classes/RBACCache.md +1 -1
  104. package/docs/api/classes/RBACEngine.md +2 -2
  105. package/docs/api/classes/RBACError.md +4 -4
  106. package/docs/api/classes/RBACNotInitializedError.md +4 -4
  107. package/docs/api/classes/SecureSupabaseClient.md +29 -9
  108. package/docs/api/classes/StorageUtils.md +1 -1
  109. package/docs/api/enums/FileCategory.md +17 -17
  110. package/docs/api/enums/RBACErrorCode.md +228 -0
  111. package/docs/api/enums/RPCFunction.md +118 -0
  112. package/docs/api/interfaces/AggregateConfig.md +1 -1
  113. package/docs/api/interfaces/BadgeProps.md +1 -1
  114. package/docs/api/interfaces/ButtonProps.md +2 -2
  115. package/docs/api/interfaces/CalendarProps.md +1 -1
  116. package/docs/api/interfaces/CardProps.md +29 -3
  117. package/docs/api/interfaces/ColorPalette.md +1 -1
  118. package/docs/api/interfaces/ColorShade.md +1 -1
  119. package/docs/api/interfaces/DataAccessRecord.md +1 -1
  120. package/docs/api/interfaces/DataRecord.md +1 -1
  121. package/docs/api/interfaces/DataTableAction.md +2 -2
  122. package/docs/api/interfaces/DataTableColumn.md +6 -6
  123. package/docs/api/interfaces/DataTableProps.md +1 -1
  124. package/docs/api/interfaces/DataTableToolbarButton.md +2 -2
  125. package/docs/api/interfaces/EmptyStateConfig.md +1 -1
  126. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
  127. package/docs/api/interfaces/EventAppRoleData.md +1 -1
  128. package/docs/api/interfaces/ExportColumn.md +5 -5
  129. package/docs/api/interfaces/ExportOptions.md +4 -4
  130. package/docs/api/interfaces/FileDisplayProps.md +1 -1
  131. package/docs/api/interfaces/FileMetadata.md +13 -13
  132. package/docs/api/interfaces/FileReference.md +12 -12
  133. package/docs/api/interfaces/FileSizeLimits.md +1 -1
  134. package/docs/api/interfaces/FileUploadOptions.md +10 -10
  135. package/docs/api/interfaces/FileUploadProps.md +19 -19
  136. package/docs/api/interfaces/FooterProps.md +1 -1
  137. package/docs/api/interfaces/FormFieldProps.md +166 -0
  138. package/docs/api/interfaces/FormProps.md +113 -0
  139. package/docs/api/interfaces/GrantEventAppRoleParams.md +1 -1
  140. package/docs/api/interfaces/InactivityWarningModalProps.md +8 -8
  141. package/docs/api/interfaces/InputProps.md +2 -2
  142. package/docs/api/interfaces/LabelProps.md +8 -8
  143. package/docs/api/interfaces/LoginFormProps.md +1 -1
  144. package/docs/api/interfaces/NavigationAccessRecord.md +1 -1
  145. package/docs/api/interfaces/NavigationContextType.md +1 -1
  146. package/docs/api/interfaces/NavigationGuardProps.md +1 -1
  147. package/docs/api/interfaces/NavigationItem.md +17 -73
  148. package/docs/api/interfaces/NavigationMenuProps.md +38 -53
  149. package/docs/api/interfaces/NavigationProviderProps.md +1 -1
  150. package/docs/api/interfaces/Organisation.md +13 -13
  151. package/docs/api/interfaces/OrganisationContextType.md +21 -21
  152. package/docs/api/interfaces/OrganisationMembership.md +15 -15
  153. package/docs/api/interfaces/OrganisationProviderProps.md +59 -2
  154. package/docs/api/interfaces/OrganisationSecurityError.md +5 -5
  155. package/docs/api/interfaces/PaceAppLayoutProps.md +26 -39
  156. package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
  157. package/docs/api/interfaces/PageAccessRecord.md +1 -1
  158. package/docs/api/interfaces/PagePermissionContextType.md +1 -1
  159. package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
  160. package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
  161. package/docs/api/interfaces/PaletteData.md +1 -1
  162. package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
  163. package/docs/api/interfaces/ProgressProps.md +50 -0
  164. package/docs/api/interfaces/ProtectedRouteProps.md +1 -1
  165. package/docs/api/interfaces/PublicPageFooterProps.md +9 -9
  166. package/docs/api/interfaces/PublicPageHeaderProps.md +10 -10
  167. package/docs/api/interfaces/PublicPageLayoutProps.md +15 -15
  168. package/docs/api/interfaces/RBACAccessValidateParams.md +52 -0
  169. package/docs/api/interfaces/RBACAccessValidateResult.md +41 -0
  170. package/docs/api/interfaces/RBACAuditLogParams.md +85 -0
  171. package/docs/api/interfaces/RBACAuditLogResult.md +52 -0
  172. package/docs/api/interfaces/RBACConfig.md +2 -2
  173. package/docs/api/interfaces/RBACContext.md +52 -0
  174. package/docs/api/interfaces/RBACLogger.md +1 -1
  175. package/docs/api/interfaces/RBACPageAccessCheckParams.md +74 -0
  176. package/docs/api/interfaces/RBACPermissionCheckParams.md +74 -0
  177. package/docs/api/interfaces/RBACPermissionCheckResult.md +52 -0
  178. package/docs/api/interfaces/RBACPermissionsGetParams.md +63 -0
  179. package/docs/api/interfaces/RBACPermissionsGetResult.md +63 -0
  180. package/docs/api/interfaces/RBACResult.md +58 -0
  181. package/docs/api/interfaces/RBACRoleGrantParams.md +63 -0
  182. package/docs/api/interfaces/RBACRoleGrantResult.md +52 -0
  183. package/docs/api/interfaces/RBACRoleRevokeParams.md +63 -0
  184. package/docs/api/interfaces/RBACRoleRevokeResult.md +52 -0
  185. package/docs/api/interfaces/RBACRoleValidateParams.md +52 -0
  186. package/docs/api/interfaces/RBACRoleValidateResult.md +63 -0
  187. package/docs/api/interfaces/RBACRolesListParams.md +52 -0
  188. package/docs/api/interfaces/RBACRolesListResult.md +74 -0
  189. package/docs/api/interfaces/RBACSessionTrackParams.md +74 -0
  190. package/docs/api/interfaces/RBACSessionTrackResult.md +52 -0
  191. package/docs/api/interfaces/ResourcePermissions.md +1 -1
  192. package/docs/api/interfaces/RevokeEventAppRoleParams.md +1 -1
  193. package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
  194. package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
  195. package/docs/api/interfaces/RoleManagementResult.md +1 -1
  196. package/docs/api/interfaces/RouteAccessRecord.md +1 -1
  197. package/docs/api/interfaces/RouteConfig.md +1 -1
  198. package/docs/api/interfaces/SecureDataContextType.md +1 -1
  199. package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
  200. package/docs/api/interfaces/SessionRestorationLoaderProps.md +15 -2
  201. package/docs/api/interfaces/StorageConfig.md +1 -1
  202. package/docs/api/interfaces/StorageFileInfo.md +1 -1
  203. package/docs/api/interfaces/StorageFileMetadata.md +1 -1
  204. package/docs/api/interfaces/StorageListOptions.md +1 -1
  205. package/docs/api/interfaces/StorageListResult.md +1 -1
  206. package/docs/api/interfaces/StorageUploadOptions.md +1 -1
  207. package/docs/api/interfaces/StorageUploadResult.md +1 -1
  208. package/docs/api/interfaces/StorageUrlOptions.md +1 -1
  209. package/docs/api/interfaces/StyleImport.md +1 -1
  210. package/docs/api/interfaces/SwitchProps.md +1 -1
  211. package/docs/api/interfaces/TabsContentProps.md +1 -1
  212. package/docs/api/interfaces/TabsListProps.md +1 -1
  213. package/docs/api/interfaces/TabsProps.md +1 -1
  214. package/docs/api/interfaces/TabsTriggerProps.md +43 -2
  215. package/docs/api/interfaces/TextareaProps.md +2 -2
  216. package/docs/api/interfaces/ToastActionElement.md +1 -1
  217. package/docs/api/interfaces/ToastProps.md +1 -1
  218. package/docs/api/interfaces/UnifiedAuthContextType.md +61 -61
  219. package/docs/api/interfaces/UnifiedAuthProviderProps.md +13 -13
  220. package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
  221. package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
  222. package/docs/api/interfaces/UsePublicEventLogoOptions.md +87 -0
  223. package/docs/api/interfaces/UsePublicEventLogoReturn.md +81 -0
  224. package/docs/api/interfaces/UsePublicEventOptions.md +3 -3
  225. package/docs/api/interfaces/UsePublicEventReturn.md +5 -5
  226. package/docs/api/interfaces/UsePublicFileDisplayOptions.md +2 -2
  227. package/docs/api/interfaces/UsePublicFileDisplayReturn.md +1 -1
  228. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
  229. package/docs/api/interfaces/UseResolvedScopeOptions.md +2 -2
  230. package/docs/api/interfaces/UseResolvedScopeReturn.md +1 -1
  231. package/docs/api/interfaces/UseResourcePermissionsOptions.md +1 -1
  232. package/docs/api/interfaces/UserEventAccess.md +1 -1
  233. package/docs/api/interfaces/UserMenuProps.md +4 -4
  234. package/docs/api/interfaces/UserProfile.md +7 -7
  235. package/docs/api/modules.md +484 -462
  236. package/docs/api-reference/components.md +186 -15
  237. package/docs/api-reference/deprecated.md +376 -0
  238. package/docs/api-reference/hooks.md +149 -19
  239. package/docs/api-reference/providers.md +61 -6
  240. package/docs/api-reference/rpc-functions.md +397 -0
  241. package/docs/api-reference/types.md +135 -78
  242. package/docs/api-reference/utilities.md +51 -380
  243. package/docs/architecture/README.md +49 -3
  244. package/docs/architecture/database-schema-requirements.md +40 -3
  245. package/docs/architecture/rbac-security-architecture.md +41 -4
  246. package/docs/architecture/services.md +127 -42
  247. package/docs/best-practices/README.md +51 -5
  248. package/docs/best-practices/accessibility.md +32 -3
  249. package/docs/best-practices/common-patterns.md +50 -3
  250. package/docs/best-practices/deployment.md +50 -4
  251. package/docs/best-practices/performance.md +50 -3
  252. package/docs/best-practices/security.md +94 -41
  253. package/docs/best-practices/testing.md +33 -4
  254. package/docs/core-concepts/authentication.md +5 -5
  255. package/docs/core-concepts/events.md +3 -3
  256. package/docs/core-concepts/organisations.md +3 -3
  257. package/docs/core-concepts/permissions.md +3 -3
  258. package/docs/core-concepts/rbac-system.md +5 -5
  259. package/docs/documentation-index.md +30 -8
  260. package/docs/getting-started/documentation-index.md +1 -1
  261. package/docs/getting-started/examples/README.md +7 -5
  262. package/docs/getting-started/examples/basic-auth-app.md +3 -0
  263. package/docs/getting-started/examples/full-featured-app.md +5 -3
  264. package/docs/getting-started/faq.md +6 -6
  265. package/docs/getting-started/installation-guide.md +192 -13
  266. package/docs/getting-started/local-development.md +303 -0
  267. package/docs/getting-started/quick-reference.md +3 -3
  268. package/docs/getting-started/quick-start.md +517 -0
  269. package/docs/implementation-guides/app-layout.md +45 -3
  270. package/docs/implementation-guides/authentication.md +66 -7
  271. package/docs/implementation-guides/component-styling.md +53 -3
  272. package/docs/implementation-guides/data-tables.md +76 -7
  273. package/docs/implementation-guides/datatable-filtering.md +1 -2
  274. package/docs/implementation-guides/datatable-rbac-usage.md +0 -1
  275. package/docs/implementation-guides/dynamic-colors.md +155 -4
  276. package/docs/implementation-guides/file-reference-system.md +72 -3
  277. package/docs/implementation-guides/file-upload-storage.md +72 -3
  278. package/docs/implementation-guides/forms.md +53 -3
  279. package/docs/implementation-guides/inactivity-tracking.md +53 -3
  280. package/docs/implementation-guides/large-datasets.md +1 -1
  281. package/docs/implementation-guides/navigation.md +55 -5
  282. package/docs/implementation-guides/organisation-security.md +72 -3
  283. package/docs/implementation-guides/performance.md +57 -1
  284. package/docs/implementation-guides/permission-enforcement.md +81 -8
  285. package/docs/implementation-guides/public-pages.md +560 -14
  286. package/docs/migration/MIGRATION_GUIDE.md +409 -50
  287. package/docs/migration/README.md +37 -3
  288. package/docs/migration/organisation-context-timing-fix.md +39 -4
  289. package/docs/migration/quick-migration-guide.md +41 -5
  290. package/docs/migration/rbac-migration.md +59 -3
  291. package/docs/migration/service-architecture.md +77 -14
  292. package/docs/rbac/README.md +79 -3
  293. package/docs/rbac/advanced-patterns.md +47 -3
  294. package/docs/rbac/api-reference.md +77 -8
  295. package/docs/rbac/event-based-apps.md +50 -5
  296. package/docs/rbac/examples/rbac-rls-integration-example.md +3 -3
  297. package/docs/rbac/examples.md +39 -3
  298. package/docs/rbac/getting-started.md +63 -4
  299. package/docs/rbac/quick-start.md +57 -5
  300. package/docs/rbac/rbac-rls-integration.md +68 -6
  301. package/docs/rbac/super-admin-guide.md +47 -3
  302. package/docs/rbac/troubleshooting.md +3 -3
  303. package/docs/security/README.md +68 -3
  304. package/docs/security/checklist.md +50 -3
  305. package/docs/standards/01-architecture-standard.md +39 -0
  306. package/docs/standards/02-api-and-rpc-standard.md +39 -0
  307. package/docs/standards/03-component-standard.md +32 -0
  308. package/docs/standards/04-code-style-standard.md +32 -0
  309. package/docs/standards/05-security-standard.md +30 -0
  310. package/docs/standards/06-testing-and-docs-standard.md +29 -0
  311. package/docs/standards/README.md +35 -0
  312. package/docs/styles/README.md +89 -8
  313. package/docs/testing/README.md +175 -24
  314. package/docs/troubleshooting/README.md +50 -3
  315. package/docs/troubleshooting/common-issues.md +271 -5
  316. package/docs/troubleshooting/debugging.md +54 -1
  317. package/docs/troubleshooting/migration.md +54 -1
  318. package/docs/troubleshooting/organisation-context-setup.md +29 -3
  319. package/docs/troubleshooting/styling-issues.md +246 -4
  320. package/{src/components/DataTable/examples → examples/DataTable}/GroupingAggregationExample.tsx +1 -1
  321. package/examples/{components 2/DataTable/HierarchicalActionsExample.tsx → DataTable/HierarchicalActionsExample.tsx} +7 -6
  322. package/examples/{components 2/DataTable/HierarchicalExample.tsx → DataTable/HierarchicalExample.tsx} +8 -6
  323. package/examples/{components 2/DataTable/PerformanceExample.tsx → DataTable/PerformanceExample.tsx} +2 -2
  324. package/examples/{components 2/DataTable/index.ts → DataTable/index.ts} +1 -0
  325. package/{src/components/Dialog/examples → examples/Dialog}/HtmlDialogExample.tsx +3 -3
  326. package/examples/{components 2/Dialog/ScrollableDialogExample.tsx → Dialog/ScrollableDialogExample.tsx} +1 -1
  327. package/{src/components/Dialog/examples → examples/Dialog}/SmartDialogExample.tsx +1 -1
  328. package/examples/{components 2/Dialog/index.ts → Dialog/index.ts} +0 -3
  329. package/examples/{features/public-pages → PublicPages}/CorrectPublicPageImplementation.tsx +52 -17
  330. package/examples/{features/public-pages → PublicPages}/PublicEventPage.tsx +65 -35
  331. package/examples/{features/public-pages → PublicPages}/PublicPageApp.tsx +52 -18
  332. package/examples/{features/public-pages → PublicPages}/PublicPageUsageExample.tsx +28 -15
  333. package/examples/README.md +81 -33
  334. package/examples/index.ts +14 -12
  335. package/examples/{RBAC → rbac}/CompleteRBACExample.tsx +1 -1
  336. package/examples/{features/rbac → rbac}/EventBasedApp.tsx +4 -4
  337. package/examples/{features/rbac → rbac}/PermissionExample.tsx +5 -3
  338. package/package.json +21 -27
  339. package/src/__tests__/helpers/test-utils.tsx +29 -3
  340. package/src/__tests__/rbac/PagePermissionGuard.test.tsx +7 -5
  341. package/src/components/Alert/Alert.test.tsx +2 -2
  342. package/src/components/Alert/Alert.tsx +4 -4
  343. package/src/components/Avatar/Avatar.test.tsx +17 -6
  344. package/src/components/Badge/Badge.test.tsx +1 -1
  345. package/src/components/Badge/Badge.tsx +2 -2
  346. package/src/components/Button/Button.test.tsx +2 -2
  347. package/src/components/Button/Button.tsx +11 -7
  348. package/src/components/Calendar/Calendar.test.tsx +41 -8
  349. package/src/components/Calendar/Calendar.tsx +39 -36
  350. package/src/components/Card/Card.tsx +51 -13
  351. package/src/components/Checkbox/Checkbox.test.tsx +36 -12
  352. package/src/components/DataTable/DataTable.test.tsx +1 -1
  353. package/src/components/DataTable/__tests__/DataTable.comprehensive.test.tsx +13 -7
  354. package/src/components/DataTable/__tests__/DataTable.default-state.test.tsx +14 -42
  355. package/src/components/DataTable/__tests__/DataTable.export.test.tsx +13 -10
  356. package/src/components/DataTable/__tests__/DataTable.grouping-aggregation.test.tsx +14 -11
  357. package/src/components/DataTable/__tests__/DataTable.hooks.test.tsx +4 -2
  358. package/src/components/DataTable/__tests__/DataTable.test.tsx +13 -7
  359. package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +13 -10
  360. package/src/components/DataTable/__tests__/DataTableCore.test.tsx +15 -11
  361. package/src/components/DataTable/__tests__/a11y.basic.test.tsx +12 -6
  362. package/src/components/DataTable/__tests__/keyboard.test.tsx +12 -6
  363. package/src/components/DataTable/__tests__/pagination.modes.test.tsx +10 -6
  364. package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +1 -1
  365. package/src/components/DataTable/components/DataTableBody.tsx +10 -25
  366. package/src/components/DataTable/components/DataTableCore.tsx +1 -1
  367. package/src/components/DataTable/components/FilterRow.tsx +3 -1
  368. package/src/components/DataTable/components/ImportModal.tsx +1 -1
  369. package/src/components/DataTable/components/VirtualizedDataTable.tsx +9 -9
  370. package/src/components/DataTable/core/ColumnFactory.ts +6 -6
  371. package/src/components/DataTable/core/DataTableContext.tsx +14 -10
  372. package/src/components/DataTable/core/LocalDataAdapter.ts +2 -1
  373. package/src/components/DataTable/core/PluginRegistry.ts +3 -3
  374. package/src/components/DataTable/core/StateManager.ts +12 -11
  375. package/src/components/DataTable/core/__tests__/ActionManager.test.ts +104 -0
  376. package/src/components/DataTable/core/__tests__/DataManager.test.ts +101 -0
  377. package/src/components/DataTable/core/__tests__/LocalDataAdapter.test.ts +84 -0
  378. package/src/components/DataTable/core/__tests__/PluginRegistry.test.ts +102 -0
  379. package/src/components/DataTable/core/__tests__/StateManager.test.ts +104 -0
  380. package/src/components/DataTable/core/interfaces.ts +17 -17
  381. package/src/components/DataTable/hooks/__tests__/useDataTableConfiguration.test.ts +124 -0
  382. package/src/components/DataTable/hooks/__tests__/useDataTableDataPipeline.test.ts +117 -0
  383. package/src/components/DataTable/hooks/__tests__/useDataTablePermissions.test.ts +102 -0
  384. package/src/components/DataTable/hooks/__tests__/useEffectiveColumnOrder.test.ts +53 -0
  385. package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +0 -2
  386. package/src/components/DataTable/hooks/useDataTablePermissions.ts +9 -8
  387. package/src/components/DataTable/types.ts +5 -5
  388. package/src/components/DataTable/utils/aggregationUtils.ts +4 -4
  389. package/src/components/DataTable/utils/columnUtils.ts +3 -2
  390. package/src/components/DataTable/utils/debugTools.ts +1 -1
  391. package/src/components/DataTable/utils/exportUtils.ts +6 -6
  392. package/src/components/DataTable/utils/hierarchicalSorting.ts +6 -6
  393. package/src/components/DataTable/utils/hierarchicalUtils.ts +0 -8
  394. package/src/components/DataTable/utils/index.ts +0 -1
  395. package/src/components/DataTable/utils/performanceUtils.ts +9 -4
  396. package/src/components/Dialog/Dialog.test.tsx +49 -27
  397. package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +13 -8
  398. package/src/components/EventSelector/EventSelector.test.tsx +60 -12
  399. package/src/components/EventSelector/EventSelector.tsx +38 -15
  400. package/src/components/EventSelector/index.ts +2 -2
  401. package/src/components/FileDisplay/FileDisplay.test.tsx +143 -85
  402. package/src/components/FileDisplay/FileDisplay.tsx +1 -0
  403. package/src/components/FileUpload/FileUpload.test.tsx +532 -152
  404. package/src/components/FileUpload/FileUpload.tsx +43 -8
  405. package/src/components/Footer/Footer.test.tsx +19 -14
  406. package/src/components/Form/Form.test.tsx +96 -14
  407. package/src/components/Form/Form.tsx +210 -1
  408. package/src/components/Form/index.ts +3 -7
  409. package/src/components/Header/Header.test.tsx +24 -17
  410. package/src/components/Header/Header.tsx +3 -1
  411. package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +2 -4
  412. package/src/components/Input/Input.test.tsx +61 -36
  413. package/src/components/Label/{__tests__/Label.test.tsx → Label.test.tsx} +2 -2
  414. package/src/components/Label/Label.tsx +2 -3
  415. package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +6 -5
  416. package/src/components/LoadingSpinner/LoadingSpinner.tsx +6 -2
  417. package/src/components/LoginForm/LoginForm.test.tsx +14 -13
  418. package/src/components/LoginForm/LoginForm.tsx +1 -1
  419. package/src/components/LoginForm/index.ts +7 -0
  420. package/src/components/NavigationMenu/NavigationMenu.test.tsx +233 -20
  421. package/src/components/NavigationMenu/NavigationMenu.tsx +191 -55
  422. package/src/components/NavigationMenu/index.ts +1 -1
  423. package/src/components/OrganisationSelector/OrganisationSelector.test.tsx +20 -11
  424. package/src/components/OrganisationSelector/OrganisationSelector.tsx +1 -1
  425. package/src/components/PaceAppLayout/{__tests__/PaceAppLayout.integration.test.tsx → PaceAppLayout.integration.test.tsx} +272 -79
  426. package/src/components/PaceAppLayout/{__tests__/PaceAppLayout.performance.test.tsx → PaceAppLayout.performance.test.tsx} +155 -32
  427. package/src/components/PaceAppLayout/{__tests__/PaceAppLayout.security.test.tsx → PaceAppLayout.security.test.tsx} +211 -65
  428. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +498 -210
  429. package/src/components/PaceAppLayout/PaceAppLayout.tsx +63 -64
  430. package/src/components/PaceAppLayout/test-setup.tsx +192 -0
  431. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +193 -39
  432. package/src/components/{PasswordReset → PasswordChange}/PasswordChangeForm.test.tsx +2 -2
  433. package/src/components/{PasswordReset → PasswordChange}/PasswordChangeForm.tsx +10 -4
  434. package/src/components/PasswordChange/index.ts +2 -0
  435. package/src/components/Progress/Progress.test.tsx +11 -0
  436. package/src/components/Progress/Progress.tsx +1 -1
  437. package/src/components/Progress/index.ts +10 -0
  438. package/src/components/ProtectedRoute/ProtectedRoute.test.tsx +2 -1
  439. package/src/components/PublicLayout/PublicLayout.test.tsx +1210 -0
  440. package/src/components/PublicLayout/PublicPageLayout.tsx +190 -36
  441. package/src/components/PublicLayout/PublicPageProvider.tsx +8 -7
  442. package/src/components/PublicLayout/index.ts +10 -28
  443. package/src/components/Select/Select.test.tsx +7 -7
  444. package/src/components/Select/Select.tsx +277 -11
  445. package/src/components/Select/index.ts +1 -2
  446. package/src/components/SessionRestorationLoader/SessionRestorationLoader.test.tsx +232 -0
  447. package/src/components/SessionRestorationLoader/SessionRestorationLoader.tsx +40 -19
  448. package/src/components/Table/{__tests__/Table.test.tsx → Table.test.tsx} +94 -41
  449. package/src/components/Tabs/Tabs.test.tsx +10 -9
  450. package/src/components/Tabs/Tabs.tsx +61 -33
  451. package/src/components/Textarea/Textarea.test.tsx +31 -18
  452. package/src/components/Toast/Toast.tsx +2 -2
  453. package/src/components/Tooltip/Tooltip.test.tsx +1 -1
  454. package/src/components/UserMenu/UserMenu.test.tsx +7 -6
  455. package/src/components/UserMenu/UserMenu.tsx +2 -2
  456. package/src/components/index.ts +5 -4
  457. package/src/constants/performance.ts +19 -8
  458. package/src/hooks/__tests__/useAppConfig.unit.test.ts +21 -22
  459. package/src/hooks/__tests__/useEvents.unit.test.ts +5 -4
  460. package/src/hooks/__tests__/useOrganisationPermissions.unit.test.tsx +2 -2
  461. package/src/hooks/__tests__/usePermissionCache.simple.test.ts +17 -0
  462. package/src/hooks/__tests__/usePermissionCache.unit.test.ts +16 -11
  463. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +1 -3
  464. package/src/hooks/__tests__/usePublicEvent.unit.test.ts +1 -3
  465. package/src/hooks/__tests__/useRBAC.unit.test.ts +24 -2
  466. package/src/hooks/index.ts +4 -0
  467. package/src/hooks/public/index.ts +2 -0
  468. package/src/hooks/public/usePublicEvent.ts +4 -6
  469. package/src/hooks/public/usePublicRouteParams.ts +1 -1
  470. package/src/hooks/services/useAuth.ts +2 -4
  471. package/src/hooks/services/useCurrentEvent.ts +1 -1
  472. package/src/hooks/useAppConfig.ts +1 -1
  473. package/src/hooks/useDataTablePerformance.ts +2 -2
  474. package/src/hooks/useEventTheme.ts +1 -1
  475. package/src/hooks/useEvents.ts +51 -10
  476. package/src/hooks/useOrganisationPermissions.test.ts +3 -3
  477. package/src/hooks/useOrganisationPermissions.ts +1 -1
  478. package/src/hooks/useOrganisationSecurity.ts +2 -2
  479. package/src/hooks/usePermissionCache.test.ts +9 -9
  480. package/src/hooks/usePermissionCache.ts +2 -2
  481. package/src/index.ts +19 -12
  482. package/src/providers/OrganisationProvider.tsx +73 -9
  483. package/src/providers/UnifiedAuthProvider.smoke.test.tsx +113 -13
  484. package/src/providers/__tests__/AuthProvider.test.tsx +2 -1
  485. package/src/providers/__tests__/EventProvider.test.tsx +24 -15
  486. package/src/providers/__tests__/OrganisationProvider.test.tsx +87 -36
  487. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +80 -24
  488. package/src/providers/index.ts +0 -3
  489. package/src/providers/services/AuthServiceProvider.tsx +2 -17
  490. package/src/providers/services/EventServiceProvider.tsx +11 -16
  491. package/src/providers/services/InactivityServiceProvider.tsx +9 -12
  492. package/src/providers/services/OrganisationServiceProvider.tsx +9 -12
  493. package/src/providers/services/UnifiedAuthProvider.tsx +85 -18
  494. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +11 -4
  495. package/src/rbac/__tests__/scenarios.user-role.test.tsx +105 -21
  496. package/src/rbac/adapters.tsx +1 -1
  497. package/src/rbac/api.ts +20 -4
  498. package/src/rbac/audit-enhanced.ts +47 -2
  499. package/src/rbac/audit.ts +47 -2
  500. package/src/rbac/components/NavigationGuard.tsx +1 -1
  501. package/src/rbac/components/NavigationProvider.test.tsx +7 -6
  502. package/src/rbac/components/NavigationProvider.tsx +1 -1
  503. package/src/rbac/components/PagePermissionGuard.tsx +1 -1
  504. package/src/rbac/components/PagePermissionProvider.test.tsx +7 -6
  505. package/src/rbac/components/PagePermissionProvider.tsx +1 -1
  506. package/src/rbac/components/PermissionEnforcer.tsx +1 -1
  507. package/src/rbac/components/RoleBasedRouter.tsx +1 -1
  508. package/src/rbac/components/SecureDataProvider.test.tsx +7 -6
  509. package/src/rbac/components/SecureDataProvider.tsx +1 -1
  510. package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +6 -6
  511. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +11 -10
  512. package/src/rbac/components/__tests__/NavigationProvider.test.tsx +10 -11
  513. package/src/rbac/components/__tests__/PagePermissionGuard.race-condition.test.tsx +19 -15
  514. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +13 -12
  515. package/src/rbac/components/__tests__/PagePermissionGuard.verification.test.tsx +19 -15
  516. package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +18 -18
  517. package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +11 -10
  518. package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +8 -7
  519. package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +10 -11
  520. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +48 -19
  521. package/src/rbac/hooks/__tests__/useSecureSupabase.test.ts +476 -0
  522. package/src/rbac/hooks/index.ts +3 -0
  523. package/src/rbac/hooks/usePermissions.ts +31 -85
  524. package/src/rbac/hooks/useRBAC.test.ts +13 -1
  525. package/src/rbac/hooks/useRBAC.ts +13 -67
  526. package/src/rbac/hooks/useResolvedScope.ts +11 -0
  527. package/src/rbac/hooks/useSecureSupabase.ts +308 -0
  528. package/src/rbac/index.ts +3 -0
  529. package/src/rbac/secureClient.ts +53 -6
  530. package/src/rbac/security.ts +37 -1
  531. package/src/{types/rbac-functions.ts → rbac/types/functions.ts} +30 -30
  532. package/src/rbac/types.ts +3 -2
  533. package/src/services/AuthService.ts +33 -25
  534. package/src/services/EventService.ts +57 -31
  535. package/src/services/InactivityService.ts +33 -53
  536. package/src/services/OrganisationService.ts +36 -40
  537. package/src/services/__tests__/AuthService.restoreSession.test.ts +6 -2
  538. package/src/services/__tests__/EventService.test.ts +67 -33
  539. package/src/services/interfaces/IEventService.ts +1 -1
  540. package/src/styles/core.css +2 -2
  541. package/src/styles/index.ts +1 -5
  542. package/src/types/__tests__/guards.test.ts +1 -1
  543. package/src/types/__tests__/type-validation.test.ts +0 -1
  544. package/src/types/auth.ts +42 -2
  545. package/src/types/core.ts +251 -0
  546. package/src/types/database.ts +11 -496
  547. package/src/types/event.ts +102 -0
  548. package/src/types/file-reference.ts +6 -4
  549. package/src/types/guards.ts +2 -1
  550. package/src/types/index.ts +48 -14
  551. package/src/types/lodash.debounce.d.ts +15 -0
  552. package/src/types/organisation.ts +14 -10
  553. package/src/types/supabase.ts +15 -17
  554. package/src/utils/__tests__/secureErrors.unit.test.ts +1 -1
  555. package/src/utils/__tests__/validationUtils.unit.test.ts +0 -29
  556. package/src/utils/app/appNameResolver.ts +1 -1
  557. package/src/utils/dynamic/dynamicUtils.ts +3 -2
  558. package/src/utils/file-reference/index.ts +25 -6
  559. package/src/utils/security/secureErrors.ts +1 -1
  560. package/src/utils/validation/index.ts +6 -12
  561. package/src/utils/validation/validationUtils.ts +0 -13
  562. package/dist/UnifiedAuthProvider-BMJAP6Z7.js +0 -16
  563. package/dist/auth-DReDSLq9.d.ts +0 -16
  564. package/dist/chunk-56XJ3TU6.js +0 -11
  565. package/dist/chunk-56XJ3TU6.js.map +0 -1
  566. package/dist/chunk-6HLVGAZG.js.map +0 -1
  567. package/dist/chunk-7QCC6MCP.js +0 -288
  568. package/dist/chunk-BESYRHQM.js.map +0 -1
  569. package/dist/chunk-BJPBT3CU.js +0 -21
  570. package/dist/chunk-BJPBT3CU.js.map +0 -1
  571. package/dist/chunk-BVYWGZVV.js.map +0 -1
  572. package/dist/chunk-CPTUD43C.js.map +0 -1
  573. package/dist/chunk-CX5M4ZAG.js.map +0 -1
  574. package/dist/chunk-ERGKJX4D.js +0 -15
  575. package/dist/chunk-ERGKJX4D.js.map +0 -1
  576. package/dist/chunk-ERISIBYU.js.map +0 -1
  577. package/dist/chunk-GQA2LIAE.js.map +0 -1
  578. package/dist/chunk-JISYG63F.js +0 -70
  579. package/dist/chunk-JISYG63F.js.map +0 -1
  580. package/dist/chunk-MSHEVJXS.js +0 -27
  581. package/dist/chunk-MSHEVJXS.js.map +0 -1
  582. package/dist/chunk-N5YCCUG5.js.map +0 -1
  583. package/dist/chunk-ONI7Y733.js.map +0 -1
  584. package/dist/chunk-OWAG3GSU.js.map +0 -1
  585. package/dist/chunk-P6UUHOIF.js.map +0 -1
  586. package/dist/chunk-PKW27QVS.js +0 -61
  587. package/dist/chunk-PKW27QVS.js.map +0 -1
  588. package/dist/chunk-Q5QRDWKI.js.map +0 -1
  589. package/dist/chunk-S5OFRT4M.js.map +0 -1
  590. package/dist/chunk-SBVILCCA.js.map +0 -1
  591. package/dist/chunk-WM26XK7I.js +0 -2432
  592. package/dist/chunk-WM26XK7I.js.map +0 -1
  593. package/dist/chunk-XDNLUEXI.js +0 -138
  594. package/dist/chunk-XJ2HZOBU.js.map +0 -1
  595. package/dist/chunk-ZZ2SS7NI.js +0 -237
  596. package/dist/chunk-ZZ2SS7NI.js.map +0 -1
  597. package/dist/database-C6jy7EOu.d.ts +0 -500
  598. package/dist/organisation-D6qRDtbF.d.ts +0 -93
  599. package/dist/schema-DTDZQe2u.d.ts +0 -28
  600. package/dist/unified-DQ4VcT7H.d.ts +0 -198
  601. package/dist/useInactivityTracker-TO6ZOF35.js +0 -11
  602. package/dist/validation.d.ts +0 -47
  603. package/dist/validation.js +0 -24
  604. package/dist/validation.js.map +0 -1
  605. package/docs/DOCUMENTATION_AUDIT.md +0 -172
  606. package/docs/DOCUMENTATION_STANDARD.md +0 -137
  607. package/docs/api/classes/PublicErrorBoundary.md +0 -132
  608. package/docs/api/interfaces/EventLogoProps.md +0 -152
  609. package/docs/api/interfaces/PublicErrorBoundaryProps.md +0 -94
  610. package/docs/api/interfaces/PublicErrorBoundaryState.md +0 -68
  611. package/docs/api/interfaces/PublicLoadingSpinnerProps.md +0 -86
  612. package/docs/architecture/rpc-function-standards.md +0 -1106
  613. package/docs/getting-started/consuming-app-vite-config.md +0 -239
  614. package/docs/implementation-guides/event-theming-summary.md +0 -226
  615. package/docs/implementation-guides/public-pages-advanced.md +0 -1038
  616. package/docs/migration/v0.4.15-tailwind-scanning.md +0 -278
  617. package/docs/migration/v0.4.16-css-first-approach.md +0 -312
  618. package/docs/migration/v0.4.17-source-path-fix.md +0 -235
  619. package/docs/rbac/RBAC_EVENT_CONTEXT_LOADING.md +0 -222
  620. package/docs/rbac/RBAC_LOGIN_SAFETY_FIX.md +0 -95
  621. package/docs/rbac/RBAC_V0.5.147_FIX.md +0 -117
  622. package/docs/rbac/README-rbac-rls-integration.md +0 -374
  623. package/docs/styles/usage.md +0 -227
  624. package/docs/testing/visual-testing.md +0 -120
  625. package/docs/troubleshooting/DEBUG_NETWORK_ERROR.md +0 -152
  626. package/docs/troubleshooting/FIX_SUPABASE_CORS.md +0 -184
  627. package/docs/troubleshooting/cake-page-permission-guard-issue-summary.md +0 -193
  628. package/docs/troubleshooting/database-view-compatibility.md +0 -125
  629. package/docs/troubleshooting/react-hooks-issue-analysis.md +0 -172
  630. package/docs/troubleshooting/tailwind-content-scanning.md +0 -219
  631. package/examples/RBAC/EventBasedApp.tsx +0 -239
  632. package/examples/RBAC/PermissionExample.tsx +0 -151
  633. package/examples/STRUCTURE.md +0 -125
  634. package/examples/components 2/Dialog/BasicHtmlTest.tsx +0 -55
  635. package/examples/components 2/Dialog/DebugHtmlExample.tsx +0 -68
  636. package/examples/components 2/Dialog/HtmlDialogExample.tsx +0 -202
  637. package/examples/components 2/Dialog/SimpleHtmlTest.tsx +0 -61
  638. package/examples/components 2/Dialog/SmartDialogExample.tsx +0 -322
  639. package/examples/components 2/index.ts +0 -11
  640. package/examples/features/index.ts +0 -12
  641. package/examples/features/rbac/CompleteRBACExample.tsx +0 -324
  642. package/examples/features/rbac/index.ts +0 -13
  643. package/examples/public-pages/CorrectPublicPageImplementation.tsx +0 -301
  644. package/examples/public-pages/PublicEventPage.tsx +0 -274
  645. package/examples/public-pages/PublicPageApp.tsx +0 -308
  646. package/examples/public-pages/PublicPageUsageExample.tsx +0 -216
  647. package/examples/public-pages/index.ts +0 -14
  648. package/src/__tests__/TEST_STANDARD.md +0 -1008
  649. package/src/components/Checkbox/__mocks__/Checkbox.tsx +0 -2
  650. package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +0 -421
  651. package/src/components/DataTable/examples/HierarchicalExample.tsx +0 -475
  652. package/src/components/DataTable/examples/InitialPageSizeExample.tsx +0 -177
  653. package/src/components/DataTable/examples/PerformanceExample.tsx +0 -506
  654. package/src/components/DataTable/examples/__tests__/HierarchicalActionsExample.test.tsx +0 -316
  655. package/src/components/DataTable/examples/__tests__/HierarchicalExample.test.tsx +0 -45
  656. package/src/components/DataTable/examples/__tests__/InitialPageSizeExample.test.tsx +0 -211
  657. package/src/components/DataTable/examples/__tests__/PerformanceExample.test.tsx +0 -126
  658. package/src/components/Dialog/README.md +0 -804
  659. package/src/components/Dialog/examples/BasicHtmlTest.tsx +0 -55
  660. package/src/components/Dialog/examples/DebugHtmlExample.tsx +0 -68
  661. package/src/components/Dialog/examples/ScrollableDialogExample.tsx +0 -290
  662. package/src/components/Dialog/examples/SimpleHtmlTest.tsx +0 -61
  663. package/src/components/Dialog/examples/__tests__/HtmlDialogExample.test.tsx +0 -71
  664. package/src/components/Dialog/examples/__tests__/SimpleHtmlTest.test.tsx +0 -122
  665. package/src/components/Dialog/examples/__tests__/SmartDialogExample.unit.test.tsx +0 -147
  666. package/src/components/Dialog/utils/__tests__/safeHtml.unit.test.ts +0 -611
  667. package/src/components/Dialog/utils/safeHtml.ts +0 -185
  668. package/src/components/EventSelector/types.ts +0 -79
  669. package/src/components/Form/FormErrorSummary.tsx +0 -113
  670. package/src/components/Form/FormField.tsx +0 -249
  671. package/src/components/Form/FormFieldset.tsx +0 -127
  672. package/src/components/Form/FormLiveRegion.tsx +0 -198
  673. package/src/components/Input/__mocks__/Input.tsx +0 -2
  674. package/src/components/NavigationMenu/types.ts +0 -85
  675. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.accessibility.test.tsx +0 -326
  676. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.unit.test.tsx +0 -1078
  677. package/src/components/PasswordReset/PasswordResetForm.test.tsx +0 -597
  678. package/src/components/PasswordReset/PasswordResetForm.tsx +0 -201
  679. package/src/components/PasswordReset/index.ts +0 -2
  680. package/src/components/ProtectedRoute/README.md +0 -164
  681. package/src/components/PublicLayout/EventLogo.tsx +0 -175
  682. package/src/components/PublicLayout/PublicErrorBoundary.tsx +0 -282
  683. package/src/components/PublicLayout/PublicLoadingSpinner.tsx +0 -216
  684. package/src/components/PublicLayout/PublicPageContextChecker.tsx +0 -131
  685. package/src/components/PublicLayout/PublicPageDebugger.tsx +0 -104
  686. package/src/components/PublicLayout/PublicPageDiagnostic.tsx +0 -162
  687. package/src/components/PublicLayout/PublicPageFooter.tsx +0 -124
  688. package/src/components/PublicLayout/PublicPageHeader.tsx +0 -209
  689. package/src/components/PublicLayout/__tests__/PublicErrorBoundary.test.tsx +0 -449
  690. package/src/components/PublicLayout/__tests__/PublicLoadingSpinner.test.tsx +0 -393
  691. package/src/components/PublicLayout/__tests__/PublicPageContextChecker.test.tsx +0 -192
  692. package/src/components/PublicLayout/__tests__/PublicPageFooter.test.tsx +0 -351
  693. package/src/components/PublicLayout/__tests__/PublicPageHeader.test.tsx +0 -402
  694. package/src/components/PublicLayout/__tests__/PublicPageLayout.test.tsx +0 -460
  695. package/src/components/PublicLayout/__tests__/PublicPageProvider.test.tsx +0 -313
  696. package/src/components/Select/hooks.ts +0 -289
  697. package/src/hooks/useCounter.test.ts +0 -131
  698. package/src/hooks/useDebounce.test.ts +0 -375
  699. package/src/providers/AuthProvider.tsx +0 -15
  700. package/src/providers/EventProvider.tsx +0 -16
  701. package/src/providers/InactivityProvider.tsx +0 -15
  702. package/src/providers/OrganisationProvider.context.test.tsx +0 -169
  703. package/src/providers/UnifiedAuthProvider.tsx +0 -15
  704. package/src/types/theme.ts +0 -6
  705. package/src/types/unified.ts +0 -265
  706. package/src/utils/appConfig.ts +0 -47
  707. package/src/utils/appIdResolver.test.ts +0 -499
  708. package/src/utils/appIdResolver.ts +0 -130
  709. package/src/utils/appNameResolver.simple.test.ts +0 -212
  710. package/src/utils/appNameResolver.test.ts +0 -121
  711. package/src/utils/appNameResolver.ts +0 -191
  712. package/src/utils/audit.ts +0 -127
  713. package/src/utils/auth-utils.ts +0 -96
  714. package/src/utils/bundleAnalysis.ts +0 -129
  715. package/src/utils/debugLogger.ts +0 -67
  716. package/src/utils/deviceFingerprint.ts +0 -215
  717. package/src/utils/dynamicUtils.ts +0 -105
  718. package/src/utils/file-reference.test.ts +0 -788
  719. package/src/utils/file-reference.ts +0 -519
  720. package/src/utils/formatDate.test.ts +0 -237
  721. package/src/utils/formatting.ts +0 -170
  722. package/src/utils/lazyLoad.tsx +0 -44
  723. package/src/utils/logger.ts +0 -179
  724. package/src/utils/organisationContext.test.ts +0 -322
  725. package/src/utils/organisationContext.ts +0 -153
  726. package/src/utils/performanceBenchmark.ts +0 -64
  727. package/src/utils/performanceBudgets.ts +0 -110
  728. package/src/utils/permissionTypes.ts +0 -37
  729. package/src/utils/permissionUtils.test.ts +0 -393
  730. package/src/utils/permissionUtils.ts +0 -34
  731. package/src/utils/sanitization.ts +0 -264
  732. package/src/utils/schemaUtils.ts +0 -37
  733. package/src/utils/secureDataAccess.test.ts +0 -711
  734. package/src/utils/secureDataAccess.ts +0 -377
  735. package/src/utils/secureErrors.ts +0 -79
  736. package/src/utils/security.ts +0 -156
  737. package/src/utils/securityMonitor.ts +0 -45
  738. package/src/utils/sessionTracking.ts +0 -126
  739. package/src/utils/validation.ts +0 -111
  740. package/src/utils/validationUtils.ts +0 -120
  741. package/src/validation/index.ts +0 -12
  742. /package/dist/{DataTable-4VSEJQ7D.js.map → DataTable-QAB34V6K.js.map} +0 -0
  743. /package/dist/{UnifiedAuthProvider-BMJAP6Z7.js.map → UnifiedAuthProvider-7F6T4B6K.js.map} +0 -0
  744. /package/dist/{api-45XYYO2A.js.map → api-ROMBCNKU.js.map} +0 -0
  745. /package/dist/{audit-64X3VJXB.js.map → audit-WRS3KJKI.js.map} +0 -0
  746. /package/dist/{chunk-PLDDJCW6.js.map → chunk-7D4SUZUM.js.map} +0 -0
  747. /package/dist/{useInactivityTracker-TO6ZOF35.js.map → chunk-KQCRWDSA.js.map} +0 -0
  748. /package/examples/{components 2/DataTable → DataTable}/InitialPageSizeExample.tsx +0 -0
  749. /package/examples/{features/public-pages → PublicPages}/index.ts +0 -0
  750. /package/examples/{RBAC → rbac}/index.ts +0 -0
@@ -8,7 +8,7 @@
8
8
  * Provides authentication service instance to React components.
9
9
  */
10
10
 
11
- import React, { createContext, useContext, useMemo, useEffect, useState } from 'react';
11
+ import React, { createContext, useMemo, useEffect, useState } from 'react';
12
12
  import { type SupabaseClient } from '@supabase/supabase-js';
13
13
  import { AuthService } from '../../services/AuthService';
14
14
  import type { SessionRestorationState } from '../../types/auth';
@@ -44,11 +44,6 @@ export function AuthServiceProvider({ children, supabaseClient, appName }: AuthS
44
44
  const unsubscribe = authService.subscribe(() => {
45
45
  const restorationState = authService.getSessionRestorationState();
46
46
  setSessionRestoration(restorationState);
47
-
48
- const isDev = typeof import.meta !== 'undefined' && (import.meta.env.DEV || import.meta.env.MODE === 'development');
49
- if (isDev) {
50
- logger.debug('AuthServiceProvider', 'Session restoration state updated', restorationState);
51
- }
52
47
  });
53
48
 
54
49
  return () => {
@@ -78,14 +73,4 @@ export function AuthServiceProvider({ children, supabaseClient, appName }: AuthS
78
73
  {children}
79
74
  </AuthServiceContext.Provider>
80
75
  );
81
- }
82
-
83
- export const useAuthService = (): AuthService => {
84
- const context = useContext(AuthServiceContext);
85
-
86
- if (!context) {
87
- throw new Error('useAuthService must be used within AuthServiceProvider');
88
- }
89
-
90
- return context.authService;
91
- };
76
+ }
@@ -8,19 +8,17 @@
8
8
  * Provides event service instance to React components.
9
9
  */
10
10
 
11
- import React, { createContext, useContext, useMemo, useEffect, useRef } from 'react';
11
+ import React, { createContext, useMemo, useEffect, useRef } from 'react';
12
12
  import { type SupabaseClient, type User, type Session } from '@supabase/supabase-js';
13
13
  import { EventService } from '../../services/EventService';
14
14
  import { logger } from '../../utils/core/logger';
15
+ import type { Organisation } from '../../types/organisation';
15
16
 
16
17
  // Context type
17
18
  export interface EventServiceContextType {
18
19
  eventService: EventService;
19
20
  }
20
21
 
21
- // Backward compatibility type alias
22
- export type EventContextType = EventServiceContextType;
23
-
24
22
  export const EventServiceContext = createContext<EventServiceContextType | null>(null);
25
23
 
26
24
  export interface EventServiceProviderProps {
@@ -29,7 +27,7 @@ export interface EventServiceProviderProps {
29
27
  user: User | null;
30
28
  session: Session | null;
31
29
  appName: string;
32
- selectedOrganisation: any;
30
+ selectedOrganisation: Organisation | null;
33
31
  setSelectedEventId: (eventId: string | null) => void;
34
32
  }
35
33
 
@@ -76,6 +74,13 @@ export function EventServiceProvider({
76
74
  };
77
75
  }, [eventService, supabaseClient, user, session, appName, selectedOrganisation, setSelectedEventId]);
78
76
 
77
+ // Cleanup service on unmount only
78
+ useEffect(() => {
79
+ return () => {
80
+ eventService.cleanup();
81
+ };
82
+ }, [eventService]);
83
+
79
84
  const contextValue = useMemo(() => ({
80
85
  eventService
81
86
  }), [eventService]);
@@ -85,14 +90,4 @@ export function EventServiceProvider({
85
90
  {children}
86
91
  </EventServiceContext.Provider>
87
92
  );
88
- }
89
-
90
- export const useEventService = (): EventService => {
91
- const context = useContext(EventServiceContext);
92
-
93
- if (!context) {
94
- throw new Error('useEventService must be used within EventServiceProvider');
95
- }
96
-
97
- return context.eventService;
98
- };
93
+ }
@@ -8,7 +8,7 @@
8
8
  * Provides inactivity service instance to React components.
9
9
  */
10
10
 
11
- import React, { createContext, useContext, useMemo, useEffect, useRef } from 'react';
11
+ import React, { createContext, useMemo, useEffect, useRef } from 'react';
12
12
  import { type SupabaseClient, type User, type Session } from '@supabase/supabase-js';
13
13
  import { InactivityService } from '../../services/InactivityService';
14
14
  import { logger } from '../../utils/core/logger';
@@ -66,6 +66,13 @@ export function InactivityServiceProvider({
66
66
  };
67
67
  }, [inactivityService, supabaseClient, user, session, idleTimeoutMs, warnBeforeMs, onIdleLogout]);
68
68
 
69
+ // Cleanup service on unmount only
70
+ useEffect(() => {
71
+ return () => {
72
+ inactivityService.cleanup();
73
+ };
74
+ }, [inactivityService]);
75
+
69
76
  const contextValue = useMemo(() => ({
70
77
  inactivityService
71
78
  }), [inactivityService]);
@@ -75,14 +82,4 @@ export function InactivityServiceProvider({
75
82
  {children}
76
83
  </InactivityServiceContext.Provider>
77
84
  );
78
- }
79
-
80
- export const useInactivityService = (): InactivityService => {
81
- const context = useContext(InactivityServiceContext);
82
-
83
- if (!context) {
84
- throw new Error('useInactivityService must be used within InactivityServiceProvider');
85
- }
86
-
87
- return context.inactivityService;
88
- };
85
+ }
@@ -8,7 +8,7 @@
8
8
  * Provides organisation service instance to React components.
9
9
  */
10
10
 
11
- import React, { createContext, useContext, useMemo, useEffect, useRef } from 'react';
11
+ import React, { createContext, useMemo, useEffect, useRef } from 'react';
12
12
  import { type SupabaseClient, type User, type Session } from '@supabase/supabase-js';
13
13
  import { OrganisationService } from '../../services/OrganisationService';
14
14
  import { logger } from '../../utils/core/logger';
@@ -60,6 +60,13 @@ export function OrganisationServiceProvider({
60
60
  };
61
61
  }, [organisationService, user, session]);
62
62
 
63
+ // Cleanup service on unmount only
64
+ useEffect(() => {
65
+ return () => {
66
+ organisationService.cleanup();
67
+ };
68
+ }, [organisationService]);
69
+
63
70
  const contextValue = useMemo(() => ({
64
71
  organisationService
65
72
  }), [organisationService]);
@@ -69,14 +76,4 @@ export function OrganisationServiceProvider({
69
76
  {children}
70
77
  </OrganisationServiceContext.Provider>
71
78
  );
72
- }
73
-
74
- export const useOrganisationService = (): OrganisationService => {
75
- const context = useContext(OrganisationServiceContext);
76
-
77
- if (!context) {
78
- throw new Error('useOrganisationService must be used within OrganisationServiceProvider');
79
- }
80
-
81
- return context.organisationService;
82
- };
79
+ }
@@ -8,7 +8,7 @@
8
8
  * Note: RBAC functionality is available via useRBAC() hook from '@jmruthers/pace-core/rbac'
9
9
  */
10
10
 
11
- import React, { createContext, useContext, useMemo, useCallback, useRef } from 'react';
11
+ import React, { createContext, useContext, useMemo, useCallback, useRef, useEffect, useState } from 'react';
12
12
  import { type SupabaseClient, type User, type Session } from '@supabase/supabase-js';
13
13
  import { AuthServiceProvider } from './AuthServiceProvider';
14
14
  import { OrganisationServiceProvider } from './OrganisationServiceProvider';
@@ -20,7 +20,7 @@ import { useEventService } from '../../hooks/services/useEventService';
20
20
  import { useInactivityService } from '../../hooks/services/useInactivityService';
21
21
  import { useSessionRestoration } from '../../hooks/useSessionRestoration';
22
22
  import type { Organisation, OrganisationMembership } from '../../types/organisation';
23
- import type { Event } from '../../types/unified';
23
+ import type { Event } from '../../types/event';
24
24
  import type { AuthError } from '@supabase/supabase-js';
25
25
  import type { SessionRestorationState } from '../../types/auth';
26
26
  import { logger } from '../../utils/core/logger';
@@ -47,9 +47,12 @@ export interface UnifiedAuthContextType {
47
47
  isAuthenticated: boolean;
48
48
  authLoading: boolean;
49
49
  authError: AuthError | null;
50
- error: AuthError | null; // Alias for authError for backward compatibility
51
50
  supabase: SupabaseClient | null;
52
51
 
52
+ // App context (resolved immediately on login)
53
+ appName: string;
54
+ appId: string | undefined; // Resolved from appName when user logs in
55
+
53
56
  // Auth methods
54
57
  signIn: (email: string, password?: string) => Promise<{ error: AuthError | null }>;
55
58
  signUp: (email: string, password: string) => Promise<{ error: AuthError | null }>;
@@ -103,7 +106,6 @@ export interface UnifiedAuthContextType {
103
106
  handleSignOutNow: () => Promise<void>;
104
107
 
105
108
  // Additional unified properties
106
- appName: string;
107
109
  appConfig: { requires_event: boolean } | null;
108
110
  isLoading: boolean;
109
111
  hasErrors: boolean;
@@ -191,6 +193,68 @@ function UnifiedAuthContextProvider({
191
193
  const currentUser = authService.getUser();
192
194
  const currentSession = authService.getSession();
193
195
  const isAuth = !!(currentUser && currentSession);
196
+
197
+ // Get supabase client early so we can use it in useEffect
198
+ const supabase = authService.getSupabaseClient();
199
+
200
+ // Resolve appId immediately when user logs in (don't wait for organisation/event)
201
+ // This makes appId available early for navigation menu filtering
202
+ const [appId, setAppId] = useState<string | undefined>(undefined);
203
+ const isResolvingAppIdRef = useRef(false);
204
+
205
+ useEffect(() => {
206
+ // Resolve appId as soon as we have user + supabase + appName
207
+ // Don't wait for organisation or event - appId resolution only needs user + appName
208
+ if (
209
+ isAuth &&
210
+ currentUser?.id &&
211
+ supabase &&
212
+ appName &&
213
+ !appId &&
214
+ !isResolvingAppIdRef.current
215
+ ) {
216
+ isResolvingAppIdRef.current = true;
217
+ const userId = currentUser.id;
218
+ const appNameValue = appName;
219
+
220
+ // Resolve appId immediately
221
+ import('../../rbac/api').then(async ({ resolveAppContext, setupRBAC }) => {
222
+ try {
223
+ // Ensure RBAC is initialized (idempotent - safe to call multiple times)
224
+ setupRBAC(supabase);
225
+
226
+ const result = await resolveAppContext({
227
+ userId,
228
+ appName: appNameValue
229
+ });
230
+
231
+ if (result?.appId) {
232
+ setAppId(result.appId);
233
+ logger.debug('UnifiedAuthProvider', 'appId resolved on login', {
234
+ appId: result.appId,
235
+ appName: appNameValue
236
+ });
237
+ }
238
+ } catch (error) {
239
+ logger.error('UnifiedAuthProvider', 'Failed to resolve appId on login', {
240
+ error: error instanceof Error ? error.message : String(error),
241
+ appName: appNameValue,
242
+ userId
243
+ });
244
+ } finally {
245
+ isResolvingAppIdRef.current = false;
246
+ }
247
+ }).catch((importError) => {
248
+ logger.error('UnifiedAuthProvider', 'Failed to import RBAC API', importError);
249
+ isResolvingAppIdRef.current = false;
250
+ });
251
+ }
252
+
253
+ // Clear appId when user logs out
254
+ if (!isAuth) {
255
+ setAppId(undefined);
256
+ }
257
+ }, [isAuth, currentUser?.id, supabase, appName, appId]);
194
258
 
195
259
  // Get loading states - these will trigger re-renders when services change
196
260
  const authLoading = authService.isLoading();
@@ -201,7 +265,7 @@ function UnifiedAuthContextProvider({
201
265
 
202
266
  // Extract all primitive values from services to use in dependencies
203
267
  const authError = authService.getError();
204
- const supabase = authService.getSupabaseClient();
268
+ // supabase is already declared above (line 198)
205
269
  const selectedOrganisation = organisationService.getSelectedOrganisation();
206
270
  const organisations = organisationService.getOrganisations();
207
271
  const userMemberships = organisationService.getUserMemberships();
@@ -266,18 +330,7 @@ function UnifiedAuthContextProvider({
266
330
  prevState.isAuthenticated !== currentState.isAuthenticated ||
267
331
  prevState.userEmail !== currentState.userEmail ||
268
332
  prevState.totalLoading !== currentState.totalLoading) {
269
- logger.debug('UnifiedAuthContext', 'Auth state changed:', {
270
- isAuthenticated: isAuth,
271
- user: currentUser?.email,
272
- session: currentSession ? 'exists' : 'null',
273
- totalLoading,
274
- authLoading,
275
- orgLoading,
276
- eventLoading,
277
- orgContextReady: isContextReady,
278
- sessionRestoration,
279
- sessionRestorationTimedOut,
280
- });
333
+ // State change detected, notify subscribers
281
334
  prevStateRef.current = currentState;
282
335
  }
283
336
  }
@@ -291,7 +344,6 @@ function UnifiedAuthContextProvider({
291
344
  isAuthenticated: isAuth,
292
345
  authLoading: authLoading,
293
346
  authError: authError,
294
- error: authError, // Alias for backward compatibility
295
347
  supabase: supabase,
296
348
 
297
349
  // Auth methods
@@ -348,6 +400,7 @@ function UnifiedAuthContextProvider({
348
400
 
349
401
  // Additional unified properties
350
402
  appName,
403
+ appId, // Resolved immediately on login
351
404
  appConfig: appConfig,
352
405
  isLoading: totalLoading,
353
406
  hasErrors: hasErrors,
@@ -384,6 +437,7 @@ function UnifiedAuthContextProvider({
384
437
  totalLoading,
385
438
  hasErrors,
386
439
  appName,
440
+ appId,
387
441
  appConfig,
388
442
  sessionRestoration,
389
443
  sessionRestorationTimedOut,
@@ -526,6 +580,19 @@ export function UnifiedAuthProvider({
526
580
  renderInactivityWarning,
527
581
  dangerouslyDisableInactivity = false
528
582
  }: UnifiedAuthProviderProps) {
583
+ // Warn if supabaseClient reference changes (indicates multiple client instances)
584
+ const clientRef = useRef(supabaseClient);
585
+ useEffect(() => {
586
+ if (clientRef.current !== supabaseClient) {
587
+ logger.warn('UnifiedAuthProvider', 'Supabase client reference changed - this may indicate multiple client instances are being created', {
588
+ previousClient: clientRef.current,
589
+ newClient: supabaseClient,
590
+ note: 'Ensure you create the Supabase client once and reuse it. Creating multiple clients can cause performance issues and the "Multiple GoTrueClient instances" warning.'
591
+ });
592
+ clientRef.current = supabaseClient;
593
+ }
594
+ }, [supabaseClient]);
595
+
529
596
  return (
530
597
  <AuthServiceProvider supabaseClient={supabaseClient} appName={appName}>
531
598
  <ServiceAwareProviders
@@ -11,7 +11,8 @@
11
11
  import { describe, it, expect, beforeEach, vi, afterEach } from 'vitest';
12
12
  import { render, screen, waitFor } from '@testing-library/react';
13
13
  import React from 'react';
14
- import { AuthServiceProvider, useAuthService } from '../AuthServiceProvider';
14
+ import { AuthServiceProvider } from '../AuthServiceProvider';
15
+ import { useAuthService } from '../../../hooks/services/useAuthService';
15
16
  import { type SupabaseClient, type User, type Session } from '@supabase/supabase-js';
16
17
  import { Logger, LogLevel } from '../../../utils/core/logger';
17
18
 
@@ -131,7 +132,9 @@ describe('AuthServiceProvider Integration', () => {
131
132
  describe('Service Integration', () => {
132
133
  it('should initialize service on mount', async () => {
133
134
  const mockSubscription = { unsubscribe: vi.fn() };
134
- vi.mocked(mockSupabase.auth.onAuthStateChange).mockReturnValue(mockSubscription);
135
+ vi.mocked(mockSupabase.auth.onAuthStateChange).mockReturnValue({
136
+ data: { subscription: mockSubscription }
137
+ } as any);
135
138
 
136
139
  render(
137
140
  <AuthServiceProvider supabaseClient={mockSupabase}>
@@ -147,7 +150,9 @@ describe('AuthServiceProvider Integration', () => {
147
150
 
148
151
  it('should cleanup service on unmount', async () => {
149
152
  const mockSubscription = { unsubscribe: vi.fn() };
150
- vi.mocked(mockSupabase.auth.onAuthStateChange).mockReturnValue(mockSubscription);
153
+ vi.mocked(mockSupabase.auth.onAuthStateChange).mockReturnValue({
154
+ data: { subscription: mockSubscription }
155
+ } as any);
151
156
 
152
157
  const { unmount } = render(
153
158
  <AuthServiceProvider supabaseClient={mockSupabase}>
@@ -173,7 +178,9 @@ describe('AuthServiceProvider Integration', () => {
173
178
 
174
179
  vi.mocked(mockSupabase.auth.onAuthStateChange).mockImplementation((callback) => {
175
180
  capturedCallback = callback;
176
- return mockSubscription;
181
+ return {
182
+ data: { subscription: mockSubscription }
183
+ } as any;
177
184
  });
178
185
 
179
186
  render(
@@ -3,8 +3,69 @@ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
3
3
  import { render, screen, waitFor, act } from '@testing-library/react';
4
4
  import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
5
5
  import { createMemoryRouter, RouterProvider } from 'react-router-dom';
6
- import { UnifiedAuthProvider } from '../../providers/UnifiedAuthProvider';
7
- import { OrganisationProvider } from '../../providers/OrganisationProvider';
6
+ import { UnifiedAuthProvider } from '../../providers/services/UnifiedAuthProvider';
7
+ import { OrganisationServiceProvider } from '../../providers/services/OrganisationServiceProvider';
8
+ import type { SupabaseClient } from '@supabase/supabase-js';
9
+
10
+ // Hoist mockSupabaseClient before mocks that reference it
11
+ const mockSupabaseClient = vi.hoisted(() => ({
12
+ auth: {
13
+ getUser: vi.fn(),
14
+ },
15
+ from: vi.fn(),
16
+ rpc: vi.fn(),
17
+ } as unknown as SupabaseClient));
18
+
19
+ // Mock all service hooks used by UnifiedAuthProvider
20
+ vi.mock('../../hooks/services/useAuthService', () => ({
21
+ useAuthService: () => ({
22
+ getUser: vi.fn(() => ({ id: 'user-123', email: 'test@example.com' })),
23
+ getSession: vi.fn(() => ({ access_token: 'token' })),
24
+ isLoading: vi.fn(() => false),
25
+ getError: vi.fn(() => null),
26
+ getSupabaseClient: vi.fn(() => mockSupabaseClient),
27
+ signIn: vi.fn(),
28
+ signUp: vi.fn(),
29
+ signOut: vi.fn(),
30
+ resetPassword: vi.fn(),
31
+ updatePassword: vi.fn(),
32
+ refreshSession: vi.fn(),
33
+ }),
34
+ }));
35
+
36
+ vi.mock('../../hooks/services/useEventService', () => ({
37
+ useEventService: () => ({
38
+ getEvents: vi.fn(() => []),
39
+ getSelectedEvent: vi.fn(() => null),
40
+ isLoading: vi.fn(() => false),
41
+ getError: vi.fn(() => null),
42
+ setSelectedEvent: vi.fn(),
43
+ refreshEvents: vi.fn(),
44
+ }),
45
+ }));
46
+
47
+ vi.mock('../../hooks/services/useInactivityService', () => ({
48
+ useInactivityService: () => ({
49
+ getShowInactivityWarning: vi.fn(() => false),
50
+ getInactivityTimeRemaining: vi.fn(() => 0),
51
+ isIdle: vi.fn(() => false),
52
+ getTimeRemaining: vi.fn(() => 0),
53
+ isWarningShown: vi.fn(() => false),
54
+ isTracking: vi.fn(() => false),
55
+ resetActivity: vi.fn(),
56
+ startTracking: vi.fn(),
57
+ stopTracking: vi.fn(),
58
+ handleIdleLogout: vi.fn(),
59
+ }),
60
+ }));
61
+
62
+ vi.mock('../../hooks/useSessionRestoration', () => ({
63
+ useSessionRestoration: () => ({
64
+ isRestoring: false,
65
+ restorationError: null,
66
+ }),
67
+ }));
68
+
8
69
  // Note: RBACProvider was removed as part of Phase 1 - use useRBAC() hook instead
9
70
  vi.mock('../hooks/useRBAC', () => ({
10
71
  useRBAC: () => ({
@@ -27,7 +88,7 @@ import { useCan, useAccessLevel, useHasAnyPermission, useHasAllPermissions } fro
27
88
  import { useCachedPermissions } from '../hooks';
28
89
  import { usePermissionCache } from '../../hooks/usePermissionCache';
29
90
  import { useOrganisationPermissions } from '../../hooks/useOrganisationPermissions';
30
- import type { SupabaseClient, User } from '@supabase/supabase-js';
91
+ import type { User } from '@supabase/supabase-js';
31
92
  import type { Organisation } from '../../types/organisation';
32
93
  import type { AccessLevel } from '../types/access';
33
94
 
@@ -61,23 +122,46 @@ vi.mock('../../hooks/useOrganisationSecurity', () => ({
61
122
  isOrganisationLoaded: true,
62
123
  })
63
124
  }));
64
- vi.mock('../../providers/OrganisationProvider', () => ({
65
- OrganisationProvider: ({ children }: any) => children,
66
- useOrganisations: () => ({
67
- selectedOrganisation: { id: 'org-123', name: 'Test Organisation' },
68
- isOrganisationLoaded: true,
69
- isLoading: false,
70
- error: null,
71
- })
125
+
126
+ // Hoist mockOrganisationService before mocks that reference it
127
+ const mockOrganisationService = vi.hoisted(() => ({
128
+ getSelectedOrganisation: vi.fn(() => ({ id: 'org-123', name: 'Test Organisation' })),
129
+ getOrganisations: vi.fn(() => [{ id: 'org-123', name: 'Test Organisation' }]),
130
+ getUserMemberships: vi.fn(() => []),
131
+ isLoading: vi.fn(() => false),
132
+ getError: vi.fn(() => null),
133
+ hasValidOrganisationContext: vi.fn(() => true),
134
+ isContextReady: vi.fn(() => true),
135
+ setSelectedOrganisation: vi.fn(),
136
+ switchOrganisation: vi.fn().mockResolvedValue(undefined),
137
+ getUserRole: vi.fn(() => 'member'),
138
+ validateOrganisationAccess: vi.fn(() => true),
139
+ ensureOrganisationContext: vi.fn(() => ({ id: 'org-123', name: 'Test Organisation' })),
140
+ refreshOrganisations: vi.fn().mockResolvedValue(undefined),
141
+ getPrimaryOrganisation: vi.fn(() => ({ id: 'org-123', name: 'Test Organisation' })),
142
+ isOrganisationSecure: vi.fn(() => true),
143
+ subscribe: vi.fn(() => () => {}),
144
+ initialize: vi.fn().mockResolvedValue(undefined),
145
+ cleanup: vi.fn(),
146
+ updateDependencies: vi.fn(),
72
147
  }));
73
148
 
74
- const mockSupabaseClient = {
75
- auth: {
76
- getUser: vi.fn(),
77
- },
78
- from: vi.fn(),
79
- rpc: vi.fn(),
80
- } as unknown as SupabaseClient;
149
+ vi.mock('../../hooks/services/useOrganisationService', () => ({
150
+ useOrganisationService: () => mockOrganisationService,
151
+ }));
152
+
153
+ // Mock OrganisationServiceProvider with context
154
+ vi.mock('../../providers/services/OrganisationServiceProvider', async (importOriginal) => {
155
+ const actual = await importOriginal<typeof import('../../providers/services/OrganisationServiceProvider')>();
156
+ return {
157
+ ...actual,
158
+ OrganisationServiceProvider: ({ children }: any) => (
159
+ <actual.OrganisationServiceContext.Provider value={{ organisationService: mockOrganisationService }}>
160
+ {children}
161
+ </actual.OrganisationServiceContext.Provider>
162
+ ),
163
+ };
164
+ });
81
165
 
82
166
  const mockUser: User = {
83
167
  id: 'user-123',
@@ -142,10 +226,10 @@ const Wrapper = ({ children }: { children: React.ReactNode }) => {
142
226
  });
143
227
  return (
144
228
  <QueryClientProvider client={queryClient}>
145
- <UnifiedAuthProvider supabase={mockSupabaseClient}>
146
- <OrganisationProvider>
229
+ <UnifiedAuthProvider supabaseClient={mockSupabaseClient} appName="TEST_APP" idleTimeoutMs={30000} warnBeforeMs={5000} onIdleLogout={() => {}}>
230
+ <OrganisationServiceProvider supabaseClient={mockSupabaseClient} user={null} session={null}>
147
231
  {children}
148
- </OrganisationProvider>
232
+ </OrganisationServiceProvider>
149
233
  </UnifiedAuthProvider>
150
234
  </QueryClientProvider>
151
235
  );
@@ -12,7 +12,7 @@ import { UUID, Permission } from './types';
12
12
  import { useCan } from './hooks';
13
13
  import { rbacCache, RBACCache } from './cache';
14
14
  import { getRBACLogger } from './config';
15
- import { useUnifiedAuth } from '../providers/UnifiedAuthProvider';
15
+ import { useUnifiedAuth } from '../providers/services/UnifiedAuthProvider';
16
16
 
17
17
  // ============================================================================
18
18
  // REACT COMPONENTS
package/src/rbac/api.ts CHANGED
@@ -43,18 +43,34 @@ export function setupRBAC(supabase: SupabaseClient<Database>, config?: Partial<R
43
43
  const logger = getRBACLogger();
44
44
 
45
45
  // Create full config
46
+ const isDevelopment = import.meta.env.MODE === 'development';
46
47
  const fullConfig: RBACConfig = {
47
48
  supabase,
48
- debug: import.meta.env.MODE === 'development',
49
+ debug: isDevelopment,
49
50
  logLevel: 'warn',
50
- developmentMode: import.meta.env.MODE === 'development',
51
+ developmentMode: isDevelopment,
51
52
  ...config,
52
53
  };
53
54
 
54
55
  createRBACConfig(fullConfig);
55
56
 
56
- // Pass security config to engine if provided
57
- globalEngine = createRBACEngine(supabase, config?.security);
57
+ // Automatically disable rate limiting in development mode unless explicitly overridden
58
+ // Apply default first, then let explicit config override it
59
+ // Pass undefined if no config provided and not in development, otherwise create security config
60
+ const securityConfig =
61
+ config === undefined && !isDevelopment
62
+ ? undefined
63
+ : {
64
+ // Default: disable rate limiting in development
65
+ ...(isDevelopment && config?.security?.enableRateLimiting === undefined
66
+ ? { enableRateLimiting: false }
67
+ : {}),
68
+ // Explicit config overrides defaults
69
+ ...config?.security,
70
+ };
71
+
72
+ // Pass security config to engine
73
+ globalEngine = createRBACEngine(supabase, securityConfig);
58
74
 
59
75
  // Setup audit manager
60
76
  const auditManager = createAuditManager(supabase);
@@ -15,6 +15,7 @@ import {
15
15
  AuditEventSource,
16
16
  RBACAuditEvent
17
17
  } from './types';
18
+ import type { AuditEventType } from './types/functions';
18
19
  import { logger } from '../utils/core/logger';
19
20
 
20
21
  /**
@@ -299,10 +300,32 @@ export class EnhancedRBACAuditManager {
299
300
  .limit(limit);
300
301
 
301
302
  if (error) {
303
+ // Detect CORS errors (they typically have null status or specific error codes)
304
+ const isCorsError =
305
+ error.message?.toLowerCase().includes('cors') ||
306
+ error.message?.toLowerCase().includes('cross-origin') ||
307
+ error.code === null ||
308
+ (error as any).status === null;
309
+
310
+ if (isCorsError) {
311
+ const corsError = new Error(
312
+ `CORS error when querying audit events. This is a Supabase configuration issue. ` +
313
+ `Please configure CORS in your Supabase Dashboard: Settings → API → CORS. ` +
314
+ `Add your app's origin (e.g., http://localhost:8087) to the allowed origins list. ` +
315
+ `Original error: ${error.message || 'CORS request did not succeed'}`
316
+ );
317
+ (corsError as any).isCorsError = true;
318
+ (corsError as any).originalError = error;
319
+ throw corsError;
320
+ }
321
+
302
322
  throw new Error(`Failed to get audit events: ${error.message}`);
303
323
  }
304
324
 
305
- return data || [];
325
+ return (data || []).map(event => ({
326
+ ...event,
327
+ event_type: event.event_type as AuditEventType
328
+ })) as RBACAuditEvent[];
306
329
  }
307
330
 
308
331
  /**
@@ -321,10 +344,32 @@ export class EnhancedRBACAuditManager {
321
344
  .limit(limit);
322
345
 
323
346
  if (error) {
347
+ // Detect CORS errors (they typically have null status or specific error codes)
348
+ const isCorsError =
349
+ error.message?.toLowerCase().includes('cors') ||
350
+ error.message?.toLowerCase().includes('cross-origin') ||
351
+ error.code === null ||
352
+ (error as any).status === null;
353
+
354
+ if (isCorsError) {
355
+ const corsError = new Error(
356
+ `CORS error when querying audit events. This is a Supabase configuration issue. ` +
357
+ `Please configure CORS in your Supabase Dashboard: Settings → API → CORS. ` +
358
+ `Add your app's origin (e.g., http://localhost:8087) to the allowed origins list. ` +
359
+ `Original error: ${error.message || 'CORS request did not succeed'}`
360
+ );
361
+ (corsError as any).isCorsError = true;
362
+ (corsError as any).originalError = error;
363
+ throw corsError;
364
+ }
365
+
324
366
  throw new Error(`Failed to get audit events: ${error.message}`);
325
367
  }
326
368
 
327
- return data || [];
369
+ return (data || []).map(event => ({
370
+ ...event,
371
+ event_type: event.event_type as AuditEventType
372
+ })) as RBACAuditEvent[];
328
373
  }
329
374
  }
330
375