@jmruthers/pace-core 0.5.181 → 0.5.183

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 (756) 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-UA6CL4JI.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-HRO5HWN2.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-HZLDFOE4.js → chunk-MI7HBHN3.js} +164 -243
  36. package/dist/chunk-MI7HBHN3.js.map +1 -0
  37. package/dist/{chunk-PPMP5J6T.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-D7LCGMVS.js → chunk-QETLRQI6.js} +526 -887
  44. package/dist/chunk-QETLRQI6.js.map +1 -0
  45. package/dist/{chunk-5MT24GKJ.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-ZYTYSTO5.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-VZ4VDGTB.js → chunk-W22JP75J.js} +5 -13
  60. package/dist/{chunk-VZ4VDGTB.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/{src/components/DataTable/examples → examples/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/usePublicEventLogo.test.ts +147 -0
  470. package/src/hooks/public/usePublicRouteParams.ts +1 -1
  471. package/src/hooks/services/useAuth.ts +2 -4
  472. package/src/hooks/services/useCurrentEvent.ts +1 -1
  473. package/src/hooks/useAppConfig.ts +1 -1
  474. package/src/hooks/useDataTablePerformance.ts +2 -2
  475. package/src/hooks/useEventTheme.ts +1 -1
  476. package/src/hooks/useEvents.ts +51 -10
  477. package/src/hooks/useOrganisationPermissions.test.ts +3 -3
  478. package/src/hooks/useOrganisationPermissions.ts +1 -1
  479. package/src/hooks/useOrganisationSecurity.ts +2 -2
  480. package/src/hooks/usePermissionCache.test.ts +9 -9
  481. package/src/hooks/usePermissionCache.ts +2 -2
  482. package/src/index.ts +19 -12
  483. package/src/providers/OrganisationProvider.tsx +73 -9
  484. package/src/providers/UnifiedAuthProvider.smoke.test.tsx +113 -13
  485. package/src/providers/__tests__/AuthProvider.test.tsx +2 -1
  486. package/src/providers/__tests__/EventProvider.test.tsx +24 -15
  487. package/src/providers/__tests__/OrganisationProvider.test.tsx +87 -36
  488. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +80 -24
  489. package/src/providers/index.ts +0 -3
  490. package/src/providers/services/AuthServiceProvider.tsx +2 -17
  491. package/src/providers/services/EventServiceProvider.tsx +11 -16
  492. package/src/providers/services/InactivityServiceProvider.tsx +9 -12
  493. package/src/providers/services/OrganisationServiceProvider.tsx +9 -12
  494. package/src/providers/services/UnifiedAuthProvider.tsx +85 -18
  495. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +11 -4
  496. package/src/rbac/__tests__/scenarios.user-role.test.tsx +105 -21
  497. package/src/rbac/adapters.tsx +1 -1
  498. package/src/rbac/api.ts +20 -4
  499. package/src/rbac/audit-enhanced.ts +47 -2
  500. package/src/rbac/audit.ts +47 -2
  501. package/src/rbac/components/NavigationGuard.tsx +1 -1
  502. package/src/rbac/components/NavigationProvider.test.tsx +7 -6
  503. package/src/rbac/components/NavigationProvider.tsx +1 -1
  504. package/src/rbac/components/PagePermissionGuard.tsx +1 -1
  505. package/src/rbac/components/PagePermissionProvider.test.tsx +7 -6
  506. package/src/rbac/components/PagePermissionProvider.tsx +1 -1
  507. package/src/rbac/components/PermissionEnforcer.tsx +1 -1
  508. package/src/rbac/components/RoleBasedRouter.tsx +1 -1
  509. package/src/rbac/components/SecureDataProvider.test.tsx +7 -6
  510. package/src/rbac/components/SecureDataProvider.tsx +1 -1
  511. package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +6 -6
  512. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +11 -10
  513. package/src/rbac/components/__tests__/NavigationProvider.test.tsx +10 -11
  514. package/src/rbac/components/__tests__/PagePermissionGuard.race-condition.test.tsx +19 -15
  515. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +13 -12
  516. package/src/rbac/components/__tests__/PagePermissionGuard.verification.test.tsx +19 -15
  517. package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +18 -18
  518. package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +11 -10
  519. package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +8 -7
  520. package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +10 -11
  521. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +48 -19
  522. package/src/rbac/hooks/__tests__/useSecureSupabase.test.ts +476 -0
  523. package/src/rbac/hooks/index.ts +3 -0
  524. package/src/rbac/hooks/usePermissions.ts +31 -85
  525. package/src/rbac/hooks/useRBAC.test.ts +13 -1
  526. package/src/rbac/hooks/useRBAC.ts +13 -67
  527. package/src/rbac/hooks/useResolvedScope.ts +11 -0
  528. package/src/rbac/hooks/useSecureSupabase.ts +308 -0
  529. package/src/rbac/index.ts +3 -0
  530. package/src/rbac/secureClient.ts +53 -6
  531. package/src/rbac/security.ts +37 -1
  532. package/src/{types/rbac-functions.ts → rbac/types/functions.ts} +30 -30
  533. package/src/rbac/types.ts +3 -2
  534. package/src/services/AuthService.ts +33 -25
  535. package/src/services/EventService.ts +56 -44
  536. package/src/services/InactivityService.ts +33 -53
  537. package/src/services/OrganisationService.ts +36 -40
  538. package/src/services/__tests__/AuthService.restoreSession.test.ts +6 -2
  539. package/src/services/__tests__/EventService.test.ts +67 -33
  540. package/src/services/interfaces/IEventService.ts +1 -1
  541. package/src/styles/core.css +2 -2
  542. package/src/styles/index.test.ts +21 -0
  543. package/src/styles/index.ts +1 -5
  544. package/src/types/__tests__/guards.test.ts +1 -1
  545. package/src/types/__tests__/organisation.roles.test.ts +55 -0
  546. package/src/types/__tests__/type-validation.test.ts +0 -1
  547. package/src/types/auth.ts +42 -2
  548. package/src/types/core.ts +251 -0
  549. package/src/types/database.ts +11 -496
  550. package/src/types/event.ts +102 -0
  551. package/src/types/file-reference.ts +6 -4
  552. package/src/types/guards.ts +2 -1
  553. package/src/types/index.ts +48 -14
  554. package/src/types/lodash.debounce.d.ts +15 -0
  555. package/src/types/organisation.ts +14 -10
  556. package/src/types/supabase.ts +15 -17
  557. package/src/utils/__tests__/secureErrors.unit.test.ts +1 -1
  558. package/src/utils/__tests__/validationUtils.unit.test.ts +0 -29
  559. package/src/utils/app/appNameResolver.ts +1 -1
  560. package/src/utils/audit/audit.test.ts +65 -0
  561. package/src/utils/device/deviceFingerprint.test.ts +171 -0
  562. package/src/utils/dynamic/dynamicUtils.ts +3 -2
  563. package/src/utils/file-reference/index.ts +25 -6
  564. package/src/utils/security/secureErrors.ts +1 -1
  565. package/src/utils/validation/__tests__/validationUtils.test.ts +72 -0
  566. package/src/utils/validation/index.ts +6 -12
  567. package/src/utils/validation/validationUtils.ts +0 -13
  568. package/dist/UnifiedAuthProvider-B37ATQHE.js +0 -16
  569. package/dist/auth-DReDSLq9.d.ts +0 -16
  570. package/dist/chunk-3JI76CYK.js +0 -2444
  571. package/dist/chunk-3JI76CYK.js.map +0 -1
  572. package/dist/chunk-56XJ3TU6.js +0 -11
  573. package/dist/chunk-56XJ3TU6.js.map +0 -1
  574. package/dist/chunk-5MT24GKJ.js.map +0 -1
  575. package/dist/chunk-7QCC6MCP.js +0 -288
  576. package/dist/chunk-BESYRHQM.js.map +0 -1
  577. package/dist/chunk-BJPBT3CU.js +0 -21
  578. package/dist/chunk-BJPBT3CU.js.map +0 -1
  579. package/dist/chunk-BVYWGZVV.js.map +0 -1
  580. package/dist/chunk-CX5M4ZAG.js.map +0 -1
  581. package/dist/chunk-D7LCGMVS.js.map +0 -1
  582. package/dist/chunk-EGI6MUL6.js +0 -27
  583. package/dist/chunk-EGI6MUL6.js.map +0 -1
  584. package/dist/chunk-ERISIBYU.js.map +0 -1
  585. package/dist/chunk-HRO5HWN2.js.map +0 -1
  586. package/dist/chunk-HZLDFOE4.js.map +0 -1
  587. package/dist/chunk-JISYG63F.js +0 -70
  588. package/dist/chunk-JISYG63F.js.map +0 -1
  589. package/dist/chunk-LIMSTKYD.js +0 -61
  590. package/dist/chunk-LIMSTKYD.js.map +0 -1
  591. package/dist/chunk-OWAG3GSU.js.map +0 -1
  592. package/dist/chunk-PPMP5J6T.js.map +0 -1
  593. package/dist/chunk-Q5QRDWKI.js.map +0 -1
  594. package/dist/chunk-S5OFRT4M.js.map +0 -1
  595. package/dist/chunk-SBVILCCA.js.map +0 -1
  596. package/dist/chunk-TUMEWN34.js +0 -15
  597. package/dist/chunk-TUMEWN34.js.map +0 -1
  598. package/dist/chunk-XDNLUEXI.js +0 -138
  599. package/dist/chunk-XJ2HZOBU.js.map +0 -1
  600. package/dist/chunk-ZYTYSTO5.js.map +0 -1
  601. package/dist/chunk-ZZ2SS7NI.js +0 -237
  602. package/dist/chunk-ZZ2SS7NI.js.map +0 -1
  603. package/dist/database-C6jy7EOu.d.ts +0 -500
  604. package/dist/organisation-D6qRDtbF.d.ts +0 -93
  605. package/dist/schema-DTDZQe2u.d.ts +0 -28
  606. package/dist/unified-DQ4VcT7H.d.ts +0 -198
  607. package/dist/useInactivityTracker-TO6ZOF35.js +0 -11
  608. package/dist/validation.d.ts +0 -47
  609. package/dist/validation.js +0 -24
  610. package/dist/validation.js.map +0 -1
  611. package/docs/DOCUMENTATION_AUDIT.md +0 -172
  612. package/docs/DOCUMENTATION_STANDARD.md +0 -137
  613. package/docs/api/classes/PublicErrorBoundary.md +0 -132
  614. package/docs/api/interfaces/EventLogoProps.md +0 -152
  615. package/docs/api/interfaces/PublicErrorBoundaryProps.md +0 -94
  616. package/docs/api/interfaces/PublicErrorBoundaryState.md +0 -68
  617. package/docs/api/interfaces/PublicLoadingSpinnerProps.md +0 -86
  618. package/docs/architecture/rpc-function-standards.md +0 -1106
  619. package/docs/getting-started/consuming-app-vite-config.md +0 -239
  620. package/docs/implementation-guides/event-theming-summary.md +0 -226
  621. package/docs/implementation-guides/public-pages-advanced.md +0 -1038
  622. package/docs/migration/v0.4.15-tailwind-scanning.md +0 -278
  623. package/docs/migration/v0.4.16-css-first-approach.md +0 -312
  624. package/docs/migration/v0.4.17-source-path-fix.md +0 -235
  625. package/docs/rbac/RBAC_EVENT_CONTEXT_LOADING.md +0 -222
  626. package/docs/rbac/RBAC_LOGIN_SAFETY_FIX.md +0 -95
  627. package/docs/rbac/RBAC_V0.5.147_FIX.md +0 -117
  628. package/docs/rbac/README-rbac-rls-integration.md +0 -374
  629. package/docs/styles/usage.md +0 -227
  630. package/docs/testing/visual-testing.md +0 -120
  631. package/docs/troubleshooting/DEBUG_NETWORK_ERROR.md +0 -152
  632. package/docs/troubleshooting/FIX_SUPABASE_CORS.md +0 -184
  633. package/docs/troubleshooting/cake-page-permission-guard-issue-summary.md +0 -193
  634. package/docs/troubleshooting/database-view-compatibility.md +0 -125
  635. package/docs/troubleshooting/react-hooks-issue-analysis.md +0 -172
  636. package/docs/troubleshooting/tailwind-content-scanning.md +0 -219
  637. package/examples/RBAC/EventBasedApp.tsx +0 -239
  638. package/examples/RBAC/PermissionExample.tsx +0 -151
  639. package/examples/STRUCTURE.md +0 -125
  640. package/examples/components 2/DataTable/HierarchicalExample.tsx +0 -475
  641. package/examples/components 2/Dialog/BasicHtmlTest.tsx +0 -55
  642. package/examples/components 2/Dialog/DebugHtmlExample.tsx +0 -68
  643. package/examples/components 2/Dialog/HtmlDialogExample.tsx +0 -202
  644. package/examples/components 2/Dialog/SimpleHtmlTest.tsx +0 -61
  645. package/examples/components 2/Dialog/SmartDialogExample.tsx +0 -322
  646. package/examples/components 2/index.ts +0 -11
  647. package/examples/features/index.ts +0 -12
  648. package/examples/features/rbac/CompleteRBACExample.tsx +0 -324
  649. package/examples/features/rbac/index.ts +0 -13
  650. package/examples/public-pages/CorrectPublicPageImplementation.tsx +0 -301
  651. package/examples/public-pages/PublicEventPage.tsx +0 -274
  652. package/examples/public-pages/PublicPageApp.tsx +0 -308
  653. package/examples/public-pages/PublicPageUsageExample.tsx +0 -216
  654. package/examples/public-pages/index.ts +0 -14
  655. package/src/__tests__/TEST_STANDARD.md +0 -1008
  656. package/src/components/Checkbox/__mocks__/Checkbox.tsx +0 -2
  657. package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +0 -421
  658. package/src/components/DataTable/examples/InitialPageSizeExample.tsx +0 -177
  659. package/src/components/DataTable/examples/PerformanceExample.tsx +0 -506
  660. package/src/components/DataTable/examples/__tests__/HierarchicalActionsExample.test.tsx +0 -316
  661. package/src/components/DataTable/examples/__tests__/HierarchicalExample.test.tsx +0 -45
  662. package/src/components/DataTable/examples/__tests__/InitialPageSizeExample.test.tsx +0 -211
  663. package/src/components/DataTable/examples/__tests__/PerformanceExample.test.tsx +0 -126
  664. package/src/components/Dialog/README.md +0 -804
  665. package/src/components/Dialog/examples/BasicHtmlTest.tsx +0 -55
  666. package/src/components/Dialog/examples/DebugHtmlExample.tsx +0 -68
  667. package/src/components/Dialog/examples/ScrollableDialogExample.tsx +0 -290
  668. package/src/components/Dialog/examples/SimpleHtmlTest.tsx +0 -61
  669. package/src/components/Dialog/examples/__tests__/HtmlDialogExample.test.tsx +0 -71
  670. package/src/components/Dialog/examples/__tests__/SimpleHtmlTest.test.tsx +0 -122
  671. package/src/components/Dialog/examples/__tests__/SmartDialogExample.unit.test.tsx +0 -147
  672. package/src/components/Dialog/utils/__tests__/safeHtml.unit.test.ts +0 -611
  673. package/src/components/Dialog/utils/safeHtml.ts +0 -185
  674. package/src/components/EventSelector/types.ts +0 -79
  675. package/src/components/Form/FormErrorSummary.tsx +0 -113
  676. package/src/components/Form/FormField.tsx +0 -249
  677. package/src/components/Form/FormFieldset.tsx +0 -127
  678. package/src/components/Form/FormLiveRegion.tsx +0 -198
  679. package/src/components/Input/__mocks__/Input.tsx +0 -2
  680. package/src/components/NavigationMenu/types.ts +0 -85
  681. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.accessibility.test.tsx +0 -326
  682. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.unit.test.tsx +0 -1078
  683. package/src/components/PasswordReset/PasswordResetForm.test.tsx +0 -597
  684. package/src/components/PasswordReset/PasswordResetForm.tsx +0 -201
  685. package/src/components/PasswordReset/index.ts +0 -2
  686. package/src/components/ProtectedRoute/README.md +0 -164
  687. package/src/components/PublicLayout/EventLogo.tsx +0 -175
  688. package/src/components/PublicLayout/PublicErrorBoundary.tsx +0 -282
  689. package/src/components/PublicLayout/PublicLoadingSpinner.tsx +0 -216
  690. package/src/components/PublicLayout/PublicPageContextChecker.tsx +0 -131
  691. package/src/components/PublicLayout/PublicPageDebugger.tsx +0 -104
  692. package/src/components/PublicLayout/PublicPageDiagnostic.tsx +0 -162
  693. package/src/components/PublicLayout/PublicPageFooter.tsx +0 -124
  694. package/src/components/PublicLayout/PublicPageHeader.tsx +0 -209
  695. package/src/components/PublicLayout/__tests__/PublicErrorBoundary.test.tsx +0 -449
  696. package/src/components/PublicLayout/__tests__/PublicLoadingSpinner.test.tsx +0 -393
  697. package/src/components/PublicLayout/__tests__/PublicPageContextChecker.test.tsx +0 -192
  698. package/src/components/PublicLayout/__tests__/PublicPageFooter.test.tsx +0 -351
  699. package/src/components/PublicLayout/__tests__/PublicPageHeader.test.tsx +0 -402
  700. package/src/components/PublicLayout/__tests__/PublicPageLayout.test.tsx +0 -460
  701. package/src/components/PublicLayout/__tests__/PublicPageProvider.test.tsx +0 -313
  702. package/src/components/Select/hooks.ts +0 -289
  703. package/src/hooks/useCounter.test.ts +0 -131
  704. package/src/hooks/useDebounce.test.ts +0 -375
  705. package/src/providers/AuthProvider.tsx +0 -15
  706. package/src/providers/EventProvider.tsx +0 -16
  707. package/src/providers/InactivityProvider.tsx +0 -15
  708. package/src/providers/OrganisationProvider.context.test.tsx +0 -169
  709. package/src/providers/UnifiedAuthProvider.tsx +0 -15
  710. package/src/types/theme.ts +0 -6
  711. package/src/types/unified.ts +0 -265
  712. package/src/utils/appConfig.ts +0 -47
  713. package/src/utils/appIdResolver.test.ts +0 -499
  714. package/src/utils/appIdResolver.ts +0 -130
  715. package/src/utils/appNameResolver.simple.test.ts +0 -212
  716. package/src/utils/appNameResolver.test.ts +0 -121
  717. package/src/utils/appNameResolver.ts +0 -191
  718. package/src/utils/audit.ts +0 -127
  719. package/src/utils/auth-utils.ts +0 -96
  720. package/src/utils/bundleAnalysis.ts +0 -129
  721. package/src/utils/debugLogger.ts +0 -67
  722. package/src/utils/deviceFingerprint.ts +0 -215
  723. package/src/utils/dynamicUtils.ts +0 -105
  724. package/src/utils/file-reference.test.ts +0 -788
  725. package/src/utils/file-reference.ts +0 -519
  726. package/src/utils/formatDate.test.ts +0 -237
  727. package/src/utils/formatting.ts +0 -170
  728. package/src/utils/lazyLoad.tsx +0 -44
  729. package/src/utils/logger.ts +0 -179
  730. package/src/utils/organisationContext.test.ts +0 -322
  731. package/src/utils/organisationContext.ts +0 -153
  732. package/src/utils/performanceBenchmark.ts +0 -64
  733. package/src/utils/performanceBudgets.ts +0 -110
  734. package/src/utils/permissionTypes.ts +0 -37
  735. package/src/utils/permissionUtils.test.ts +0 -393
  736. package/src/utils/permissionUtils.ts +0 -34
  737. package/src/utils/sanitization.ts +0 -264
  738. package/src/utils/schemaUtils.ts +0 -37
  739. package/src/utils/secureDataAccess.test.ts +0 -711
  740. package/src/utils/secureDataAccess.ts +0 -377
  741. package/src/utils/secureErrors.ts +0 -79
  742. package/src/utils/security.ts +0 -156
  743. package/src/utils/securityMonitor.ts +0 -45
  744. package/src/utils/sessionTracking.ts +0 -126
  745. package/src/utils/validation.ts +0 -111
  746. package/src/utils/validationUtils.ts +0 -120
  747. package/src/validation/index.ts +0 -12
  748. /package/dist/{DataTable-UA6CL4JI.js.map → DataTable-QAB34V6K.js.map} +0 -0
  749. /package/dist/{UnifiedAuthProvider-B37ATQHE.js.map → UnifiedAuthProvider-7F6T4B6K.js.map} +0 -0
  750. /package/dist/{api-45XYYO2A.js.map → api-ROMBCNKU.js.map} +0 -0
  751. /package/dist/{audit-64X3VJXB.js.map → audit-WRS3KJKI.js.map} +0 -0
  752. /package/dist/{chunk-PLDDJCW6.js.map → chunk-7D4SUZUM.js.map} +0 -0
  753. /package/dist/{useInactivityTracker-TO6ZOF35.js.map → chunk-KQCRWDSA.js.map} +0 -0
  754. /package/examples/{components 2/DataTable → DataTable}/InitialPageSizeExample.tsx +0 -0
  755. /package/examples/{features/public-pages → PublicPages}/index.ts +0 -0
  756. /package/examples/{RBAC → rbac}/index.ts +0 -0
@@ -6,7 +6,7 @@
6
6
  import React from 'react';
7
7
  import { render, screen, waitFor } from '@testing-library/react';
8
8
  import { vi, describe, it, expect } from 'vitest';
9
- import { UnifiedAuthProvider, useUnifiedAuth } from '../UnifiedAuthProvider';
9
+ import { UnifiedAuthProvider, useUnifiedAuth } from '../services/UnifiedAuthProvider';
10
10
 
11
11
  // Mock the debug logger
12
12
  vi.mock('../../utils/debugLogger', () => ({
@@ -15,11 +15,35 @@ vi.mock('../../utils/debugLogger', () => ({
15
15
  },
16
16
  }));
17
17
 
18
+ // Create mock user and session
19
+ const mockUser = {
20
+ id: 'test-user-id',
21
+ email: 'test@example.com',
22
+ user_metadata: {},
23
+ app_metadata: {},
24
+ } as any;
25
+
26
+ const mockSession = {
27
+ access_token: 'test-token',
28
+ refresh_token: 'test-refresh-token',
29
+ user: mockUser,
30
+ expires_at: Date.now() + 3600000,
31
+ } as any;
32
+
18
33
  // Create mock Supabase client
19
34
  const createMockSupabaseClient = () => ({
20
35
  auth: {
21
- getSession: vi.fn(),
22
- onAuthStateChange: vi.fn(),
36
+ getSession: vi.fn().mockResolvedValue({
37
+ data: { session: mockSession },
38
+ error: null
39
+ }),
40
+ getUser: vi.fn().mockResolvedValue({
41
+ data: { user: mockUser },
42
+ error: null
43
+ }),
44
+ onAuthStateChange: vi.fn().mockReturnValue({
45
+ data: { subscription: { unsubscribe: vi.fn() } }
46
+ }),
23
47
  signInWithPassword: vi.fn(),
24
48
  signUp: vi.fn(),
25
49
  signOut: vi.fn(),
@@ -47,12 +71,22 @@ const TestComponent = () => {
47
71
  };
48
72
 
49
73
  describe('UnifiedAuthProvider', () => {
50
- const mockSupabaseClient = createMockSupabaseClient();
74
+ let mockSupabaseClient: ReturnType<typeof createMockSupabaseClient>;
75
+ const defaultProps = {
76
+ idleTimeoutMs: 30 * 60 * 1000,
77
+ warnBeforeMs: 60 * 1000,
78
+ onIdleLogout: vi.fn(),
79
+ };
80
+
81
+ beforeEach(() => {
82
+ // Create a fresh mock client for each test
83
+ mockSupabaseClient = createMockSupabaseClient();
84
+ });
51
85
 
52
86
  describe('Rendering', () => {
53
87
  it('renders without crashing', () => {
54
88
  render(
55
- <UnifiedAuthProvider supabaseClient={mockSupabaseClient}>
89
+ <UnifiedAuthProvider supabaseClient={mockSupabaseClient} {...defaultProps}>
56
90
  <TestComponent />
57
91
  </UnifiedAuthProvider>
58
92
  );
@@ -62,7 +96,7 @@ describe('UnifiedAuthProvider', () => {
62
96
 
63
97
  it('renders with custom app name', () => {
64
98
  render(
65
- <UnifiedAuthProvider supabaseClient={mockSupabaseClient} appName="Custom App">
99
+ <UnifiedAuthProvider supabaseClient={mockSupabaseClient} appName="Custom App" {...defaultProps}>
66
100
  <TestComponent />
67
101
  </UnifiedAuthProvider>
68
102
  );
@@ -84,15 +118,15 @@ describe('UnifiedAuthProvider', () => {
84
118
  describe('Context Values', () => {
85
119
  it('provides all required context values', async () => {
86
120
  render(
87
- <UnifiedAuthProvider supabaseClient={mockSupabaseClient}>
121
+ <UnifiedAuthProvider supabaseClient={mockSupabaseClient} appName="Test App" {...defaultProps}>
88
122
  <TestComponent />
89
123
  </UnifiedAuthProvider>
90
124
  );
91
125
 
92
- // Wait for services to initialize
126
+ // Wait for services to initialize and user/session to be loaded
93
127
  await waitFor(() => {
94
- expect(screen.getByTestId('test-component')).toBeInTheDocument();
95
- });
128
+ expect(screen.getByTestId('hasUser')).toHaveTextContent('true');
129
+ }, { timeout: 3000 });
96
130
 
97
131
  expect(screen.getByTestId('hasUser')).toHaveTextContent('true');
98
132
  expect(screen.getByTestId('hasSession')).toHaveTextContent('true');
@@ -148,7 +182,7 @@ describe('UnifiedAuthProvider', () => {
148
182
 
149
183
  it('uses default configuration', () => {
150
184
  render(
151
- <UnifiedAuthProvider supabaseClient={mockSupabaseClient}>
185
+ <UnifiedAuthProvider supabaseClient={mockSupabaseClient} {...defaultProps}>
152
186
  <TestComponent />
153
187
  </UnifiedAuthProvider>
154
188
  );
@@ -158,7 +192,7 @@ describe('UnifiedAuthProvider', () => {
158
192
  });
159
193
 
160
194
  describe('[integration] Provider Composition', () => {
161
- it('composes with child providers without errors', () => {
195
+ it('composes with child providers without errors', async () => {
162
196
  const TestCompositionComponent = () => {
163
197
  const auth = useUnifiedAuth();
164
198
 
@@ -173,16 +207,20 @@ describe('UnifiedAuthProvider', () => {
173
207
  };
174
208
 
175
209
  render(
176
- <UnifiedAuthProvider supabaseClient={mockSupabaseClient}>
210
+ <UnifiedAuthProvider supabaseClient={mockSupabaseClient} appName="Test App" {...defaultProps}>
177
211
  <TestCompositionComponent />
178
212
  </UnifiedAuthProvider>
179
213
  );
180
214
 
181
215
  expect(screen.getByTestId('composition-success')).toHaveTextContent('composed');
182
- expect(screen.getByTestId('has-all-contexts')).toHaveTextContent('yes');
216
+
217
+ // Wait for user and session to be loaded
218
+ await waitFor(() => {
219
+ expect(screen.getByTestId('has-all-contexts')).toHaveTextContent('yes');
220
+ }, { timeout: 3000 });
183
221
  });
184
222
 
185
- it('provides complete unified context', () => {
223
+ it('provides complete unified context', async () => {
186
224
  const TestCompleteContextComponent = () => {
187
225
  const auth = useUnifiedAuth();
188
226
 
@@ -198,11 +236,16 @@ describe('UnifiedAuthProvider', () => {
198
236
  };
199
237
 
200
238
  render(
201
- <UnifiedAuthProvider supabaseClient={mockSupabaseClient}>
239
+ <UnifiedAuthProvider supabaseClient={mockSupabaseClient} appName="Test App" {...defaultProps}>
202
240
  <TestCompleteContextComponent />
203
241
  </UnifiedAuthProvider>
204
242
  );
205
243
 
244
+ // Wait for user and session to be loaded
245
+ await waitFor(() => {
246
+ expect(screen.getByTestId('user-context')).toHaveTextContent('present');
247
+ }, { timeout: 3000 });
248
+
206
249
  expect(screen.getByTestId('user-context')).toHaveTextContent('present');
207
250
  expect(screen.getByTestId('session-context')).toHaveTextContent('present');
208
251
  expect(screen.getByTestId('organisation-context')).toHaveTextContent('missing');
@@ -368,7 +411,7 @@ describe('UnifiedAuthProvider', () => {
368
411
  });
369
412
 
370
413
  describe('[integration] Hook Integration', () => {
371
- it('integrates useUnifiedAuth with all contexts', () => {
414
+ it('integrates useUnifiedAuth with all contexts', async () => {
372
415
  const TestHookIntegrationComponent = () => {
373
416
  const auth = useUnifiedAuth();
374
417
 
@@ -385,11 +428,16 @@ describe('UnifiedAuthProvider', () => {
385
428
  };
386
429
 
387
430
  render(
388
- <UnifiedAuthProvider supabaseClient={mockSupabaseClient}>
431
+ <UnifiedAuthProvider supabaseClient={mockSupabaseClient} appName="Test App" {...defaultProps}>
389
432
  <TestHookIntegrationComponent />
390
433
  </UnifiedAuthProvider>
391
434
  );
392
435
 
436
+ // Wait for user and session to be loaded
437
+ await waitFor(() => {
438
+ expect(screen.getByTestId('hook-access')).toHaveTextContent('full');
439
+ }, { timeout: 3000 });
440
+
393
441
  expect(screen.getByTestId('hook-access')).toHaveTextContent('full');
394
442
  expect(screen.getByTestId('hook-methods')).toHaveTextContent('complete');
395
443
  });
@@ -427,7 +475,7 @@ describe('UnifiedAuthProvider', () => {
427
475
  expect(screen.getByTestId('user-stable')).toHaveTextContent('stable');
428
476
  });
429
477
 
430
- it('handles concurrent hook usage', () => {
478
+ it('handles concurrent hook usage', async () => {
431
479
  const TestConcurrentComponent = () => {
432
480
  const auth = useUnifiedAuth();
433
481
 
@@ -446,13 +494,17 @@ describe('UnifiedAuthProvider', () => {
446
494
  };
447
495
 
448
496
  render(
449
- <UnifiedAuthProvider supabaseClient={mockSupabaseClient}>
497
+ <UnifiedAuthProvider supabaseClient={mockSupabaseClient} appName="Test App" {...defaultProps}>
450
498
  <TestConcurrentComponent />
451
499
  </UnifiedAuthProvider>
452
500
  );
453
501
 
454
502
  expect(screen.getByTestId('concurrent-safe')).toHaveTextContent('safe');
455
- expect(screen.getByTestId('all-reads')).toHaveTextContent('success');
503
+
504
+ // Wait for user and session to be loaded
505
+ await waitFor(() => {
506
+ expect(screen.getByTestId('all-reads')).toHaveTextContent('success');
507
+ }, { timeout: 3000 });
456
508
  });
457
509
  });
458
510
 
@@ -485,7 +537,7 @@ describe('UnifiedAuthProvider', () => {
485
537
  expect(screen.getByTestId('app-name-consistent')).toHaveTextContent('consistent');
486
538
  });
487
539
 
488
- it('configures RBAC features when enabled', () => {
540
+ it('configures RBAC features when enabled', async () => {
489
541
  const TestRBACConfigComponent = () => {
490
542
  const auth = useUnifiedAuth();
491
543
 
@@ -502,12 +554,16 @@ describe('UnifiedAuthProvider', () => {
502
554
  };
503
555
 
504
556
  render(
505
- <UnifiedAuthProvider supabaseClient={mockSupabaseClient} enableRBAC={true}>
557
+ <UnifiedAuthProvider supabaseClient={mockSupabaseClient} appName="Test App" enableRBAC={true} {...defaultProps}>
506
558
  <TestRBACConfigComponent />
507
559
  </UnifiedAuthProvider>
508
560
  );
509
561
 
510
- expect(screen.getByTestId('rbac-enabled')).toHaveTextContent('enabled');
562
+ // Wait for user and session to be loaded
563
+ await waitFor(() => {
564
+ expect(screen.getByTestId('rbac-enabled')).toHaveTextContent('enabled');
565
+ }, { timeout: 3000 });
566
+
511
567
  expect(screen.getByTestId('session-available')).toBeInTheDocument();
512
568
  });
513
569
 
@@ -12,6 +12,3 @@ export * from './services/EventServiceProvider';
12
12
  export * from './services/OrganisationServiceProvider';
13
13
  export * from './services/InactivityServiceProvider';
14
14
  export * from './services/AuthServiceProvider';
15
-
16
- // RBAC Provider - Use @jmruthers/pace-core/rbac instead
17
- // Note: RBAC functionality has been moved to the dedicated RBAC module
@@ -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(