@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,393 @@
1
+ /**
2
+ * @file PublicLoadingSpinner Component Tests
3
+ * @package @jmruthers/pace-core
4
+ * @module Components/PublicLayout/__tests__
5
+ * @since 1.0.0
6
+ */
7
+
8
+ import React from 'react';
9
+ import { render, screen } from '@testing-library/react';
10
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
11
+ import {
12
+ PublicLoadingSpinner,
13
+ PublicLoadingSpinnerFullPage,
14
+ PublicLoadingSkeleton
15
+ } from '../PublicLoadingSpinner';
16
+
17
+ describe('[component] PublicLoadingSpinner', () => {
18
+ describe('Rendering', () => {
19
+ it('renders with default props', () => {
20
+ render(<PublicLoadingSpinner />);
21
+
22
+ expect(screen.getByRole('status')).toBeInTheDocument();
23
+ expect(screen.getByText('Loading...', { selector: 'p' })).toBeInTheDocument();
24
+ expect(screen.getByAltText('PACE Core')).toBeInTheDocument();
25
+ });
26
+
27
+ it('renders with custom message', () => {
28
+ render(<PublicLoadingSpinner message="Custom loading message" />);
29
+
30
+ expect(screen.getByText('Custom loading message', { selector: 'p' })).toBeInTheDocument();
31
+ });
32
+
33
+ it('renders with custom className', () => {
34
+ const { container } = render(
35
+ <PublicLoadingSpinner className="custom-spinner-class" />
36
+ );
37
+
38
+ const spinner = container.querySelector('.flex.flex-col.items-center') as HTMLElement;
39
+ expect(spinner).toHaveClass('custom-spinner-class');
40
+ });
41
+
42
+ it('renders without logo when showLogo is false', () => {
43
+ render(<PublicLoadingSpinner showLogo={false} />);
44
+
45
+ expect(screen.queryByAltText('PACE Core')).not.toBeInTheDocument();
46
+ });
47
+
48
+ it('renders with custom message when customMessage is provided', () => {
49
+ render(
50
+ <PublicLoadingSpinner
51
+ message="Default message"
52
+ customMessage="Custom message"
53
+ />
54
+ );
55
+
56
+ expect(screen.getByText('Custom message', { selector: 'p' })).toBeInTheDocument();
57
+ expect(screen.queryByText('Default message')).not.toBeInTheDocument();
58
+ });
59
+ });
60
+
61
+ describe('Size Variants', () => {
62
+ it('renders with small size', () => {
63
+ const { container } = render(<PublicLoadingSpinner size="sm" />);
64
+
65
+ const spinner = container.querySelector('[role="status"]');
66
+ expect(spinner).toHaveClass('h-4', 'w-4');
67
+ });
68
+
69
+ it('renders with medium size by default', () => {
70
+ const { container } = render(<PublicLoadingSpinner />);
71
+
72
+ const spinner = container.querySelector('[role="status"]');
73
+ expect(spinner).toHaveClass('h-8', 'w-8');
74
+ });
75
+
76
+ it('renders with large size', () => {
77
+ const { container } = render(<PublicLoadingSpinner size="lg" />);
78
+
79
+ const spinner = container.querySelector('[role="status"]');
80
+ expect(spinner).toHaveClass('h-12', 'w-12');
81
+ });
82
+
83
+ it('renders with extra large size', () => {
84
+ const { container } = render(<PublicLoadingSpinner size="xl" />);
85
+
86
+ const spinner = container.querySelector('[role="status"]');
87
+ expect(spinner).toHaveClass('h-16', 'w-16');
88
+ });
89
+ });
90
+
91
+ describe('Centering Behavior', () => {
92
+ it('renders centered by default', () => {
93
+ const { container } = render(<PublicLoadingSpinner />);
94
+
95
+ const outerContainer = container.firstChild as HTMLElement;
96
+ expect(outerContainer).toHaveClass('min-h-screen', 'bg-white', 'flex', 'items-center', 'justify-center');
97
+ });
98
+
99
+ it('renders without centering when centered is false', () => {
100
+ const { container } = render(
101
+ <PublicLoadingSpinner centered={false} />
102
+ );
103
+
104
+ const spinner = container.firstChild as HTMLElement;
105
+ expect(spinner).toHaveClass('flex', 'flex-col', 'items-center');
106
+ expect(spinner).not.toHaveClass('min-h-screen', 'bg-white', 'flex', 'items-center', 'justify-center');
107
+ });
108
+ });
109
+
110
+ describe('Accessibility', () => {
111
+ it('has proper ARIA attributes', () => {
112
+ render(<PublicLoadingSpinner />);
113
+
114
+ const spinner = screen.getByRole('status');
115
+ expect(spinner).toHaveAttribute('aria-label', 'Loading');
116
+ });
117
+
118
+ it('has screen reader only text', () => {
119
+ render(<PublicLoadingSpinner message="Loading data" />);
120
+
121
+ const srText = screen.getByText('Loading data', { selector: '.sr-only' });
122
+ expect(srText).toBeInTheDocument();
123
+ });
124
+
125
+ it('has proper alt text for logo', () => {
126
+ render(<PublicLoadingSpinner />);
127
+
128
+ const logo = screen.getByAltText('PACE Core');
129
+ expect(logo).toBeInTheDocument();
130
+ });
131
+ });
132
+
133
+ describe('Layout Structure', () => {
134
+ it('has proper container structure when centered', () => {
135
+ const { container } = render(<PublicLoadingSpinner />);
136
+
137
+ const outerContainer = container.firstChild as HTMLElement;
138
+ const innerContainer = outerContainer.querySelector('div');
139
+
140
+ expect(outerContainer).toHaveClass('min-h-screen', 'bg-white', 'flex', 'items-center', 'justify-center');
141
+ expect(innerContainer).toHaveClass('max-w-md', 'mx-auto', 'px-4');
142
+ });
143
+
144
+ it('has proper spinner structure', () => {
145
+ const { container } = render(<PublicLoadingSpinner />);
146
+
147
+ const spinner = container.querySelector('[role="status"]');
148
+ expect(spinner).toHaveClass('h-8', 'w-8', 'border-2', 'border-gray-200', 'border-t-blue-600', 'rounded-full', 'animate-spin');
149
+ });
150
+
151
+ it('has proper message structure', () => {
152
+ render(<PublicLoadingSpinner message="Loading data" />);
153
+
154
+ const message = screen.getByText('Loading data', { selector: 'p' });
155
+ expect(message).toHaveClass('mt-4', 'text-sm', 'text-gray-600', 'text-center');
156
+ });
157
+ });
158
+
159
+ describe('Edge Cases', () => {
160
+ it('handles empty message', () => {
161
+ render(<PublicLoadingSpinner message="" />);
162
+
163
+ expect(screen.getByRole('status')).toBeInTheDocument();
164
+ expect(screen.queryByText('Loading...')).not.toBeInTheDocument();
165
+ });
166
+
167
+ it('handles undefined message', () => {
168
+ render(<PublicLoadingSpinner message={undefined as any} />);
169
+
170
+ expect(screen.getByRole('status')).toBeInTheDocument();
171
+ expect(screen.getByText('Loading...', { selector: 'p' })).toBeInTheDocument();
172
+ });
173
+
174
+ it('handles null customMessage', () => {
175
+ render(
176
+ <PublicLoadingSpinner
177
+ message="Default message"
178
+ customMessage={null as any}
179
+ />
180
+ );
181
+
182
+ expect(screen.getByText('Default message', { selector: 'p' })).toBeInTheDocument();
183
+ });
184
+ });
185
+ });
186
+
187
+ describe('[component] PublicLoadingSpinnerFullPage', () => {
188
+ describe('Rendering', () => {
189
+ it('renders with default props', () => {
190
+ render(<PublicLoadingSpinnerFullPage />);
191
+
192
+ expect(screen.getByText('Loading event details...')).toBeInTheDocument();
193
+ expect(screen.getByAltText('PACE Core')).toBeInTheDocument();
194
+ expect(screen.getByRole('status')).toBeInTheDocument();
195
+ });
196
+
197
+ it('renders with custom message', () => {
198
+ render(<PublicLoadingSpinnerFullPage message="Custom loading message" />);
199
+
200
+ expect(screen.getByText('Custom loading message', { selector: 'p' })).toBeInTheDocument();
201
+ });
202
+
203
+ it('renders with event name', () => {
204
+ render(
205
+ <PublicLoadingSpinnerFullPage
206
+ eventName="Test Event"
207
+ message="Loading event details"
208
+ />
209
+ );
210
+
211
+ expect(screen.getByText('Test Event')).toBeInTheDocument();
212
+ expect(screen.getByText('Loading event details')).toBeInTheDocument();
213
+ });
214
+
215
+ it('renders with custom className', () => {
216
+ const { container } = render(
217
+ <PublicLoadingSpinnerFullPage className="custom-full-page-class" />
218
+ );
219
+
220
+ const containerElement = container.firstChild as HTMLElement;
221
+ expect(containerElement).toHaveClass('custom-full-page-class');
222
+ });
223
+ });
224
+
225
+ describe('Layout Structure', () => {
226
+ it('has proper full page structure', () => {
227
+ const { container } = render(<PublicLoadingSpinnerFullPage />);
228
+
229
+ const outerContainer = container.firstChild as HTMLElement;
230
+ const innerContainer = outerContainer.querySelector('div');
231
+
232
+ expect(outerContainer).toHaveClass('min-h-screen', 'bg-white', 'flex', 'items-center', 'justify-center');
233
+ expect(innerContainer).toHaveClass('max-w-md', 'mx-auto', 'text-center', 'px-4');
234
+ });
235
+
236
+ it('has proper logo structure', () => {
237
+ render(<PublicLoadingSpinnerFullPage />);
238
+
239
+ const logo = screen.getByAltText('PACE Core');
240
+ expect(logo).toHaveClass('h-12', 'w-auto', 'mx-auto');
241
+ });
242
+
243
+ it('has proper spinner structure', () => {
244
+ const { container } = render(<PublicLoadingSpinnerFullPage />);
245
+
246
+ const spinner = container.querySelector('[role="status"]');
247
+ expect(spinner).toHaveClass('h-12', 'w-12', 'border-4', 'border-gray-200', 'border-t-blue-600', 'rounded-full', 'animate-spin', 'mx-auto');
248
+ });
249
+
250
+ it('has proper loading dots structure', () => {
251
+ const { container } = render(<PublicLoadingSpinnerFullPage />);
252
+
253
+ const dotsContainer = container.querySelector('.flex.justify-center.space-x-1');
254
+ expect(dotsContainer).toBeInTheDocument();
255
+
256
+ const dots = dotsContainer?.querySelectorAll('div');
257
+ expect(dots).toHaveLength(3);
258
+ });
259
+ });
260
+
261
+ describe('Animation Dots', () => {
262
+ it('renders three animated dots', () => {
263
+ const { container } = render(<PublicLoadingSpinnerFullPage />);
264
+
265
+ const dots = container.querySelectorAll('.animate-bounce');
266
+ expect(dots).toHaveLength(3);
267
+ });
268
+
269
+ it('has proper animation delays', () => {
270
+ const { container } = render(<PublicLoadingSpinnerFullPage />);
271
+
272
+ const dots = container.querySelectorAll('.animate-bounce');
273
+
274
+ expect(dots[0]).toHaveStyle('animation-delay: 0ms');
275
+ expect(dots[1]).toHaveStyle('animation-delay: 150ms');
276
+ expect(dots[2]).toHaveStyle('animation-delay: 300ms');
277
+ });
278
+ });
279
+
280
+ describe('Accessibility', () => {
281
+ it('has proper ARIA attributes', () => {
282
+ render(<PublicLoadingSpinnerFullPage />);
283
+
284
+ const spinner = screen.getByRole('status');
285
+ expect(spinner).toHaveAttribute('aria-label', 'Loading');
286
+ });
287
+
288
+ it('has proper heading structure when event name is provided', () => {
289
+ render(
290
+ <PublicLoadingSpinnerFullPage
291
+ eventName="Test Event"
292
+ />
293
+ );
294
+
295
+ const heading = screen.getByRole('heading', { level: 1 });
296
+ expect(heading).toHaveTextContent('Test Event');
297
+ });
298
+ });
299
+ });
300
+
301
+ describe('[component] PublicLoadingSkeleton', () => {
302
+ describe('Rendering', () => {
303
+ it('renders with default props', () => {
304
+ const { container } = render(<PublicLoadingSkeleton />);
305
+
306
+ const skeleton = container.firstChild as HTMLElement;
307
+ expect(skeleton).toHaveClass('animate-pulse');
308
+
309
+ const lines = skeleton.querySelectorAll('div');
310
+ expect(lines).toHaveLength(3);
311
+ });
312
+
313
+ it('renders with custom number of lines', () => {
314
+ const { container } = render(<PublicLoadingSkeleton lines={5} />);
315
+
316
+ const skeleton = container.firstChild as HTMLElement;
317
+ const lines = skeleton.querySelectorAll('div');
318
+ expect(lines).toHaveLength(5);
319
+ });
320
+
321
+ it('renders with custom className', () => {
322
+ const { container } = render(
323
+ <PublicLoadingSkeleton className="custom-skeleton-class" />
324
+ );
325
+
326
+ const skeleton = container.firstChild as HTMLElement;
327
+ expect(skeleton).toHaveClass('custom-skeleton-class');
328
+ });
329
+ });
330
+
331
+ describe('Line Structure', () => {
332
+ it('renders lines with proper classes', () => {
333
+ const { container } = render(<PublicLoadingSkeleton lines={3} />);
334
+
335
+ const lines = container.querySelectorAll('div:not(.animate-pulse)');
336
+
337
+ lines.forEach((line, index) => {
338
+ expect(line).toHaveClass('h-4', 'bg-gray-200', 'rounded', 'mb-2');
339
+
340
+ if (index === lines.length - 1) {
341
+ expect(line).toHaveClass('w-3/4');
342
+ } else {
343
+ expect(line).toHaveClass('w-full');
344
+ }
345
+ });
346
+ });
347
+
348
+ it('renders last line with different width', () => {
349
+ const { container } = render(<PublicLoadingSkeleton lines={4} />);
350
+
351
+ const lines = container.querySelectorAll('div');
352
+ const lastLine = lines[lines.length - 1];
353
+
354
+ expect(lastLine).toHaveClass('w-3/4');
355
+ expect(lastLine).not.toHaveClass('w-full');
356
+ });
357
+ });
358
+
359
+ describe('Edge Cases', () => {
360
+ it('handles zero lines', () => {
361
+ const { container } = render(<PublicLoadingSkeleton lines={0} />);
362
+
363
+ const skeleton = container.firstChild as HTMLElement;
364
+ const lines = skeleton.querySelectorAll('div');
365
+ expect(lines).toHaveLength(0);
366
+ });
367
+
368
+ it('handles negative lines', () => {
369
+ const { container } = render(<PublicLoadingSkeleton lines={-1} />);
370
+
371
+ const skeleton = container.firstChild as HTMLElement;
372
+ const lines = skeleton.querySelectorAll('div');
373
+ expect(lines).toHaveLength(0);
374
+ });
375
+
376
+ it('handles large number of lines', () => {
377
+ const { container } = render(<PublicLoadingSkeleton lines={100} />);
378
+
379
+ const skeleton = container.firstChild as HTMLElement;
380
+ const lines = skeleton.querySelectorAll('div');
381
+ expect(lines).toHaveLength(100);
382
+ });
383
+ });
384
+
385
+ describe('Animation', () => {
386
+ it('has pulse animation', () => {
387
+ const { container } = render(<PublicLoadingSkeleton />);
388
+
389
+ const skeleton = container.firstChild as HTMLElement;
390
+ expect(skeleton).toHaveClass('animate-pulse');
391
+ });
392
+ });
393
+ });