@jmruthers/pace-core 0.5.67 → 0.5.69

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 (384) hide show
  1. package/README.md +26 -0
  2. package/dist/{DataTable-MFUXNGPR.js → DataTable-MPBSXUC6.js} +5 -6
  3. package/dist/{PublicLoadingSpinner-DdKXTkCZ.d.ts → PublicLoadingSpinner-BOdyU3u-.d.ts} +1 -1
  4. package/dist/{UnifiedAuthProvider-CQNiemcB.d.ts → UnifiedAuthProvider-D02AMXgO.d.ts} +3 -3
  5. package/dist/{chunk-CKNY7HYS.js → chunk-2ARQW6VX.js} +3 -3
  6. package/dist/{chunk-T2MQY57J.js → chunk-6JILXFEA.js} +335 -5
  7. package/dist/chunk-6JILXFEA.js.map +1 -0
  8. package/dist/{chunk-D7ARGIA3.js → chunk-6RBH67W7.js} +23 -6
  9. package/dist/chunk-6RBH67W7.js.map +1 -0
  10. package/dist/{chunk-C7GUF747.js → chunk-FJTAWPAQ.js} +3 -5
  11. package/dist/{chunk-C7GUF747.js.map → chunk-FJTAWPAQ.js.map} +1 -1
  12. package/dist/{chunk-4HQ5BOVZ.js → chunk-NO5QHMDX.js} +7 -6
  13. package/dist/chunk-NO5QHMDX.js.map +1 -0
  14. package/dist/{chunk-ZPK5656W.js → chunk-O3NWNXDY.js} +4 -5
  15. package/dist/chunk-O3NWNXDY.js.map +1 -0
  16. package/dist/{chunk-BTCA3ENN.js → chunk-Q2UP3ZWQ.js} +4 -4
  17. package/dist/{chunk-QVEOQVD4.js → chunk-RVYGJPOD.js} +173 -20
  18. package/dist/chunk-RVYGJPOD.js.map +1 -0
  19. package/dist/{chunk-FVDOEGGG.js → chunk-UCMHBF7Y.js} +3 -5
  20. package/dist/{chunk-FVDOEGGG.js.map → chunk-UCMHBF7Y.js.map} +1 -1
  21. package/dist/{chunk-T6HVDA24.js → chunk-V3QO3LL7.js} +5 -7
  22. package/dist/chunk-V3QO3LL7.js.map +1 -0
  23. package/dist/{chunk-ZB6AEA7I.js → chunk-ZXJGZLLO.js} +17 -17
  24. package/dist/{chunk-ZB6AEA7I.js.map → chunk-ZXJGZLLO.js.map} +1 -1
  25. package/dist/components.d.ts +2 -2
  26. package/dist/components.js +8 -9
  27. package/dist/components.js.map +1 -1
  28. package/dist/hooks.d.ts +1 -1
  29. package/dist/hooks.js +9 -6
  30. package/dist/hooks.js.map +1 -1
  31. package/dist/index.d.ts +4 -4
  32. package/dist/index.js +16 -16
  33. package/dist/index.js.map +1 -1
  34. package/dist/providers.d.ts +1 -1
  35. package/dist/providers.js +5 -7
  36. package/dist/rbac/index.js +5 -6
  37. package/dist/{usePublicRouteParams-CdoFxnJK.d.ts → usePublicRouteParams-Ua1Vz-HG.d.ts} +35 -1
  38. package/dist/utils.d.ts +4 -1
  39. package/dist/utils.js +3 -3
  40. package/docs/DOCUMENTATION_CHECKLIST.md +281 -0
  41. package/docs/README.md +22 -10
  42. package/docs/api/README.md +26 -0
  43. package/docs/api/classes/ColumnFactory.md +1 -1
  44. package/docs/api/classes/ErrorBoundary.md +1 -1
  45. package/docs/api/classes/InvalidScopeError.md +1 -1
  46. package/docs/api/classes/MissingUserContextError.md +1 -1
  47. package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
  48. package/docs/api/classes/PermissionDeniedError.md +1 -1
  49. package/docs/api/classes/PublicErrorBoundary.md +1 -1
  50. package/docs/api/classes/RBACAuditManager.md +1 -1
  51. package/docs/api/classes/RBACCache.md +1 -1
  52. package/docs/api/classes/RBACEngine.md +1 -1
  53. package/docs/api/classes/RBACError.md +1 -1
  54. package/docs/api/classes/RBACNotInitializedError.md +1 -1
  55. package/docs/api/classes/SecureSupabaseClient.md +1 -1
  56. package/docs/api/classes/StorageUtils.md +1 -1
  57. package/docs/api/interfaces/AggregateConfig.md +1 -1
  58. package/docs/api/interfaces/ButtonProps.md +1 -1
  59. package/docs/api/interfaces/CardProps.md +1 -1
  60. package/docs/api/interfaces/ColorPalette.md +1 -1
  61. package/docs/api/interfaces/ColorShade.md +1 -1
  62. package/docs/api/interfaces/DataAccessRecord.md +1 -1
  63. package/docs/api/interfaces/DataTableAction.md +1 -1
  64. package/docs/api/interfaces/DataTableColumn.md +1 -1
  65. package/docs/api/interfaces/DataTableProps.md +1 -1
  66. package/docs/api/interfaces/DataTableToolbarButton.md +1 -1
  67. package/docs/api/interfaces/EmptyStateConfig.md +1 -1
  68. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
  69. package/docs/api/interfaces/EventContextType.md +1 -1
  70. package/docs/api/interfaces/EventLogoProps.md +1 -1
  71. package/docs/api/interfaces/EventProviderProps.md +1 -1
  72. package/docs/api/interfaces/FileSizeLimits.md +1 -1
  73. package/docs/api/interfaces/FileUploadProps.md +1 -1
  74. package/docs/api/interfaces/FooterProps.md +1 -1
  75. package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
  76. package/docs/api/interfaces/InputProps.md +1 -1
  77. package/docs/api/interfaces/LabelProps.md +1 -1
  78. package/docs/api/interfaces/LoginFormProps.md +1 -1
  79. package/docs/api/interfaces/NavigationAccessRecord.md +1 -1
  80. package/docs/api/interfaces/NavigationContextType.md +1 -1
  81. package/docs/api/interfaces/NavigationGuardProps.md +1 -1
  82. package/docs/api/interfaces/NavigationItem.md +1 -1
  83. package/docs/api/interfaces/NavigationMenuProps.md +1 -1
  84. package/docs/api/interfaces/NavigationProviderProps.md +1 -1
  85. package/docs/api/interfaces/Organisation.md +1 -1
  86. package/docs/api/interfaces/OrganisationContextType.md +1 -1
  87. package/docs/api/interfaces/OrganisationMembership.md +1 -1
  88. package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
  89. package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
  90. package/docs/api/interfaces/PaceAppLayoutProps.md +1 -1
  91. package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
  92. package/docs/api/interfaces/PageAccessRecord.md +1 -1
  93. package/docs/api/interfaces/PagePermissionContextType.md +1 -1
  94. package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
  95. package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
  96. package/docs/api/interfaces/PaletteData.md +1 -1
  97. package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
  98. package/docs/api/interfaces/PublicErrorBoundaryProps.md +1 -1
  99. package/docs/api/interfaces/PublicErrorBoundaryState.md +1 -1
  100. package/docs/api/interfaces/PublicLoadingSpinnerProps.md +1 -1
  101. package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
  102. package/docs/api/interfaces/PublicPageHeaderProps.md +2 -2
  103. package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
  104. package/docs/api/interfaces/RBACConfig.md +1 -1
  105. package/docs/api/interfaces/RBACContextType.md +1 -1
  106. package/docs/api/interfaces/RBACLogger.md +1 -1
  107. package/docs/api/interfaces/RBACProviderProps.md +1 -1
  108. package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
  109. package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
  110. package/docs/api/interfaces/RouteAccessRecord.md +1 -1
  111. package/docs/api/interfaces/RouteConfig.md +1 -1
  112. package/docs/api/interfaces/SecureDataContextType.md +1 -1
  113. package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
  114. package/docs/api/interfaces/StorageConfig.md +1 -1
  115. package/docs/api/interfaces/StorageFileInfo.md +1 -1
  116. package/docs/api/interfaces/StorageFileMetadata.md +1 -1
  117. package/docs/api/interfaces/StorageListOptions.md +1 -1
  118. package/docs/api/interfaces/StorageListResult.md +1 -1
  119. package/docs/api/interfaces/StorageUploadOptions.md +1 -1
  120. package/docs/api/interfaces/StorageUploadResult.md +1 -1
  121. package/docs/api/interfaces/StorageUrlOptions.md +1 -1
  122. package/docs/api/interfaces/StyleImport.md +1 -1
  123. package/docs/api/interfaces/SwitchProps.md +1 -1
  124. package/docs/api/interfaces/ToastActionElement.md +1 -1
  125. package/docs/api/interfaces/ToastProps.md +1 -1
  126. package/docs/api/interfaces/UnifiedAuthContextType.md +1 -1
  127. package/docs/api/interfaces/UnifiedAuthProviderProps.md +4 -4
  128. package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
  129. package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
  130. package/docs/api/interfaces/UsePublicEventLogoOptions.md +1 -1
  131. package/docs/api/interfaces/UsePublicEventLogoReturn.md +1 -1
  132. package/docs/api/interfaces/UsePublicEventOptions.md +1 -1
  133. package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
  134. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
  135. package/docs/api/interfaces/UserEventAccess.md +1 -1
  136. package/docs/api/interfaces/UserMenuProps.md +1 -1
  137. package/docs/api/interfaces/UserProfile.md +1 -1
  138. package/docs/api/modules.md +39 -14
  139. package/docs/api-reference/providers.md +16 -7
  140. package/docs/architecture/services.md +374 -0
  141. package/docs/best-practices/README.md +1 -1
  142. package/docs/best-practices/testing.md +1 -1
  143. package/docs/breaking-changes.md +182 -0
  144. package/docs/common-patterns.md +445 -0
  145. package/docs/core-concepts/authentication.md +26 -11
  146. package/docs/core-concepts/events.md +2 -0
  147. package/docs/core-concepts/organisations.md +2 -0
  148. package/docs/core-concepts/permissions.md +2 -0
  149. package/docs/{INDEX.md → documentation-index.md} +26 -38
  150. package/docs/faq.md +286 -0
  151. package/docs/{FILE_REFERENCE_SYSTEM.md → file-reference-system.md} +1 -1
  152. package/docs/getting-started/installation-guide.md +284 -0
  153. package/docs/getting-started/quick-start.md +8 -1
  154. package/docs/implementation-guides/app-layout.md +3 -1
  155. package/docs/implementation-guides/data-tables.md +2 -0
  156. package/docs/implementation-guides/dynamic-colors.md +47 -2
  157. package/docs/implementation-guides/event-theming-summary.md +220 -0
  158. package/docs/implementation-guides/forms.md +9 -7
  159. package/docs/implementation-guides/navigation.md +2 -0
  160. package/docs/migration/service-architecture.md +351 -0
  161. package/docs/migration-guides/unified-auth-provider-mandatory-timeouts.md +226 -0
  162. package/docs/rbac/README-rbac-rls-integration.md +2 -2
  163. package/docs/rbac/README.md +1 -1
  164. package/docs/rbac/examples/rbac-rls-integration-example.md +3 -3
  165. package/docs/rbac/quick-start.md +2 -0
  166. package/docs/rbac/rbac-rls-integration.md +2 -2
  167. package/docs/security/README.md +5 -1
  168. package/docs/style-guide.md +136 -1
  169. package/docs/testing/README.md +1 -1
  170. package/docs/troubleshooting/authentication-issues.md +334 -0
  171. package/docs/troubleshooting/common-issues.md +2 -0
  172. package/docs/troubleshooting/styling-issues.md +199 -144
  173. package/docs/usage.md +23 -2
  174. package/package.json +1 -1
  175. package/src/__tests__/{TESTING_GUIDELINES.md → TEST_GUIDE_CURSOR.md} +20 -0
  176. package/src/__tests__/TEST_GUIDE_HUMAN.md +103 -0
  177. package/src/__tests__/fixtures/test-data.ts +90 -0
  178. package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +260 -0
  179. package/src/__tests__/helpers/__tests__/optimized-test-setup.test.ts +224 -0
  180. package/src/__tests__/helpers/__tests__/supabaseMock.test.ts +273 -0
  181. package/src/__tests__/helpers/__tests__/test-providers.test.tsx +98 -0
  182. package/src/__tests__/helpers/__tests__/test-utils.test.tsx +436 -0
  183. package/src/__tests__/helpers/__tests__/timer-utils.test.ts +371 -0
  184. package/src/__tests__/helpers/component-test-utils.tsx +14 -4
  185. package/src/__tests__/helpers/optimized-test-setup.ts +68 -0
  186. package/src/__tests__/helpers/test-providers.tsx +329 -0
  187. package/src/__tests__/helpers/test-utils.tsx +91 -45
  188. package/src/__tests__/helpers/timer-utils.ts +71 -0
  189. package/src/__tests__/hooks/usePermissions.test.ts +1 -5
  190. package/src/__tests__/integration/UserProfile.test.tsx +1 -5
  191. package/src/__tests__/rbac/PagePermissionGuard.test.tsx +42 -12
  192. package/src/__tests__/setup.ts +34 -28
  193. package/src/components/Alert/Alert.test.tsx +1 -5
  194. package/src/components/Avatar/Avatar.test.tsx +1 -5
  195. package/src/components/Button/Button.test.tsx +4 -20
  196. package/src/components/Card/Card.test.tsx +1 -5
  197. package/src/components/Checkbox/Checkbox.test.tsx +1 -5
  198. package/src/components/DataTable/__tests__/DataTable.comprehensive.test.tsx +1 -5
  199. package/src/components/DataTable/__tests__/DataTable.test.tsx +45 -49
  200. package/src/components/DataTable/__tests__/DataTableCore.test.tsx +1 -5
  201. package/src/components/DataTable/__tests__/styles.test.ts +382 -0
  202. package/src/components/DataTable/context/__tests__/DataTableContext.test.tsx +409 -0
  203. package/src/components/DataTable/core/__tests__/ActionManager.test.ts +634 -0
  204. package/src/components/DataTable/core/__tests__/DataManager.test.ts +519 -0
  205. package/src/components/DataTable/core/__tests__/StateManager.test.ts +714 -0
  206. package/src/components/DataTable/hooks/__tests__/useDataTableState.test.ts +592 -0
  207. package/src/components/DataTable/utils/__tests__/exportUtils.test.ts +354 -0
  208. package/src/components/DataTable/utils/__tests__/hierarchicalUtils.test.ts +539 -0
  209. package/src/components/Dialog/examples/__tests__/SmartDialogExample.unit.test.tsx +1 -5
  210. package/src/components/Dialog/utils/__tests__/safeHtml.unit.test.ts +1 -8
  211. package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +34 -38
  212. package/src/components/Footer/Footer.test.tsx +1 -5
  213. package/src/components/Form/Form.test.tsx +22 -35
  214. package/src/components/Header/Header.test.tsx +1 -9
  215. package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +1 -5
  216. package/src/components/Input/Input.test.tsx +2 -10
  217. package/src/components/LoginForm/LoginForm.test.tsx +1 -5
  218. package/src/components/NavigationMenu/NavigationMenu.test.tsx +24 -24
  219. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.accessibility.test.tsx +1 -6
  220. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.integration.test.tsx +6 -16
  221. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.performance.test.tsx +1 -5
  222. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.rbac.test.tsx +1 -5
  223. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +1 -7
  224. package/src/components/PasswordReset/PasswordChangeForm.test.tsx +1 -9
  225. package/src/components/PasswordReset/PasswordResetForm.test.tsx +1 -9
  226. package/src/components/PublicLayout/PublicErrorBoundary.tsx +4 -5
  227. package/src/components/PublicLayout/PublicPageHeader.tsx +13 -9
  228. package/src/components/PublicLayout/__tests__/EventLogo.test.tsx +666 -0
  229. package/src/components/PublicLayout/__tests__/PublicErrorBoundary.test.tsx +457 -0
  230. package/src/components/PublicLayout/__tests__/PublicLoadingSpinner.test.tsx +393 -0
  231. package/src/components/PublicLayout/__tests__/PublicPageFooter.test.tsx +351 -0
  232. package/src/components/PublicLayout/__tests__/PublicPageHeader.test.tsx +374 -0
  233. package/src/components/PublicLayout/__tests__/PublicPageLayout.test.tsx +388 -0
  234. package/src/components/Select/Select.bug-test.tsx +69 -0
  235. package/src/components/Select/Select.refactored.tsx +497 -0
  236. package/src/components/Select/Select.test.tsx +42 -49
  237. package/src/components/Select/Select.tsx +5 -2
  238. package/src/components/Select/hooks.ts +254 -0
  239. package/src/components/Switch/Switch.test.tsx +1 -5
  240. package/src/components/Table/__tests__/Table.test.tsx +775 -0
  241. package/src/components/Toast/Toast.test.tsx +15 -8
  242. package/src/components/Tooltip/Tooltip.test.tsx +1 -5
  243. package/src/components/UserMenu/UserMenu.test.tsx +3 -15
  244. package/src/components/__tests__/FileDisplay.test.tsx +575 -0
  245. package/src/components/__tests__/FileUpload.test.tsx +446 -0
  246. package/src/components/__tests__/SuperAdminGuard.test.tsx +422 -354
  247. package/src/hooks/__tests__/ServiceHooks.test.tsx +613 -0
  248. package/src/hooks/__tests__/hooks.integration.test.tsx +1 -10
  249. package/src/hooks/__tests__/useApiFetch.unit.test.ts +10 -14
  250. package/src/hooks/__tests__/useAppConfig.unit.test.ts +307 -0
  251. package/src/hooks/__tests__/useComponentPerformance.unit.test.tsx +1 -6
  252. package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +1 -5
  253. package/src/hooks/__tests__/useOrganisationPermissions.unit.test.tsx +6 -9
  254. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +321 -0
  255. package/src/hooks/__tests__/usePublicEvent.unit.test.ts +583 -0
  256. package/src/hooks/__tests__/usePublicEventLogo.unit.test.ts +640 -0
  257. package/src/hooks/__tests__/usePublicRouteParams.unit.test.ts +435 -0
  258. package/src/hooks/__tests__/useRBAC.unit.test.ts +10 -10
  259. package/src/hooks/__tests__/useStorage.unit.test.ts +751 -0
  260. package/src/hooks/index.ts +3 -0
  261. package/src/hooks/public/usePublicEvent.ts +181 -13
  262. package/src/hooks/public/usePublicRouteParams.ts +13 -3
  263. package/src/hooks/services/useAuth.ts +50 -0
  264. package/src/hooks/services/useAuthService.ts +30 -0
  265. package/src/hooks/services/useCurrentEvent.ts +36 -0
  266. package/src/hooks/services/useCurrentOrganisation.ts +52 -0
  267. package/src/hooks/services/useEventService.ts +30 -0
  268. package/src/hooks/services/useInactivityService.ts +30 -0
  269. package/src/hooks/services/useOrganisationService.ts +30 -0
  270. package/src/hooks/services/usePermissions.ts +70 -0
  271. package/src/hooks/services/useRBACService.ts +30 -0
  272. package/src/hooks/useCounter.test.ts +1 -5
  273. package/src/hooks/useEventTheme.ts +86 -0
  274. package/src/hooks/useOrganisationPermissions.test.ts +2 -5
  275. package/src/hooks/useOrganisationSecurity.test.ts +1 -5
  276. package/src/hooks/usePermissionCache.test.ts +1 -5
  277. package/src/hooks/usePermissionCheck.ts +150 -0
  278. package/src/hooks/useSecureDataAccess.test.ts +1 -5
  279. package/src/index.ts +1 -0
  280. package/src/providers/OrganisationProvider.test.tsx +1 -5
  281. package/src/providers/OrganisationProvider.tsx +56 -4
  282. package/src/providers/UnifiedAuthProvider.test.simple.tsx +42 -6
  283. package/src/providers/UnifiedAuthProvider.test.tsx +1 -5
  284. package/src/providers/UnifiedAuthProvider.tsx +4 -4
  285. package/src/providers/__tests__/AuthProvider.test.tsx +105 -439
  286. package/src/providers/__tests__/AuthProvider.test.tsx.backup +771 -0
  287. package/src/providers/__tests__/EventProvider.test.tsx +211 -110
  288. package/src/providers/__tests__/EventProvider.test.tsx.backup +824 -0
  289. package/src/providers/__tests__/InactivityProvider.test.tsx +1 -5
  290. package/src/providers/__tests__/OrganisationProvider.test.tsx +97 -261
  291. package/src/providers/__tests__/OrganisationProvider.test.tsx.backup +820 -0
  292. package/src/providers/__tests__/ServiceProviders.test.tsx +477 -0
  293. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +72 -504
  294. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx.backup +911 -0
  295. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx.backup2 +166 -0
  296. package/src/providers/services/AuthServiceProvider.tsx +65 -0
  297. package/src/providers/services/EventServiceProvider.tsx +83 -0
  298. package/src/providers/services/InactivityServiceProvider.tsx +83 -0
  299. package/src/providers/services/OrganisationServiceProvider.tsx +77 -0
  300. package/src/providers/services/RBACServiceProvider.tsx +79 -0
  301. package/src/providers/services/UnifiedAuthProvider.tsx +368 -0
  302. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +210 -0
  303. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +269 -0
  304. package/src/rbac/__tests__/adapters.comprehensive.test.tsx +892 -0
  305. package/src/rbac/__tests__/engine.comprehensive.test.ts +954 -0
  306. package/src/rbac/__tests__/integration.authflow.test.tsx +1 -5
  307. package/src/rbac/__tests__/integration.navigation.test.tsx +1 -4
  308. package/src/rbac/__tests__/rbac-core.test.tsx +2 -7
  309. package/src/rbac/__tests__/rbac-functions.test.ts +1 -9
  310. package/src/rbac/__tests__/rbac-integration.test.ts +1 -9
  311. package/src/rbac/api.test.ts +1 -9
  312. package/src/rbac/cache.test.ts +10 -8
  313. package/src/rbac/cli/__tests__/policy-manager.test.ts +339 -0
  314. package/src/rbac/components/EnhancedNavigationMenu.test.tsx +1 -5
  315. package/src/rbac/components/NavigationProvider.test.tsx +1 -5
  316. package/src/rbac/components/PagePermissionProvider.test.tsx +1 -5
  317. package/src/rbac/components/SecureDataProvider.test.tsx +1 -5
  318. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +25 -29
  319. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +27 -30
  320. package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +23 -27
  321. package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +18 -22
  322. package/src/rbac/config.test.ts +1 -5
  323. package/src/rbac/hooks/useCan.test.ts +262 -9
  324. package/src/rbac/hooks/usePermissions.test.ts +246 -6
  325. package/src/rbac/hooks/useRBAC.simple.test.ts +1 -5
  326. package/src/rbac/hooks/useRBAC.test.ts +472 -198
  327. package/src/rbac/providers/__tests__/RBACProvider.test.tsx +1 -9
  328. package/src/services/AuthService.ts +416 -0
  329. package/src/services/EventService.ts +366 -0
  330. package/src/services/InactivityService.ts +388 -0
  331. package/src/services/OrganisationService.ts +592 -0
  332. package/src/services/RBACService.ts +522 -0
  333. package/src/services/__tests__/AuthService.test.ts +356 -0
  334. package/src/services/__tests__/BaseService.test.ts +314 -0
  335. package/src/services/__tests__/EventService.test.ts +489 -0
  336. package/src/services/__tests__/InactivityService.test.ts +403 -0
  337. package/src/services/__tests__/OrganisationService.test.ts +660 -0
  338. package/src/services/__tests__/RBACService.test.ts +492 -0
  339. package/src/services/base/BaseService.ts +87 -0
  340. package/src/services/interfaces/IAuthService.ts +39 -0
  341. package/src/services/interfaces/IEventService.ts +30 -0
  342. package/src/services/interfaces/IInactivityService.ts +31 -0
  343. package/src/services/interfaces/IOrganisationService.ts +41 -0
  344. package/src/services/interfaces/IRBACService.ts +62 -0
  345. package/src/theming/__tests__/runtime.test.ts +540 -0
  346. package/src/types/__tests__/file-reference.test.ts +447 -0
  347. package/src/types/__tests__/organisation.test.ts +1133 -0
  348. package/src/types/__tests__/theme.test.ts +830 -0
  349. package/src/types/__tests__/type-validation.test.ts +527 -0
  350. package/src/utils/__tests__/bundleAnalysis.unit.test.ts +1 -5
  351. package/src/utils/__tests__/debugLogger.test.ts +417 -0
  352. package/src/utils/__tests__/deviceFingerprint.unit.test.ts +1 -6
  353. package/src/utils/__tests__/dynamicUtils.unit.test.ts +1 -5
  354. package/src/utils/__tests__/lazyLoad.unit.test.tsx +35 -35
  355. package/src/utils/__tests__/organisationContext.unit.test.ts +1 -5
  356. package/src/utils/__tests__/performanceBudgets.unit.test.ts +5 -11
  357. package/src/utils/__tests__/secureErrors.unit.test.ts +1 -6
  358. package/src/utils/__tests__/secureStorage.unit.test.ts +1 -5
  359. package/src/utils/__tests__/securityMonitor.unit.test.ts +1 -5
  360. package/src/utils/__tests__/sessionTracking.unit.test.ts +1 -5
  361. package/src/utils/appIdResolver.test.ts +6 -10
  362. package/src/utils/appNameResolver.simple.test.ts +142 -0
  363. package/src/utils/appNameResolver.test.ts +31 -458
  364. package/src/utils/appNameResolver.test.ts.backup +494 -0
  365. package/src/utils/debugLogger.ts +26 -5
  366. package/src/utils/formatDate.test.ts +1 -5
  367. package/src/utils/organisationContext.test.ts +1 -5
  368. package/src/utils/performanceBudgets.ts +3 -4
  369. package/src/utils/secureDataAccess.test.ts +1 -5
  370. package/src/utils/storage/__tests__/helpers.unit.test.ts +1 -5
  371. package/src/validation/__tests__/sqlInjectionProtection.unit.test.ts +1 -5
  372. package/dist/chunk-4HQ5BOVZ.js.map +0 -1
  373. package/dist/chunk-D7ARGIA3.js.map +0 -1
  374. package/dist/chunk-QVEOQVD4.js.map +0 -1
  375. package/dist/chunk-T2MQY57J.js.map +0 -1
  376. package/dist/chunk-T6HVDA24.js.map +0 -1
  377. package/dist/chunk-VTJ5HCZB.js +0 -315
  378. package/dist/chunk-VTJ5HCZB.js.map +0 -1
  379. package/dist/chunk-ZPK5656W.js.map +0 -1
  380. package/docs/getting-started/installation.md +0 -269
  381. package/src/__tests__/REBUILD_PLAN.md +0 -223
  382. /package/dist/{DataTable-MFUXNGPR.js.map → DataTable-MPBSXUC6.js.map} +0 -0
  383. /package/dist/{chunk-CKNY7HYS.js.map → chunk-2ARQW6VX.js.map} +0 -0
  384. /package/dist/{chunk-BTCA3ENN.js.map → chunk-Q2UP3ZWQ.js.map} +0 -0
@@ -0,0 +1,477 @@
1
+ /**
2
+ * @file Service Providers Unit Tests
3
+ * @package @jmruthers/pace-core
4
+ * @module Providers/__tests__
5
+ * @since 0.1.0
6
+ *
7
+ * Unit tests for service provider components.
8
+ * Tests React context providers and service instantiation.
9
+ */
10
+
11
+ import { describe, it, expect, beforeEach, vi } from 'vitest';
12
+ import { render, screen } from '@testing-library/react';
13
+ import React from 'react';
14
+ import { AuthServiceProvider, useAuthService } from '../services/AuthServiceProvider';
15
+ import { RBACServiceProvider, useRBACService } from '../services/RBACServiceProvider';
16
+ import { OrganisationServiceProvider, useOrganisationService } from '../services/OrganisationServiceProvider';
17
+ import { EventServiceProvider, useEventService } from '../services/EventServiceProvider';
18
+ import { InactivityServiceProvider, useInactivityService } from '../services/InactivityServiceProvider';
19
+
20
+ // Mock Supabase client
21
+ const createMockSupabaseClient = () => ({
22
+ auth: {
23
+ getSession: vi.fn(),
24
+ getUser: vi.fn(),
25
+ onAuthStateChange: vi.fn(() => ({ data: { subscription: { unsubscribe: vi.fn() } } })),
26
+ signInWithPassword: vi.fn(),
27
+ signUp: vi.fn(),
28
+ signOut: vi.fn(),
29
+ resetPasswordForEmail: vi.fn(),
30
+ updateUser: vi.fn(),
31
+ refreshSession: vi.fn()
32
+ },
33
+ rpc: vi.fn(),
34
+ from: vi.fn()
35
+ });
36
+
37
+ // Mock user and session
38
+ const mockUser = {
39
+ id: 'user-1',
40
+ email: 'test@example.com'
41
+ };
42
+
43
+ const mockSession = {
44
+ access_token: 'token',
45
+ user: mockUser
46
+ };
47
+
48
+ const mockOrganisation = {
49
+ id: 'org-1',
50
+ display_name: 'Test Organisation'
51
+ };
52
+
53
+ // Test components for each service
54
+ const AuthTestComponent = () => {
55
+ const authService = useAuthService();
56
+ return <div data-testid="service">{authService ? 'Service Available' : 'No Service'}</div>;
57
+ };
58
+
59
+ const RBACTestComponent = () => {
60
+ const rbacService = useRBACService();
61
+ return <div data-testid="service">{rbacService ? 'Service Available' : 'No Service'}</div>;
62
+ };
63
+
64
+ const OrganisationTestComponent = () => {
65
+ const organisationService = useOrganisationService();
66
+ return <div data-testid="service">{organisationService ? 'Service Available' : 'No Service'}</div>;
67
+ };
68
+
69
+ const EventTestComponent = () => {
70
+ const eventService = useEventService();
71
+ return <div data-testid="service">{eventService ? 'Service Available' : 'No Service'}</div>;
72
+ };
73
+
74
+ const InactivityTestComponent = () => {
75
+ const inactivityService = useInactivityService();
76
+ return <div data-testid="service">{inactivityService ? 'Service Available' : 'No Service'}</div>;
77
+ };
78
+
79
+ describe('Service Providers', () => {
80
+ let mockSupabase: ReturnType<typeof createMockSupabaseClient>;
81
+
82
+ beforeEach(() => {
83
+ mockSupabase = createMockSupabaseClient();
84
+ vi.clearAllMocks();
85
+ });
86
+
87
+ describe('AuthServiceProvider', () => {
88
+ it('should provide AuthService to children', () => {
89
+ render(
90
+ <AuthServiceProvider supabaseClient={mockSupabase as any}>
91
+ <AuthTestComponent />
92
+ </AuthServiceProvider>
93
+ );
94
+
95
+ expect(screen.getByTestId('service')).toHaveTextContent('Service Available');
96
+ });
97
+
98
+ it('should create new service instance when supabaseClient changes', () => {
99
+ const { rerender } = render(
100
+ <AuthServiceProvider supabaseClient={mockSupabase as any}>
101
+ <AuthTestComponent />
102
+ </AuthServiceProvider>
103
+ );
104
+
105
+ const newMockSupabase = createMockSupabaseClient();
106
+ rerender(
107
+ <AuthServiceProvider supabaseClient={newMockSupabase as any}>
108
+ <AuthTestComponent />
109
+ </AuthServiceProvider>
110
+ );
111
+
112
+ expect(screen.getByTestId('service')).toHaveTextContent('Service Available');
113
+ });
114
+
115
+ it('should cleanup service on unmount', () => {
116
+ const { unmount } = render(
117
+ <AuthServiceProvider supabaseClient={mockSupabase as any}>
118
+ <AuthTestComponent />
119
+ </AuthServiceProvider>
120
+ );
121
+
122
+ unmount();
123
+ // Service should be cleaned up (tested indirectly through cleanup calls)
124
+ });
125
+ });
126
+
127
+ describe('RBACServiceProvider', () => {
128
+ it('should provide RBACService to children', () => {
129
+ render(
130
+ <RBACServiceProvider
131
+ supabaseClient={mockSupabase as any}
132
+ user={mockUser}
133
+ session={mockSession}
134
+ appName="test-app"
135
+ enableRBAC={true}
136
+ >
137
+ <RBACTestComponent />
138
+ </RBACServiceProvider>
139
+ );
140
+
141
+ expect(screen.getByTestId('service')).toHaveTextContent('Service Available');
142
+ });
143
+
144
+ it('should create new service instance when dependencies change', () => {
145
+ const { rerender } = render(
146
+ <RBACServiceProvider
147
+ supabaseClient={mockSupabase as any}
148
+ user={mockUser}
149
+ session={mockSession}
150
+ appName="test-app"
151
+ enableRBAC={true}
152
+ >
153
+ <RBACTestComponent />
154
+ </RBACServiceProvider>
155
+ );
156
+
157
+ const newUser = { ...mockUser, id: 'user-2' };
158
+ rerender(
159
+ <RBACServiceProvider
160
+ supabaseClient={mockSupabase as any}
161
+ user={newUser}
162
+ session={mockSession}
163
+ appName="test-app"
164
+ enableRBAC={true}
165
+ >
166
+ <RBACTestComponent />
167
+ </RBACServiceProvider>
168
+ );
169
+
170
+ expect(screen.getByTestId('service')).toHaveTextContent('Service Available');
171
+ });
172
+
173
+ it('should handle missing user gracefully', () => {
174
+ render(
175
+ <RBACServiceProvider
176
+ supabaseClient={mockSupabase as any}
177
+ user={null}
178
+ session={null}
179
+ appName="test-app"
180
+ enableRBAC={true}
181
+ >
182
+ <RBACTestComponent />
183
+ </RBACServiceProvider>
184
+ );
185
+
186
+ expect(screen.getByTestId('service')).toHaveTextContent('Service Available');
187
+ });
188
+ });
189
+
190
+ describe('OrganisationServiceProvider', () => {
191
+ it('should provide OrganisationService to children', () => {
192
+ render(
193
+ <OrganisationServiceProvider
194
+ supabaseClient={mockSupabase as any}
195
+ user={mockUser}
196
+ session={mockSession}
197
+ >
198
+ <OrganisationTestComponent />
199
+ </OrganisationServiceProvider>
200
+ );
201
+
202
+ expect(screen.getByTestId('service')).toHaveTextContent('Service Available');
203
+ });
204
+
205
+ it('should create new service instance when dependencies change', () => {
206
+ const { rerender } = render(
207
+ <OrganisationServiceProvider
208
+ supabaseClient={mockSupabase as any}
209
+ user={mockUser}
210
+ session={mockSession}
211
+ >
212
+ <OrganisationTestComponent />
213
+ </OrganisationServiceProvider>
214
+ );
215
+
216
+ const newUser = { ...mockUser, id: 'user-2' };
217
+ rerender(
218
+ <OrganisationServiceProvider
219
+ supabaseClient={mockSupabase as any}
220
+ user={newUser}
221
+ session={mockSession}
222
+ >
223
+ <OrganisationTestComponent />
224
+ </OrganisationServiceProvider>
225
+ );
226
+
227
+ expect(screen.getByTestId('service')).toHaveTextContent('Service Available');
228
+ });
229
+
230
+ it('should handle missing user gracefully', () => {
231
+ render(
232
+ <OrganisationServiceProvider
233
+ supabaseClient={mockSupabase as any}
234
+ user={null}
235
+ session={null}
236
+ >
237
+ <OrganisationTestComponent />
238
+ </OrganisationServiceProvider>
239
+ );
240
+
241
+ expect(screen.getByTestId('service')).toHaveTextContent('Service Available');
242
+ });
243
+ });
244
+
245
+ describe('EventServiceProvider', () => {
246
+ it('should provide EventService to children', () => {
247
+ render(
248
+ <EventServiceProvider
249
+ supabaseClient={mockSupabase as any}
250
+ user={mockUser}
251
+ session={mockSession}
252
+ appName="test-app"
253
+ selectedOrganisation={mockOrganisation}
254
+ organisationService={{} as any}
255
+ rbacService={{} as any}
256
+ >
257
+ <EventTestComponent />
258
+ </EventServiceProvider>
259
+ );
260
+
261
+ expect(screen.getByTestId('service')).toHaveTextContent('Service Available');
262
+ });
263
+
264
+ it('should create new service instance when dependencies change', () => {
265
+ const { rerender } = render(
266
+ <EventServiceProvider
267
+ supabaseClient={mockSupabase as any}
268
+ user={mockUser}
269
+ session={mockSession}
270
+ appName="test-app"
271
+ selectedOrganisation={mockOrganisation}
272
+ organisationService={{} as any}
273
+ rbacService={{} as any}
274
+ >
275
+ <EventTestComponent />
276
+ </EventServiceProvider>
277
+ );
278
+
279
+ const newOrganisation = { ...mockOrganisation, id: 'org-2' };
280
+ rerender(
281
+ <EventServiceProvider
282
+ supabaseClient={mockSupabase as any}
283
+ user={mockUser}
284
+ session={mockSession}
285
+ appName="test-app"
286
+ selectedOrganisation={newOrganisation}
287
+ organisationService={{} as any}
288
+ rbacService={{} as any}
289
+ >
290
+ <EventTestComponent />
291
+ </EventServiceProvider>
292
+ );
293
+
294
+ expect(screen.getByTestId('service')).toHaveTextContent('Service Available');
295
+ });
296
+
297
+ it('should handle missing organisation gracefully', () => {
298
+ render(
299
+ <EventServiceProvider
300
+ supabaseClient={mockSupabase as any}
301
+ user={mockUser}
302
+ session={mockSession}
303
+ appName="test-app"
304
+ selectedOrganisation={null}
305
+ organisationService={{} as any}
306
+ rbacService={{} as any}
307
+ >
308
+ <EventTestComponent />
309
+ </EventServiceProvider>
310
+ );
311
+
312
+ expect(screen.getByTestId('service')).toHaveTextContent('Service Available');
313
+ });
314
+ });
315
+
316
+ describe('InactivityServiceProvider', () => {
317
+ it('should provide InactivityService to children', () => {
318
+ render(
319
+ <InactivityServiceProvider
320
+ supabaseClient={mockSupabase as any}
321
+ user={mockUser}
322
+ session={mockSession}
323
+ idleTimeoutMs={300000}
324
+ warnBeforeMs={60000}
325
+ onIdleLogout={() => {}}
326
+ dangerouslyDisableInactivity={false}
327
+ >
328
+ <InactivityTestComponent />
329
+ </InactivityServiceProvider>
330
+ );
331
+
332
+ expect(screen.getByTestId('service')).toHaveTextContent('Service Available');
333
+ });
334
+
335
+ it('should create new service instance when dependencies change', () => {
336
+ const { rerender } = render(
337
+ <InactivityServiceProvider
338
+ supabaseClient={mockSupabase as any}
339
+ user={mockUser}
340
+ session={mockSession}
341
+ idleTimeoutMs={300000}
342
+ warnBeforeMs={60000}
343
+ onIdleLogout={() => {}}
344
+ dangerouslyDisableInactivity={false}
345
+ >
346
+ <InactivityTestComponent />
347
+ </InactivityServiceProvider>
348
+ );
349
+
350
+ rerender(
351
+ <InactivityServiceProvider
352
+ supabaseClient={mockSupabase as any}
353
+ user={mockUser}
354
+ session={mockSession}
355
+ idleTimeoutMs={600000} // Changed timeout
356
+ warnBeforeMs={120000} // Changed warning time
357
+ onIdleLogout={() => {}}
358
+ dangerouslyDisableInactivity={false}
359
+ >
360
+ <InactivityTestComponent />
361
+ </InactivityServiceProvider>
362
+ );
363
+
364
+ expect(screen.getByTestId('service')).toHaveTextContent('Service Available');
365
+ });
366
+
367
+ it('should handle missing user gracefully', () => {
368
+ render(
369
+ <InactivityServiceProvider
370
+ supabaseClient={mockSupabase as any}
371
+ user={null}
372
+ session={null}
373
+ idleTimeoutMs={300000}
374
+ warnBeforeMs={60000}
375
+ onIdleLogout={() => {}}
376
+ dangerouslyDisableInactivity={false}
377
+ >
378
+ <InactivityTestComponent />
379
+ </InactivityServiceProvider>
380
+ );
381
+
382
+ expect(screen.getByTestId('service')).toHaveTextContent('Service Available');
383
+ });
384
+
385
+ it('should handle missing onIdleLogout callback', () => {
386
+ render(
387
+ <InactivityServiceProvider
388
+ supabaseClient={mockSupabase as any}
389
+ user={mockUser}
390
+ session={mockSession}
391
+ idleTimeoutMs={300000}
392
+ warnBeforeMs={60000}
393
+ onIdleLogout={undefined}
394
+ dangerouslyDisableInactivity={false}
395
+ >
396
+ <InactivityTestComponent />
397
+ </InactivityServiceProvider>
398
+ );
399
+
400
+ expect(screen.getByTestId('service')).toHaveTextContent('Service Available');
401
+ });
402
+ });
403
+
404
+ describe('Provider Composition', () => {
405
+ it('should work with multiple providers', () => {
406
+ render(
407
+ <AuthServiceProvider supabaseClient={mockSupabase as any}>
408
+ <RBACServiceProvider
409
+ supabaseClient={mockSupabase as any}
410
+ user={mockUser}
411
+ session={mockSession}
412
+ appName="test-app"
413
+ enableRBAC={true}
414
+ >
415
+ <OrganisationServiceProvider
416
+ supabaseClient={mockSupabase as any}
417
+ user={mockUser}
418
+ session={mockSession}
419
+ >
420
+ <AuthTestComponent />
421
+ </OrganisationServiceProvider>
422
+ </RBACServiceProvider>
423
+ </AuthServiceProvider>
424
+ );
425
+
426
+ expect(screen.getByTestId('service')).toHaveTextContent('Service Available');
427
+ });
428
+
429
+ it('should handle provider unmounting gracefully', () => {
430
+ const { unmount } = render(
431
+ <AuthServiceProvider supabaseClient={mockSupabase as any}>
432
+ <RBACServiceProvider
433
+ supabaseClient={mockSupabase as any}
434
+ user={mockUser}
435
+ session={mockSession}
436
+ appName="test-app"
437
+ enableRBAC={true}
438
+ >
439
+ <AuthTestComponent />
440
+ </RBACServiceProvider>
441
+ </AuthServiceProvider>
442
+ );
443
+
444
+ unmount();
445
+ // Should not throw errors during unmount
446
+ });
447
+ });
448
+
449
+ describe('Error Handling', () => {
450
+ it('should handle service creation errors gracefully', () => {
451
+ // Mock service constructor to throw error
452
+ const errorSupabase = {
453
+ ...mockSupabase,
454
+ auth: {
455
+ ...mockSupabase.auth,
456
+ getSession: vi.fn().mockRejectedValue(new Error('Service creation error'))
457
+ }
458
+ };
459
+
460
+ render(
461
+ <AuthServiceProvider supabaseClient={errorSupabase as any}>
462
+ <AuthTestComponent />
463
+ </AuthServiceProvider>
464
+ );
465
+
466
+ // Should still render without crashing
467
+ expect(screen.getByTestId('service')).toHaveTextContent('Service Available');
468
+ });
469
+
470
+ it('should handle missing context gracefully', () => {
471
+ // This should throw an error because there's no provider
472
+ expect(() => {
473
+ render(<AuthTestComponent />);
474
+ }).toThrow('useAuthService must be used within AuthServiceProvider');
475
+ });
476
+ });
477
+ });