@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,260 @@
1
+ /**
2
+ * @file Component Test Utilities Tests
3
+ * @package @jmruthers/pace-core
4
+ * @module TestHelpers/__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 userEvent from '@testing-library/user-event';
12
+ import {
13
+ componentTestPatterns,
14
+ commonScenarios,
15
+ createTestData
16
+ } from '../component-test-utils';
17
+
18
+ // Mock the renderWithProviders function
19
+ vi.mock('../test-utils', () => ({
20
+ renderWithProviders: vi.fn((ui) => render(ui))
21
+ }));
22
+
23
+ describe('[helpers] componentTestPatterns', () => {
24
+ describe('testRenders', () => {
25
+ it('creates test that renders component without crashing', () => {
26
+ const TestComponent = () => <div data-testid="test-component">Test</div>;
27
+ const testFn = componentTestPatterns.testRenders(TestComponent);
28
+
29
+ expect(typeof testFn).toBe('function');
30
+
31
+ // Execute the test
32
+ expect(() => testFn()).not.toThrow();
33
+ });
34
+
35
+ it('creates test that renders component with props', () => {
36
+ const TestComponent = ({ name }: { name: string }) => <div data-testid="test-component">{name}</div>;
37
+ const testFn = componentTestPatterns.testRenders(TestComponent, { name: 'Test Name' });
38
+
39
+ expect(typeof testFn).toBe('function');
40
+
41
+ // Execute the test
42
+ expect(() => testFn()).not.toThrow();
43
+ });
44
+ });
45
+
46
+ describe('testProps', () => {
47
+ it('creates test cases for prop handling', () => {
48
+ const TestComponent = ({ disabled }: { disabled?: boolean }) => (
49
+ <button disabled={disabled}>Test Button</button>
50
+ );
51
+
52
+ const testCases = [
53
+ {
54
+ name: 'disabled prop',
55
+ props: { disabled: true },
56
+ expectedBehavior: () => {
57
+ expect(screen.getByRole('button')).toBeDisabled();
58
+ }
59
+ },
60
+ {
61
+ name: 'enabled prop',
62
+ props: { disabled: false },
63
+ expectedBehavior: () => {
64
+ expect(screen.getByRole('button')).not.toBeDisabled();
65
+ }
66
+ }
67
+ ];
68
+
69
+ const tests = componentTestPatterns.testProps(TestComponent, testCases);
70
+
71
+ expect(tests).toHaveLength(2);
72
+ expect(tests[0].name).toBe('handles disabled prop');
73
+ expect(tests[1].name).toBe('handles enabled prop');
74
+
75
+ // Execute the first test
76
+ expect(() => tests[0].test()).not.toThrow();
77
+ });
78
+ });
79
+
80
+ describe('testEvents', () => {
81
+ it('creates test cases for event handling', async () => {
82
+ const TestComponent = () => <button>Click me</button>;
83
+
84
+ const eventTests = [
85
+ {
86
+ name: 'click event',
87
+ action: async (element: HTMLElement) => {
88
+ const user = userEvent.setup();
89
+ await user.click(element);
90
+ },
91
+ expectedBehavior: () => {
92
+ expect(screen.getByRole('button')).toBeInTheDocument();
93
+ }
94
+ }
95
+ ];
96
+
97
+ const tests = componentTestPatterns.testEvents(TestComponent, eventTests);
98
+
99
+ expect(tests).toHaveLength(1);
100
+ expect(tests[0].name).toBe('handles click event');
101
+
102
+ // Execute the test
103
+ await expect(tests[0].test()).resolves.not.toThrow();
104
+ });
105
+ });
106
+
107
+ describe('testAccessibility', () => {
108
+ it('creates accessibility test', () => {
109
+ const TestComponent = () => <button>Test Button</button>;
110
+ const testFn = componentTestPatterns.testAccessibility(TestComponent);
111
+
112
+ expect(typeof testFn).toBe('function');
113
+
114
+ // Execute the test
115
+ expect(() => testFn()).not.toThrow();
116
+ });
117
+ });
118
+ });
119
+
120
+ describe('[helpers] commonScenarios', () => {
121
+ describe('button scenarios', () => {
122
+ it('creates button render test', () => {
123
+ const TestButton = ({ children, onClick, disabled }: any) => (
124
+ <button onClick={onClick} disabled={disabled}>
125
+ {children}
126
+ </button>
127
+ );
128
+
129
+ const tests = commonScenarios.button.renders(TestButton);
130
+
131
+ expect(tests).toHaveLength(3);
132
+ expect(tests[0].name).toBe('renders with text');
133
+ expect(tests[1].name).toBe('handles click events');
134
+ expect(tests[2].name).toBe('can be disabled');
135
+ });
136
+
137
+ it('executes button render test', () => {
138
+ const TestButton = ({ children }: any) => <button>{children}</button>;
139
+ const tests = commonScenarios.button.renders(TestButton);
140
+
141
+ expect(() => tests[0].test()).not.toThrow();
142
+ });
143
+
144
+ it('executes button click test', async () => {
145
+ const TestButton = ({ children, onClick }: any) => (
146
+ <button onClick={onClick}>{children}</button>
147
+ );
148
+ const tests = commonScenarios.button.renders(TestButton);
149
+
150
+ await expect(tests[1].test()).resolves.not.toThrow();
151
+ });
152
+
153
+ it('executes button disabled test', () => {
154
+ const TestButton = ({ children, disabled }: any) => (
155
+ <button disabled={disabled}>{children}</button>
156
+ );
157
+ const tests = commonScenarios.button.renders(TestButton);
158
+
159
+ expect(() => tests[2].test()).not.toThrow();
160
+ });
161
+ });
162
+
163
+ describe('form scenarios', () => {
164
+ it('creates form render test', () => {
165
+ const TestForm = ({ onSubmit }: any) => (
166
+ <form onSubmit={onSubmit}>
167
+ <button type="submit">Submit</button>
168
+ </form>
169
+ );
170
+
171
+ const tests = commonScenarios.form.renders(TestForm);
172
+
173
+ expect(tests).toHaveLength(2);
174
+ expect(tests[0].name).toBe('renders form elements');
175
+ expect(tests[1].name).toBe('handles form submission');
176
+ });
177
+
178
+ it('executes form render test', () => {
179
+ const TestForm = () => (
180
+ <form>
181
+ <button type="submit">Submit</button>
182
+ </form>
183
+ );
184
+ const tests = commonScenarios.form.renders(TestForm);
185
+
186
+ expect(() => tests[0].test()).not.toThrow();
187
+ });
188
+
189
+ it('executes form submission test', async () => {
190
+ const TestForm = ({ onSubmit }: any) => (
191
+ <form onSubmit={onSubmit}>
192
+ <button type="submit">Submit</button>
193
+ </form>
194
+ );
195
+ const tests = commonScenarios.form.renders(TestForm);
196
+
197
+ await expect(tests[1].test()).resolves.not.toThrow();
198
+ });
199
+ });
200
+ });
201
+
202
+ describe('[helpers] createTestData', () => {
203
+ describe('button data', () => {
204
+ it('creates button data with defaults', () => {
205
+ const buttonData = createTestData.button();
206
+
207
+ expect(buttonData).toHaveProperty('children', 'Test Button');
208
+ expect(buttonData).toHaveProperty('onClick');
209
+ expect(typeof buttonData.onClick).toBe('function');
210
+ });
211
+
212
+ it('creates button data with overrides', () => {
213
+ const customOnClick = vi.fn();
214
+ const buttonData = createTestData.button({
215
+ children: 'Custom Button',
216
+ onClick: customOnClick
217
+ });
218
+
219
+ expect(buttonData.children).toBe('Custom Button');
220
+ expect(buttonData.onClick).toBe(customOnClick);
221
+ });
222
+ });
223
+
224
+ describe('form data', () => {
225
+ it('creates form data with defaults', () => {
226
+ const formData = createTestData.form();
227
+
228
+ expect(formData).toHaveProperty('onSubmit');
229
+ expect(typeof formData.onSubmit).toBe('function');
230
+ });
231
+
232
+ it('creates form data with overrides', () => {
233
+ const customOnSubmit = vi.fn();
234
+ const formData = createTestData.form({ onSubmit: customOnSubmit });
235
+
236
+ expect(formData.onSubmit).toBe(customOnSubmit);
237
+ });
238
+ });
239
+
240
+ describe('user data', () => {
241
+ it('creates user data with defaults', () => {
242
+ const userData = createTestData.user();
243
+
244
+ expect(userData).toHaveProperty('id', '1');
245
+ expect(userData).toHaveProperty('name', 'Test User');
246
+ expect(userData).toHaveProperty('email', 'test@example.com');
247
+ });
248
+
249
+ it('creates user data with overrides', () => {
250
+ const userData = createTestData.user({
251
+ name: 'Custom User',
252
+ email: 'custom@example.com'
253
+ });
254
+
255
+ expect(userData.name).toBe('Custom User');
256
+ expect(userData.email).toBe('custom@example.com');
257
+ expect(userData.id).toBe('1'); // Should still have default
258
+ });
259
+ });
260
+ });
@@ -0,0 +1,224 @@
1
+ /**
2
+ * @file Optimized Test Setup 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
+ createFastMock,
11
+ createFastErrorMock,
12
+ setupOptimizedMocks,
13
+ cleanupOptimizedMocks,
14
+ createOptimizedTest
15
+ } from '../optimized-test-setup';
16
+
17
+ describe('[helpers] createFastMock', () => {
18
+ it('creates mock that resolves with value', async () => {
19
+ const mockValue = { data: 'test' };
20
+ const mockFn = createFastMock(mockValue);
21
+
22
+ const result = await mockFn();
23
+
24
+ expect(result).toEqual(mockValue);
25
+ expect(mockFn).toHaveBeenCalledTimes(1);
26
+ });
27
+
28
+ it('creates mock that can be called multiple times', async () => {
29
+ const mockValue = { data: 'test' };
30
+ const mockFn = createFastMock(mockValue);
31
+
32
+ const result1 = await mockFn();
33
+ const result2 = await mockFn();
34
+
35
+ expect(result1).toEqual(mockValue);
36
+ expect(result2).toEqual(mockValue);
37
+ expect(mockFn).toHaveBeenCalledTimes(2);
38
+ });
39
+
40
+ it('creates mock with different values', async () => {
41
+ const mockValue1 = { data: 'test1' };
42
+ const mockValue2 = { data: 'test2' };
43
+ const mockFn1 = createFastMock(mockValue1);
44
+ const mockFn2 = createFastMock(mockValue2);
45
+
46
+ const result1 = await mockFn1();
47
+ const result2 = await mockFn2();
48
+
49
+ expect(result1).toEqual(mockValue1);
50
+ expect(result2).toEqual(mockValue2);
51
+ });
52
+ });
53
+
54
+ describe('[helpers] createFastErrorMock', () => {
55
+ it('creates mock that rejects with error', async () => {
56
+ const testError = new Error('Test error');
57
+ const mockFn = createFastErrorMock(testError);
58
+
59
+ await expect(mockFn()).rejects.toThrow('Test error');
60
+ expect(mockFn).toHaveBeenCalledTimes(1);
61
+ });
62
+
63
+ it('creates mock that can be called multiple times', async () => {
64
+ const testError = new Error('Test error');
65
+ const mockFn = createFastErrorMock(testError);
66
+
67
+ await expect(mockFn()).rejects.toThrow('Test error');
68
+ await expect(mockFn()).rejects.toThrow('Test error');
69
+ expect(mockFn).toHaveBeenCalledTimes(2);
70
+ });
71
+
72
+ it('creates mock with different errors', async () => {
73
+ const error1 = new Error('Error 1');
74
+ const error2 = new Error('Error 2');
75
+ const mockFn1 = createFastErrorMock(error1);
76
+ const mockFn2 = createFastErrorMock(error2);
77
+
78
+ await expect(mockFn1()).rejects.toThrow('Error 1');
79
+ await expect(mockFn2()).rejects.toThrow('Error 2');
80
+ });
81
+ });
82
+
83
+ describe('[helpers] setupOptimizedMocks', () => {
84
+ it('sets up fetch mock', () => {
85
+ setupOptimizedMocks();
86
+
87
+ expect(global.fetch).toBeDefined();
88
+ expect(vi.isMockFunction(global.fetch)).toBe(true);
89
+ });
90
+
91
+ it('sets up setTimeout mock', () => {
92
+ setupOptimizedMocks();
93
+
94
+ // Test that setTimeout executes callback immediately
95
+ let called = false;
96
+ global.setTimeout(() => {
97
+ called = true;
98
+ }, 1000);
99
+
100
+ expect(called).toBe(true);
101
+ });
102
+
103
+ it('sets up setInterval mock', () => {
104
+ setupOptimizedMocks();
105
+
106
+ // Test that setInterval executes callback immediately
107
+ let called = false;
108
+ global.setInterval(() => {
109
+ called = true;
110
+ }, 1000);
111
+
112
+ expect(called).toBe(true);
113
+ });
114
+
115
+ it('fetch mock resolves with success response', async () => {
116
+ setupOptimizedMocks();
117
+
118
+ const response = await global.fetch('https://example.com');
119
+
120
+ expect(response.ok).toBe(true);
121
+ expect(await response.json()).toEqual({});
122
+ expect(await response.text()).toBe('');
123
+ });
124
+
125
+ it('setTimeout executes callback immediately', () => {
126
+ setupOptimizedMocks();
127
+
128
+ const callback = vi.fn();
129
+ const result = global.setTimeout(callback, 1000);
130
+
131
+ expect(callback).toHaveBeenCalledTimes(1);
132
+ expect(result).toBe(1);
133
+ });
134
+
135
+ it('setInterval executes callback immediately', () => {
136
+ setupOptimizedMocks();
137
+
138
+ const callback = vi.fn();
139
+ const result = global.setInterval(callback, 1000);
140
+
141
+ expect(callback).toHaveBeenCalledTimes(1);
142
+ expect(result).toBe(1);
143
+ });
144
+ });
145
+
146
+ describe('[helpers] cleanupOptimizedMocks', () => {
147
+ it('restores all mocks', () => {
148
+ // Set up some mocks first
149
+ setupOptimizedMocks();
150
+
151
+ // Verify mocks are set up
152
+ expect(vi.isMockFunction(global.fetch)).toBe(true);
153
+
154
+ // Clean up mocks
155
+ cleanupOptimizedMocks();
156
+
157
+ // Verify mocks are restored (this is hard to test directly, but we can verify the function exists)
158
+ expect(typeof cleanupOptimizedMocks).toBe('function');
159
+ });
160
+ });
161
+
162
+ describe('[helpers] createOptimizedTest', () => {
163
+ it('creates test with name and function', () => {
164
+ const testFn = vi.fn();
165
+ const test = createOptimizedTest('Test Name', testFn);
166
+
167
+ expect(test).toHaveProperty('name', 'Test Name');
168
+ expect(test).toHaveProperty('fn');
169
+ expect(typeof test.fn).toBe('function');
170
+ });
171
+
172
+ it('executes test function with optimized setup', async () => {
173
+ let called = false;
174
+ const testFn = async () => { called = true; };
175
+ const test = createOptimizedTest('Test Name', testFn);
176
+
177
+ await test.fn();
178
+
179
+ expect(called).toBe(true);
180
+ });
181
+
182
+ it('sets up and cleans up mocks around test execution', async () => {
183
+ let called = false;
184
+ const testFn = async () => {
185
+ called = true;
186
+ // Verify that fetch mock is set up
187
+ const fetchResult = await global.fetch('https://test.com');
188
+ expect(fetchResult.ok).toBe(true);
189
+ };
190
+ const test = createOptimizedTest('Test Name', testFn);
191
+
192
+ await test.fn();
193
+
194
+ expect(called).toBe(true);
195
+ });
196
+
197
+ it('handles test function errors gracefully', async () => {
198
+ const testError = new Error('Test error');
199
+ const testFn = async () => { throw testError; };
200
+ const test = createOptimizedTest('Test Name', testFn);
201
+
202
+ await expect(test.fn()).rejects.toThrow('Test error');
203
+ });
204
+
205
+ it('handles synchronous test functions', async () => {
206
+ let called = false;
207
+ const testFn = () => { called = true; return 'sync result'; };
208
+ const test = createOptimizedTest('Test Name', testFn);
209
+
210
+ await test.fn();
211
+
212
+ expect(called).toBe(true);
213
+ });
214
+
215
+ it('handles asynchronous test functions', async () => {
216
+ let called = false;
217
+ const testFn = async () => { called = true; return 'async result'; };
218
+ const test = createOptimizedTest('Test Name', testFn);
219
+
220
+ await test.fn();
221
+
222
+ expect(called).toBe(true);
223
+ });
224
+ });