@jmruthers/pace-core 0.5.68 → 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 (375) hide show
  1. package/dist/{DataTable-4IUY7BXB.js → DataTable-MPBSXUC6.js} +5 -6
  2. package/dist/{PublicLoadingSpinner-DdKXTkCZ.d.ts → PublicLoadingSpinner-BOdyU3u-.d.ts} +1 -1
  3. package/dist/{chunk-PXWEDX7Y.js → chunk-2ARQW6VX.js} +3 -3
  4. package/dist/{chunk-MOJXHWDE.js → chunk-6JILXFEA.js} +335 -5
  5. package/dist/chunk-6JILXFEA.js.map +1 -0
  6. package/dist/{chunk-D7ARGIA3.js → chunk-6RBH67W7.js} +23 -6
  7. package/dist/chunk-6RBH67W7.js.map +1 -0
  8. package/dist/{chunk-ZMS23NS5.js → chunk-FJTAWPAQ.js} +3 -5
  9. package/dist/{chunk-ZMS23NS5.js.map → chunk-FJTAWPAQ.js.map} +1 -1
  10. package/dist/{chunk-OPCWH3A4.js → chunk-NO5QHMDX.js} +7 -6
  11. package/dist/chunk-NO5QHMDX.js.map +1 -0
  12. package/dist/{chunk-ZPK5656W.js → chunk-O3NWNXDY.js} +4 -5
  13. package/dist/chunk-O3NWNXDY.js.map +1 -0
  14. package/dist/{chunk-UYA6U6H7.js → chunk-Q2UP3ZWQ.js} +4 -4
  15. package/dist/{chunk-KRCRNXPD.js → chunk-RVYGJPOD.js} +79 -18
  16. package/dist/chunk-RVYGJPOD.js.map +1 -0
  17. package/dist/{chunk-NN45OBIS.js → chunk-UCMHBF7Y.js} +3 -5
  18. package/dist/{chunk-NN45OBIS.js.map → chunk-UCMHBF7Y.js.map} +1 -1
  19. package/dist/{chunk-ZPG4XPV5.js → chunk-V3QO3LL7.js} +5 -7
  20. package/dist/chunk-V3QO3LL7.js.map +1 -0
  21. package/dist/{chunk-U6GPOF6J.js → chunk-ZXJGZLLO.js} +17 -17
  22. package/dist/{chunk-U6GPOF6J.js.map → chunk-ZXJGZLLO.js.map} +1 -1
  23. package/dist/components.d.ts +1 -1
  24. package/dist/components.js +8 -9
  25. package/dist/components.js.map +1 -1
  26. package/dist/hooks.d.ts +1 -1
  27. package/dist/hooks.js +9 -6
  28. package/dist/hooks.js.map +1 -1
  29. package/dist/index.d.ts +3 -3
  30. package/dist/index.js +16 -16
  31. package/dist/index.js.map +1 -1
  32. package/dist/providers.js +5 -7
  33. package/dist/rbac/index.js +5 -6
  34. package/dist/{usePublicRouteParams-CdoFxnJK.d.ts → usePublicRouteParams-Ua1Vz-HG.d.ts} +35 -1
  35. package/dist/utils.d.ts +4 -1
  36. package/dist/utils.js +3 -3
  37. package/docs/DOCUMENTATION_CHECKLIST.md +281 -0
  38. package/docs/README.md +22 -10
  39. package/docs/api/classes/ColumnFactory.md +1 -1
  40. package/docs/api/classes/ErrorBoundary.md +1 -1
  41. package/docs/api/classes/InvalidScopeError.md +1 -1
  42. package/docs/api/classes/MissingUserContextError.md +1 -1
  43. package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
  44. package/docs/api/classes/PermissionDeniedError.md +1 -1
  45. package/docs/api/classes/PublicErrorBoundary.md +1 -1
  46. package/docs/api/classes/RBACAuditManager.md +1 -1
  47. package/docs/api/classes/RBACCache.md +1 -1
  48. package/docs/api/classes/RBACEngine.md +1 -1
  49. package/docs/api/classes/RBACError.md +1 -1
  50. package/docs/api/classes/RBACNotInitializedError.md +1 -1
  51. package/docs/api/classes/SecureSupabaseClient.md +1 -1
  52. package/docs/api/classes/StorageUtils.md +1 -1
  53. package/docs/api/interfaces/AggregateConfig.md +1 -1
  54. package/docs/api/interfaces/ButtonProps.md +1 -1
  55. package/docs/api/interfaces/CardProps.md +1 -1
  56. package/docs/api/interfaces/ColorPalette.md +1 -1
  57. package/docs/api/interfaces/ColorShade.md +1 -1
  58. package/docs/api/interfaces/DataAccessRecord.md +1 -1
  59. package/docs/api/interfaces/DataTableAction.md +1 -1
  60. package/docs/api/interfaces/DataTableColumn.md +1 -1
  61. package/docs/api/interfaces/DataTableProps.md +1 -1
  62. package/docs/api/interfaces/DataTableToolbarButton.md +1 -1
  63. package/docs/api/interfaces/EmptyStateConfig.md +1 -1
  64. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
  65. package/docs/api/interfaces/EventContextType.md +1 -1
  66. package/docs/api/interfaces/EventLogoProps.md +1 -1
  67. package/docs/api/interfaces/EventProviderProps.md +1 -1
  68. package/docs/api/interfaces/FileSizeLimits.md +1 -1
  69. package/docs/api/interfaces/FileUploadProps.md +1 -1
  70. package/docs/api/interfaces/FooterProps.md +1 -1
  71. package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
  72. package/docs/api/interfaces/InputProps.md +1 -1
  73. package/docs/api/interfaces/LabelProps.md +1 -1
  74. package/docs/api/interfaces/LoginFormProps.md +1 -1
  75. package/docs/api/interfaces/NavigationAccessRecord.md +1 -1
  76. package/docs/api/interfaces/NavigationContextType.md +1 -1
  77. package/docs/api/interfaces/NavigationGuardProps.md +1 -1
  78. package/docs/api/interfaces/NavigationItem.md +1 -1
  79. package/docs/api/interfaces/NavigationMenuProps.md +1 -1
  80. package/docs/api/interfaces/NavigationProviderProps.md +1 -1
  81. package/docs/api/interfaces/Organisation.md +1 -1
  82. package/docs/api/interfaces/OrganisationContextType.md +1 -1
  83. package/docs/api/interfaces/OrganisationMembership.md +1 -1
  84. package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
  85. package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
  86. package/docs/api/interfaces/PaceAppLayoutProps.md +1 -1
  87. package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
  88. package/docs/api/interfaces/PageAccessRecord.md +1 -1
  89. package/docs/api/interfaces/PagePermissionContextType.md +1 -1
  90. package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
  91. package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
  92. package/docs/api/interfaces/PaletteData.md +1 -1
  93. package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
  94. package/docs/api/interfaces/PublicErrorBoundaryProps.md +1 -1
  95. package/docs/api/interfaces/PublicErrorBoundaryState.md +1 -1
  96. package/docs/api/interfaces/PublicLoadingSpinnerProps.md +1 -1
  97. package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
  98. package/docs/api/interfaces/PublicPageHeaderProps.md +2 -2
  99. package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
  100. package/docs/api/interfaces/RBACConfig.md +1 -1
  101. package/docs/api/interfaces/RBACContextType.md +1 -1
  102. package/docs/api/interfaces/RBACLogger.md +1 -1
  103. package/docs/api/interfaces/RBACProviderProps.md +1 -1
  104. package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
  105. package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
  106. package/docs/api/interfaces/RouteAccessRecord.md +1 -1
  107. package/docs/api/interfaces/RouteConfig.md +1 -1
  108. package/docs/api/interfaces/SecureDataContextType.md +1 -1
  109. package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
  110. package/docs/api/interfaces/StorageConfig.md +1 -1
  111. package/docs/api/interfaces/StorageFileInfo.md +1 -1
  112. package/docs/api/interfaces/StorageFileMetadata.md +1 -1
  113. package/docs/api/interfaces/StorageListOptions.md +1 -1
  114. package/docs/api/interfaces/StorageListResult.md +1 -1
  115. package/docs/api/interfaces/StorageUploadOptions.md +1 -1
  116. package/docs/api/interfaces/StorageUploadResult.md +1 -1
  117. package/docs/api/interfaces/StorageUrlOptions.md +1 -1
  118. package/docs/api/interfaces/StyleImport.md +1 -1
  119. package/docs/api/interfaces/SwitchProps.md +1 -1
  120. package/docs/api/interfaces/ToastActionElement.md +1 -1
  121. package/docs/api/interfaces/ToastProps.md +1 -1
  122. package/docs/api/interfaces/UnifiedAuthContextType.md +1 -1
  123. package/docs/api/interfaces/UnifiedAuthProviderProps.md +1 -1
  124. package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
  125. package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
  126. package/docs/api/interfaces/UsePublicEventLogoOptions.md +1 -1
  127. package/docs/api/interfaces/UsePublicEventLogoReturn.md +1 -1
  128. package/docs/api/interfaces/UsePublicEventOptions.md +1 -1
  129. package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
  130. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
  131. package/docs/api/interfaces/UserEventAccess.md +1 -1
  132. package/docs/api/interfaces/UserMenuProps.md +1 -1
  133. package/docs/api/interfaces/UserProfile.md +1 -1
  134. package/docs/api/modules.md +39 -14
  135. package/docs/architecture/services.md +374 -0
  136. package/docs/best-practices/README.md +1 -1
  137. package/docs/best-practices/testing.md +1 -1
  138. package/docs/breaking-changes.md +182 -0
  139. package/docs/common-patterns.md +445 -0
  140. package/docs/core-concepts/authentication.md +26 -11
  141. package/docs/core-concepts/events.md +2 -0
  142. package/docs/core-concepts/organisations.md +2 -0
  143. package/docs/core-concepts/permissions.md +2 -0
  144. package/docs/{INDEX.md → documentation-index.md} +26 -38
  145. package/docs/faq.md +286 -0
  146. package/docs/{FILE_REFERENCE_SYSTEM.md → file-reference-system.md} +1 -1
  147. package/docs/getting-started/installation-guide.md +284 -0
  148. package/docs/getting-started/quick-start.md +8 -1
  149. package/docs/implementation-guides/app-layout.md +3 -1
  150. package/docs/implementation-guides/data-tables.md +2 -0
  151. package/docs/implementation-guides/dynamic-colors.md +47 -2
  152. package/docs/implementation-guides/event-theming-summary.md +220 -0
  153. package/docs/implementation-guides/forms.md +9 -7
  154. package/docs/implementation-guides/navigation.md +2 -0
  155. package/docs/migration/service-architecture.md +351 -0
  156. package/docs/rbac/README-rbac-rls-integration.md +2 -2
  157. package/docs/rbac/README.md +1 -1
  158. package/docs/rbac/examples/rbac-rls-integration-example.md +3 -3
  159. package/docs/rbac/quick-start.md +2 -0
  160. package/docs/rbac/rbac-rls-integration.md +2 -2
  161. package/docs/style-guide.md +136 -1
  162. package/docs/testing/README.md +1 -1
  163. package/docs/troubleshooting/authentication-issues.md +334 -0
  164. package/docs/troubleshooting/common-issues.md +2 -0
  165. package/docs/troubleshooting/styling-issues.md +199 -144
  166. package/docs/usage.md +23 -2
  167. package/package.json +1 -1
  168. package/src/__tests__/{TESTING_GUIDELINES.md → TEST_GUIDE_CURSOR.md} +20 -0
  169. package/src/__tests__/TEST_GUIDE_HUMAN.md +103 -0
  170. package/src/__tests__/fixtures/test-data.ts +90 -0
  171. package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +260 -0
  172. package/src/__tests__/helpers/__tests__/optimized-test-setup.test.ts +224 -0
  173. package/src/__tests__/helpers/__tests__/supabaseMock.test.ts +273 -0
  174. package/src/__tests__/helpers/__tests__/test-providers.test.tsx +98 -0
  175. package/src/__tests__/helpers/__tests__/test-utils.test.tsx +436 -0
  176. package/src/__tests__/helpers/__tests__/timer-utils.test.ts +371 -0
  177. package/src/__tests__/helpers/component-test-utils.tsx +14 -4
  178. package/src/__tests__/helpers/optimized-test-setup.ts +68 -0
  179. package/src/__tests__/helpers/test-providers.tsx +329 -0
  180. package/src/__tests__/helpers/test-utils.tsx +91 -45
  181. package/src/__tests__/helpers/timer-utils.ts +71 -0
  182. package/src/__tests__/hooks/usePermissions.test.ts +1 -5
  183. package/src/__tests__/integration/UserProfile.test.tsx +1 -5
  184. package/src/__tests__/rbac/PagePermissionGuard.test.tsx +42 -12
  185. package/src/__tests__/setup.ts +34 -28
  186. package/src/components/Alert/Alert.test.tsx +1 -5
  187. package/src/components/Avatar/Avatar.test.tsx +1 -5
  188. package/src/components/Button/Button.test.tsx +4 -20
  189. package/src/components/Card/Card.test.tsx +1 -5
  190. package/src/components/Checkbox/Checkbox.test.tsx +1 -5
  191. package/src/components/DataTable/__tests__/DataTable.comprehensive.test.tsx +1 -5
  192. package/src/components/DataTable/__tests__/DataTable.test.tsx +45 -49
  193. package/src/components/DataTable/__tests__/DataTableCore.test.tsx +1 -5
  194. package/src/components/DataTable/__tests__/styles.test.ts +382 -0
  195. package/src/components/DataTable/context/__tests__/DataTableContext.test.tsx +409 -0
  196. package/src/components/DataTable/core/__tests__/ActionManager.test.ts +634 -0
  197. package/src/components/DataTable/core/__tests__/DataManager.test.ts +519 -0
  198. package/src/components/DataTable/core/__tests__/StateManager.test.ts +714 -0
  199. package/src/components/DataTable/hooks/__tests__/useDataTableState.test.ts +592 -0
  200. package/src/components/DataTable/utils/__tests__/exportUtils.test.ts +354 -0
  201. package/src/components/DataTable/utils/__tests__/hierarchicalUtils.test.ts +539 -0
  202. package/src/components/Dialog/examples/__tests__/SmartDialogExample.unit.test.tsx +1 -5
  203. package/src/components/Dialog/utils/__tests__/safeHtml.unit.test.ts +1 -8
  204. package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +34 -38
  205. package/src/components/Footer/Footer.test.tsx +1 -5
  206. package/src/components/Form/Form.test.tsx +22 -35
  207. package/src/components/Header/Header.test.tsx +1 -9
  208. package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +1 -5
  209. package/src/components/Input/Input.test.tsx +2 -10
  210. package/src/components/LoginForm/LoginForm.test.tsx +1 -5
  211. package/src/components/NavigationMenu/NavigationMenu.test.tsx +24 -24
  212. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.accessibility.test.tsx +1 -6
  213. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.integration.test.tsx +6 -16
  214. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.performance.test.tsx +1 -5
  215. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.rbac.test.tsx +1 -5
  216. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +1 -7
  217. package/src/components/PasswordReset/PasswordChangeForm.test.tsx +1 -9
  218. package/src/components/PasswordReset/PasswordResetForm.test.tsx +1 -9
  219. package/src/components/PublicLayout/PublicErrorBoundary.tsx +4 -5
  220. package/src/components/PublicLayout/PublicPageHeader.tsx +13 -9
  221. package/src/components/PublicLayout/__tests__/EventLogo.test.tsx +666 -0
  222. package/src/components/PublicLayout/__tests__/PublicErrorBoundary.test.tsx +457 -0
  223. package/src/components/PublicLayout/__tests__/PublicLoadingSpinner.test.tsx +393 -0
  224. package/src/components/PublicLayout/__tests__/PublicPageFooter.test.tsx +351 -0
  225. package/src/components/PublicLayout/__tests__/PublicPageHeader.test.tsx +374 -0
  226. package/src/components/PublicLayout/__tests__/PublicPageLayout.test.tsx +388 -0
  227. package/src/components/Select/Select.bug-test.tsx +69 -0
  228. package/src/components/Select/Select.refactored.tsx +497 -0
  229. package/src/components/Select/Select.test.tsx +42 -49
  230. package/src/components/Select/Select.tsx +5 -2
  231. package/src/components/Select/hooks.ts +254 -0
  232. package/src/components/Switch/Switch.test.tsx +1 -5
  233. package/src/components/Table/__tests__/Table.test.tsx +775 -0
  234. package/src/components/Toast/Toast.test.tsx +15 -8
  235. package/src/components/Tooltip/Tooltip.test.tsx +1 -5
  236. package/src/components/UserMenu/UserMenu.test.tsx +3 -15
  237. package/src/components/__tests__/FileDisplay.test.tsx +575 -0
  238. package/src/components/__tests__/FileUpload.test.tsx +446 -0
  239. package/src/components/__tests__/SuperAdminGuard.test.tsx +422 -354
  240. package/src/hooks/__tests__/ServiceHooks.test.tsx +613 -0
  241. package/src/hooks/__tests__/hooks.integration.test.tsx +1 -10
  242. package/src/hooks/__tests__/useApiFetch.unit.test.ts +10 -14
  243. package/src/hooks/__tests__/useAppConfig.unit.test.ts +307 -0
  244. package/src/hooks/__tests__/useComponentPerformance.unit.test.tsx +1 -6
  245. package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +1 -5
  246. package/src/hooks/__tests__/useOrganisationPermissions.unit.test.tsx +6 -9
  247. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +321 -0
  248. package/src/hooks/__tests__/usePublicEvent.unit.test.ts +583 -0
  249. package/src/hooks/__tests__/usePublicEventLogo.unit.test.ts +640 -0
  250. package/src/hooks/__tests__/usePublicRouteParams.unit.test.ts +435 -0
  251. package/src/hooks/__tests__/useRBAC.unit.test.ts +10 -10
  252. package/src/hooks/__tests__/useStorage.unit.test.ts +751 -0
  253. package/src/hooks/index.ts +3 -0
  254. package/src/hooks/public/usePublicEvent.ts +30 -9
  255. package/src/hooks/public/usePublicRouteParams.ts +13 -3
  256. package/src/hooks/services/useAuth.ts +50 -0
  257. package/src/hooks/services/useAuthService.ts +30 -0
  258. package/src/hooks/services/useCurrentEvent.ts +36 -0
  259. package/src/hooks/services/useCurrentOrganisation.ts +52 -0
  260. package/src/hooks/services/useEventService.ts +30 -0
  261. package/src/hooks/services/useInactivityService.ts +30 -0
  262. package/src/hooks/services/useOrganisationService.ts +30 -0
  263. package/src/hooks/services/usePermissions.ts +70 -0
  264. package/src/hooks/services/useRBACService.ts +30 -0
  265. package/src/hooks/useCounter.test.ts +1 -5
  266. package/src/hooks/useEventTheme.ts +86 -0
  267. package/src/hooks/useOrganisationPermissions.test.ts +2 -5
  268. package/src/hooks/useOrganisationSecurity.test.ts +1 -5
  269. package/src/hooks/usePermissionCache.test.ts +1 -5
  270. package/src/hooks/usePermissionCheck.ts +150 -0
  271. package/src/hooks/useSecureDataAccess.test.ts +1 -5
  272. package/src/index.ts +1 -0
  273. package/src/providers/OrganisationProvider.test.tsx +1 -5
  274. package/src/providers/OrganisationProvider.tsx +56 -4
  275. package/src/providers/UnifiedAuthProvider.test.tsx +1 -5
  276. package/src/providers/__tests__/AuthProvider.test.tsx +105 -439
  277. package/src/providers/__tests__/AuthProvider.test.tsx.backup +771 -0
  278. package/src/providers/__tests__/EventProvider.test.tsx +211 -110
  279. package/src/providers/__tests__/EventProvider.test.tsx.backup +824 -0
  280. package/src/providers/__tests__/InactivityProvider.test.tsx +1 -5
  281. package/src/providers/__tests__/OrganisationProvider.test.tsx +97 -261
  282. package/src/providers/__tests__/OrganisationProvider.test.tsx.backup +820 -0
  283. package/src/providers/__tests__/ServiceProviders.test.tsx +477 -0
  284. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +72 -504
  285. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx.backup +911 -0
  286. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx.backup2 +166 -0
  287. package/src/providers/services/AuthServiceProvider.tsx +65 -0
  288. package/src/providers/services/EventServiceProvider.tsx +83 -0
  289. package/src/providers/services/InactivityServiceProvider.tsx +83 -0
  290. package/src/providers/services/OrganisationServiceProvider.tsx +77 -0
  291. package/src/providers/services/RBACServiceProvider.tsx +79 -0
  292. package/src/providers/services/UnifiedAuthProvider.tsx +368 -0
  293. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +210 -0
  294. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +269 -0
  295. package/src/rbac/__tests__/adapters.comprehensive.test.tsx +892 -0
  296. package/src/rbac/__tests__/engine.comprehensive.test.ts +954 -0
  297. package/src/rbac/__tests__/integration.authflow.test.tsx +1 -5
  298. package/src/rbac/__tests__/integration.navigation.test.tsx +1 -4
  299. package/src/rbac/__tests__/rbac-core.test.tsx +2 -7
  300. package/src/rbac/__tests__/rbac-functions.test.ts +1 -9
  301. package/src/rbac/__tests__/rbac-integration.test.ts +1 -9
  302. package/src/rbac/api.test.ts +1 -9
  303. package/src/rbac/cache.test.ts +10 -8
  304. package/src/rbac/cli/__tests__/policy-manager.test.ts +339 -0
  305. package/src/rbac/components/EnhancedNavigationMenu.test.tsx +1 -5
  306. package/src/rbac/components/NavigationProvider.test.tsx +1 -5
  307. package/src/rbac/components/PagePermissionProvider.test.tsx +1 -5
  308. package/src/rbac/components/SecureDataProvider.test.tsx +1 -5
  309. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +25 -29
  310. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +27 -30
  311. package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +23 -27
  312. package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +18 -22
  313. package/src/rbac/config.test.ts +1 -5
  314. package/src/rbac/hooks/useCan.test.ts +262 -9
  315. package/src/rbac/hooks/usePermissions.test.ts +246 -6
  316. package/src/rbac/hooks/useRBAC.simple.test.ts +1 -5
  317. package/src/rbac/hooks/useRBAC.test.ts +472 -198
  318. package/src/rbac/providers/__tests__/RBACProvider.test.tsx +1 -9
  319. package/src/services/AuthService.ts +416 -0
  320. package/src/services/EventService.ts +366 -0
  321. package/src/services/InactivityService.ts +388 -0
  322. package/src/services/OrganisationService.ts +592 -0
  323. package/src/services/RBACService.ts +522 -0
  324. package/src/services/__tests__/AuthService.test.ts +356 -0
  325. package/src/services/__tests__/BaseService.test.ts +314 -0
  326. package/src/services/__tests__/EventService.test.ts +489 -0
  327. package/src/services/__tests__/InactivityService.test.ts +403 -0
  328. package/src/services/__tests__/OrganisationService.test.ts +660 -0
  329. package/src/services/__tests__/RBACService.test.ts +492 -0
  330. package/src/services/base/BaseService.ts +87 -0
  331. package/src/services/interfaces/IAuthService.ts +39 -0
  332. package/src/services/interfaces/IEventService.ts +30 -0
  333. package/src/services/interfaces/IInactivityService.ts +31 -0
  334. package/src/services/interfaces/IOrganisationService.ts +41 -0
  335. package/src/services/interfaces/IRBACService.ts +62 -0
  336. package/src/theming/__tests__/runtime.test.ts +540 -0
  337. package/src/types/__tests__/file-reference.test.ts +447 -0
  338. package/src/types/__tests__/organisation.test.ts +1133 -0
  339. package/src/types/__tests__/theme.test.ts +830 -0
  340. package/src/types/__tests__/type-validation.test.ts +527 -0
  341. package/src/utils/__tests__/bundleAnalysis.unit.test.ts +1 -5
  342. package/src/utils/__tests__/debugLogger.test.ts +417 -0
  343. package/src/utils/__tests__/deviceFingerprint.unit.test.ts +1 -6
  344. package/src/utils/__tests__/dynamicUtils.unit.test.ts +1 -5
  345. package/src/utils/__tests__/lazyLoad.unit.test.tsx +35 -35
  346. package/src/utils/__tests__/organisationContext.unit.test.ts +1 -5
  347. package/src/utils/__tests__/performanceBudgets.unit.test.ts +5 -11
  348. package/src/utils/__tests__/secureErrors.unit.test.ts +1 -6
  349. package/src/utils/__tests__/secureStorage.unit.test.ts +1 -5
  350. package/src/utils/__tests__/securityMonitor.unit.test.ts +1 -5
  351. package/src/utils/__tests__/sessionTracking.unit.test.ts +1 -5
  352. package/src/utils/appIdResolver.test.ts +6 -10
  353. package/src/utils/appNameResolver.simple.test.ts +142 -0
  354. package/src/utils/appNameResolver.test.ts +31 -458
  355. package/src/utils/appNameResolver.test.ts.backup +494 -0
  356. package/src/utils/debugLogger.ts +26 -5
  357. package/src/utils/formatDate.test.ts +1 -5
  358. package/src/utils/organisationContext.test.ts +1 -5
  359. package/src/utils/performanceBudgets.ts +3 -4
  360. package/src/utils/secureDataAccess.test.ts +1 -5
  361. package/src/utils/storage/__tests__/helpers.unit.test.ts +1 -5
  362. package/src/validation/__tests__/sqlInjectionProtection.unit.test.ts +1 -5
  363. package/dist/chunk-D7ARGIA3.js.map +0 -1
  364. package/dist/chunk-IPCH4YPT.js +0 -315
  365. package/dist/chunk-IPCH4YPT.js.map +0 -1
  366. package/dist/chunk-KRCRNXPD.js.map +0 -1
  367. package/dist/chunk-MOJXHWDE.js.map +0 -1
  368. package/dist/chunk-OPCWH3A4.js.map +0 -1
  369. package/dist/chunk-ZPG4XPV5.js.map +0 -1
  370. package/dist/chunk-ZPK5656W.js.map +0 -1
  371. package/docs/getting-started/installation.md +0 -269
  372. package/src/__tests__/REBUILD_PLAN.md +0 -223
  373. /package/dist/{DataTable-4IUY7BXB.js.map → DataTable-MPBSXUC6.js.map} +0 -0
  374. /package/dist/{chunk-PXWEDX7Y.js.map → chunk-2ARQW6VX.js.map} +0 -0
  375. /package/dist/{chunk-UYA6U6H7.js.map → chunk-Q2UP3ZWQ.js.map} +0 -0
@@ -0,0 +1,371 @@
1
+ /**
2
+ * @file Timer Utilities Tests
3
+ * @package @jmruthers/pace-core
4
+ * @module TestHelpers/__tests__
5
+ * @since 1.0.0
6
+ */
7
+
8
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
9
+ import {
10
+ fastForwardTime,
11
+ fastForwardToNextTimer,
12
+ runAllTimers,
13
+ mockImmediateTimeout,
14
+ mockImmediateInterval,
15
+ setupFastTimers,
16
+ cleanupTimers
17
+ } from '../timer-utils';
18
+
19
+ describe('[helpers] fastForwardTime', () => {
20
+ beforeEach(() => {
21
+ vi.useFakeTimers();
22
+ });
23
+
24
+ afterEach(() => {
25
+ vi.useRealTimers();
26
+ });
27
+
28
+ it('advances timers by specified milliseconds', () => {
29
+ const callback = vi.fn();
30
+ setTimeout(callback, 1000);
31
+
32
+ expect(callback).not.toHaveBeenCalled();
33
+
34
+ fastForwardTime(1000);
35
+
36
+ expect(callback).toHaveBeenCalledTimes(1);
37
+ });
38
+
39
+ it('advances timers by partial amount', () => {
40
+ const callback = vi.fn();
41
+ setTimeout(callback, 1000);
42
+
43
+ fastForwardTime(500);
44
+
45
+ expect(callback).not.toHaveBeenCalled();
46
+
47
+ fastForwardTime(500);
48
+
49
+ expect(callback).toHaveBeenCalledTimes(1);
50
+ });
51
+
52
+ it('advances multiple timers', () => {
53
+ const callback1 = vi.fn();
54
+ const callback2 = vi.fn();
55
+
56
+ setTimeout(callback1, 500);
57
+ setTimeout(callback2, 1000);
58
+
59
+ fastForwardTime(1000);
60
+
61
+ expect(callback1).toHaveBeenCalledTimes(1);
62
+ expect(callback2).toHaveBeenCalledTimes(1);
63
+ });
64
+ });
65
+
66
+ describe('[helpers] fastForwardToNextTimer', () => {
67
+ beforeEach(() => {
68
+ vi.useFakeTimers();
69
+ });
70
+
71
+ afterEach(() => {
72
+ vi.useRealTimers();
73
+ });
74
+
75
+ it('runs only pending timers', () => {
76
+ const callback1 = vi.fn();
77
+ const callback2 = vi.fn();
78
+
79
+ setTimeout(callback1, 1000);
80
+ setTimeout(callback2, 2000);
81
+
82
+ fastForwardToNextTimer();
83
+
84
+ expect(callback1).toHaveBeenCalledTimes(1);
85
+ expect(callback2).not.toHaveBeenCalled();
86
+ });
87
+
88
+ it('runs next timer when called multiple times', () => {
89
+ const callback1 = vi.fn();
90
+ const callback2 = vi.fn();
91
+
92
+ setTimeout(callback1, 1000);
93
+ setTimeout(callback2, 2000);
94
+
95
+ fastForwardToNextTimer();
96
+ expect(callback1).toHaveBeenCalledTimes(1);
97
+ expect(callback2).not.toHaveBeenCalled();
98
+
99
+ fastForwardToNextTimer();
100
+ expect(callback1).toHaveBeenCalledTimes(1);
101
+ expect(callback2).toHaveBeenCalledTimes(1);
102
+ });
103
+ });
104
+
105
+ describe('[helpers] runAllTimers', () => {
106
+ beforeEach(() => {
107
+ vi.useFakeTimers();
108
+ });
109
+
110
+ afterEach(() => {
111
+ vi.useRealTimers();
112
+ });
113
+
114
+ it('runs all pending timers', () => {
115
+ const callback1 = vi.fn();
116
+ const callback2 = vi.fn();
117
+ const callback3 = vi.fn();
118
+
119
+ setTimeout(callback1, 1000);
120
+ setTimeout(callback2, 2000);
121
+ setTimeout(callback3, 3000);
122
+
123
+ runAllTimers();
124
+
125
+ expect(callback1).toHaveBeenCalledTimes(1);
126
+ expect(callback2).toHaveBeenCalledTimes(1);
127
+ expect(callback3).toHaveBeenCalledTimes(1);
128
+ });
129
+
130
+ it('runs all timers including intervals', () => {
131
+ const callback1 = vi.fn();
132
+ const callback2 = vi.fn();
133
+
134
+ setTimeout(callback1, 1000);
135
+ const intervalId = setInterval(callback2, 500);
136
+
137
+ // Advance time to trigger both
138
+ vi.advanceTimersByTime(1000);
139
+
140
+ expect(callback1).toHaveBeenCalledTimes(1);
141
+ expect(callback2).toHaveBeenCalledTimes(2); // Called twice: once at 0ms and once at 1000ms
142
+
143
+ // Clear interval to prevent infinite loop
144
+ clearInterval(intervalId);
145
+ });
146
+ });
147
+
148
+ describe('[helpers] mockImmediateTimeout', () => {
149
+ it('mocks setTimeout to execute immediately', () => {
150
+ mockImmediateTimeout();
151
+
152
+ const callback = vi.fn();
153
+ const result = setTimeout(callback, 1000);
154
+
155
+ expect(callback).toHaveBeenCalledTimes(1);
156
+ expect(result).toBe(1);
157
+ });
158
+
159
+ it('mocks setTimeout to return timer ID', () => {
160
+ mockImmediateTimeout();
161
+
162
+ const callback = vi.fn();
163
+ const timerId = setTimeout(callback, 1000);
164
+
165
+ expect(typeof timerId).toBe('number');
166
+ expect(timerId).toBe(1);
167
+ });
168
+
169
+ it('mocks setTimeout with different callbacks', () => {
170
+ mockImmediateTimeout();
171
+
172
+ const callback1 = vi.fn();
173
+ const callback2 = vi.fn();
174
+
175
+ setTimeout(callback1, 1000);
176
+ setTimeout(callback2, 2000);
177
+
178
+ expect(callback1).toHaveBeenCalledTimes(1);
179
+ expect(callback2).toHaveBeenCalledTimes(1);
180
+ });
181
+ });
182
+
183
+ describe('[helpers] mockImmediateInterval', () => {
184
+ it('mocks setInterval to execute immediately', () => {
185
+ mockImmediateInterval();
186
+
187
+ const callback = vi.fn();
188
+ const result = setInterval(callback, 1000);
189
+
190
+ expect(callback).toHaveBeenCalledTimes(1);
191
+ expect(result).toBe(1);
192
+ });
193
+
194
+ it('mocks setInterval to return timer ID', () => {
195
+ mockImmediateInterval();
196
+
197
+ const callback = vi.fn();
198
+ const timerId = setInterval(callback, 1000);
199
+
200
+ expect(typeof timerId).toBe('number');
201
+ expect(timerId).toBe(1);
202
+ });
203
+
204
+ it('mocks setInterval with different callbacks', () => {
205
+ mockImmediateInterval();
206
+
207
+ const callback1 = vi.fn();
208
+ const callback2 = vi.fn();
209
+
210
+ setInterval(callback1, 1000);
211
+ setInterval(callback2, 2000);
212
+
213
+ expect(callback1).toHaveBeenCalledTimes(1);
214
+ expect(callback2).toHaveBeenCalledTimes(1);
215
+ });
216
+ });
217
+
218
+ describe('[helpers] setupFastTimers', () => {
219
+ it('sets up fake timers', () => {
220
+ setupFastTimers();
221
+
222
+ expect(vi.isFakeTimers()).toBe(true);
223
+ });
224
+
225
+ it('mocks setTimeout to execute immediately', () => {
226
+ setupFastTimers();
227
+
228
+ const callback = vi.fn();
229
+ setTimeout(callback, 1000);
230
+
231
+ expect(callback).toHaveBeenCalledTimes(1);
232
+ });
233
+
234
+ it('mocks setInterval to execute immediately', () => {
235
+ setupFastTimers();
236
+
237
+ const callback = vi.fn();
238
+ setInterval(callback, 1000);
239
+
240
+ expect(callback).toHaveBeenCalledTimes(1);
241
+ });
242
+
243
+ it('combines fake timers with immediate execution', () => {
244
+ setupFastTimers();
245
+
246
+ const timeoutCallback = vi.fn();
247
+ const intervalCallback = vi.fn();
248
+
249
+ setTimeout(timeoutCallback, 1000);
250
+ setInterval(intervalCallback, 500);
251
+
252
+ expect(timeoutCallback).toHaveBeenCalledTimes(1);
253
+ expect(intervalCallback).toHaveBeenCalledTimes(1);
254
+ });
255
+ });
256
+
257
+ describe('[helpers] cleanupTimers', () => {
258
+ beforeEach(() => {
259
+ vi.useFakeTimers();
260
+ mockImmediateTimeout();
261
+ mockImmediateInterval();
262
+ });
263
+
264
+ it('restores real timers', () => {
265
+ cleanupTimers();
266
+
267
+ expect(vi.isFakeTimers()).toBe(false);
268
+ });
269
+
270
+ it('restores all mocks', () => {
271
+ // Verify that cleanup doesn't throw
272
+ expect(() => cleanupTimers()).not.toThrow();
273
+ expect(vi.isFakeTimers()).toBe(false);
274
+ });
275
+
276
+ it('restores setTimeout to original behavior', () => {
277
+ cleanupTimers();
278
+
279
+ const callback = vi.fn();
280
+ const timerId = setTimeout(callback, 100);
281
+
282
+ expect(callback).not.toHaveBeenCalled();
283
+
284
+ // Clean up timer
285
+ clearTimeout(timerId);
286
+ });
287
+
288
+ it('restores setInterval to original behavior', () => {
289
+ cleanupTimers();
290
+
291
+ const callback = vi.fn();
292
+ const timerId = setInterval(callback, 100);
293
+
294
+ expect(callback).not.toHaveBeenCalled();
295
+
296
+ // Clean up interval
297
+ clearInterval(timerId);
298
+ });
299
+ });
300
+
301
+ describe('[helpers] Integration Tests', () => {
302
+ it('works with setupFastTimers and cleanupTimers', () => {
303
+ // Setup fast timers
304
+ setupFastTimers();
305
+
306
+ const callback = vi.fn();
307
+ setTimeout(callback, 1000);
308
+ expect(callback).toHaveBeenCalledTimes(1);
309
+
310
+ // Cleanup timers
311
+ cleanupTimers();
312
+
313
+ const callback2 = vi.fn();
314
+ setTimeout(callback2, 1000);
315
+ expect(callback2).not.toHaveBeenCalled();
316
+ });
317
+
318
+ it('works with fastForwardTime in fake timer environment', () => {
319
+ vi.useFakeTimers();
320
+
321
+ const callback = vi.fn();
322
+ setTimeout(callback, 1000);
323
+
324
+ fastForwardTime(1000);
325
+
326
+ expect(callback).toHaveBeenCalledTimes(1);
327
+
328
+ vi.useRealTimers();
329
+ });
330
+
331
+ it('works with runAllTimers in fake timer environment', () => {
332
+ vi.useFakeTimers();
333
+
334
+ const callback1 = vi.fn();
335
+ const callback2 = vi.fn();
336
+
337
+ setTimeout(callback1, 1000);
338
+ setTimeout(callback2, 2000);
339
+
340
+ runAllTimers();
341
+
342
+ expect(callback1).toHaveBeenCalledTimes(1);
343
+ expect(callback2).toHaveBeenCalledTimes(1);
344
+
345
+ vi.useRealTimers();
346
+ });
347
+
348
+ it('works with immediate timeout mocking', () => {
349
+ mockImmediateTimeout();
350
+
351
+ const callback = vi.fn();
352
+ const timerId = setTimeout(callback, 1000);
353
+
354
+ expect(callback).toHaveBeenCalledTimes(1);
355
+ expect(timerId).toBe(1);
356
+
357
+ vi.restoreAllMocks();
358
+ });
359
+
360
+ it('works with immediate interval mocking', () => {
361
+ mockImmediateInterval();
362
+
363
+ const callback = vi.fn();
364
+ const timerId = setInterval(callback, 1000);
365
+
366
+ expect(callback).toHaveBeenCalledTimes(1);
367
+ expect(timerId).toBe(1);
368
+
369
+ vi.restoreAllMocks();
370
+ });
371
+ });
@@ -3,7 +3,7 @@
3
3
  * @description Specialized utilities for component testing
4
4
  */
5
5
 
6
- import { render, screen, RenderResult } from '@testing-library/react';
6
+ import { render, screen, RenderResult, cleanup } from '@testing-library/react';
7
7
  import userEvent from '@testing-library/user-event';
8
8
  import { vi } from 'vitest';
9
9
  import { renderWithProviders } from './test-utils';
@@ -13,8 +13,9 @@ export const componentTestPatterns = {
13
13
  // Test component renders without crashing
14
14
  testRenders: (Component: React.ComponentType<any>, props = {}) => {
15
15
  return () => {
16
- renderWithProviders(<Component {...props} />);
17
- expect(screen.getByRole('generic')).toBeInTheDocument();
16
+ cleanup(); // Clean up previous renders
17
+ const { container } = renderWithProviders(<Component {...props} />);
18
+ expect(container.firstChild).toBeInTheDocument();
18
19
  };
19
20
  },
20
21
 
@@ -27,6 +28,7 @@ export const componentTestPatterns = {
27
28
  return testCases.map(({ name, props, expectedBehavior }) => ({
28
29
  name: `handles ${name}`,
29
30
  test: () => {
31
+ cleanup(); // Clean up previous renders
30
32
  renderWithProviders(<Component {...props} />);
31
33
  expectedBehavior();
32
34
  },
@@ -42,6 +44,7 @@ export const componentTestPatterns = {
42
44
  return eventTests.map(({ name, action, expectedBehavior }) => ({
43
45
  name: `handles ${name}`,
44
46
  test: async () => {
47
+ cleanup(); // Clean up previous renders
45
48
  const user = userEvent.setup();
46
49
  renderWithProviders(<Component />);
47
50
 
@@ -55,6 +58,7 @@ export const componentTestPatterns = {
55
58
  // Test accessibility
56
59
  testAccessibility: (Component: React.ComponentType<any>, props = {}) => {
57
60
  return () => {
61
+ cleanup(); // Clean up previous renders
58
62
  renderWithProviders(<Component {...props} />);
59
63
 
60
64
  // Basic accessibility checks
@@ -73,6 +77,7 @@ export const commonScenarios = {
73
77
  {
74
78
  name: 'renders with text',
75
79
  test: () => {
80
+ cleanup(); // Clean up previous renders
76
81
  renderWithProviders(<Component>Click me</Component>);
77
82
  expect(screen.getByRole('button', { name: 'Click me' })).toBeInTheDocument();
78
83
  },
@@ -80,6 +85,7 @@ export const commonScenarios = {
80
85
  {
81
86
  name: 'handles click events',
82
87
  test: async () => {
88
+ cleanup(); // Clean up previous renders
83
89
  const handleClick = vi.fn();
84
90
  const user = userEvent.setup();
85
91
  renderWithProviders(<Component onClick={handleClick}>Click me</Component>);
@@ -91,6 +97,7 @@ export const commonScenarios = {
91
97
  {
92
98
  name: 'can be disabled',
93
99
  test: () => {
100
+ cleanup(); // Clean up previous renders
94
101
  renderWithProviders(<Component disabled>Disabled</Component>);
95
102
  expect(screen.getByRole('button')).toBeDisabled();
96
103
  },
@@ -104,13 +111,16 @@ export const commonScenarios = {
104
111
  {
105
112
  name: 'renders form elements',
106
113
  test: () => {
114
+ cleanup(); // Clean up previous renders
107
115
  renderWithProviders(<Component />);
108
- expect(screen.getByRole('form')).toBeInTheDocument();
116
+ const submitButton = screen.queryByRole('button', { name: /submit/i });
117
+ expect(submitButton).toBeInTheDocument();
109
118
  },
110
119
  },
111
120
  {
112
121
  name: 'handles form submission',
113
122
  test: async () => {
123
+ cleanup(); // Clean up previous renders
114
124
  const handleSubmit = vi.fn();
115
125
  const user = userEvent.setup();
116
126
  renderWithProviders(<Component onSubmit={handleSubmit} />);
@@ -0,0 +1,68 @@
1
+ /**
2
+ * @file Optimized Test Setup
3
+ * @description Performance-optimized test setup utilities
4
+ */
5
+
6
+ import { vi } from 'vitest';
7
+
8
+ /**
9
+ * Create a fast mock that resolves immediately
10
+ */
11
+ export const createFastMock = <T>(value: T) => {
12
+ return vi.fn().mockResolvedValue(value);
13
+ };
14
+
15
+ /**
16
+ * Create a fast mock that rejects immediately
17
+ */
18
+ export const createFastErrorMock = (error: Error) => {
19
+ return vi.fn().mockRejectedValue(error);
20
+ };
21
+
22
+ /**
23
+ * Setup optimized mocks for common patterns
24
+ */
25
+ export const setupOptimizedMocks = () => {
26
+ // Mock fetch to resolve immediately
27
+ global.fetch = vi.fn().mockResolvedValue({
28
+ ok: true,
29
+ json: () => Promise.resolve({}),
30
+ text: () => Promise.resolve(''),
31
+ });
32
+
33
+ // Mock setTimeout to execute immediately
34
+ vi.spyOn(global, 'setTimeout').mockImplementation((callback: Function) => {
35
+ callback();
36
+ return 1 as any;
37
+ });
38
+
39
+ // Mock setInterval to execute immediately
40
+ vi.spyOn(global, 'setInterval').mockImplementation((callback: Function) => {
41
+ callback();
42
+ return 1 as any;
43
+ });
44
+ };
45
+
46
+ /**
47
+ * Cleanup optimized mocks
48
+ */
49
+ export const cleanupOptimizedMocks = () => {
50
+ vi.restoreAllMocks();
51
+ };
52
+
53
+ /**
54
+ * Create a test that runs with optimized setup
55
+ */
56
+ export const createOptimizedTest = (name: string, fn: () => void | Promise<void>) => {
57
+ return {
58
+ name,
59
+ fn: async () => {
60
+ try {
61
+ setupOptimizedMocks();
62
+ await fn();
63
+ } finally {
64
+ cleanupOptimizedMocks();
65
+ }
66
+ }
67
+ };
68
+ };