@jmruthers/pace-core 0.5.67 → 0.5.69

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (384) hide show
  1. package/README.md +26 -0
  2. package/dist/{DataTable-MFUXNGPR.js → DataTable-MPBSXUC6.js} +5 -6
  3. package/dist/{PublicLoadingSpinner-DdKXTkCZ.d.ts → PublicLoadingSpinner-BOdyU3u-.d.ts} +1 -1
  4. package/dist/{UnifiedAuthProvider-CQNiemcB.d.ts → UnifiedAuthProvider-D02AMXgO.d.ts} +3 -3
  5. package/dist/{chunk-CKNY7HYS.js → chunk-2ARQW6VX.js} +3 -3
  6. package/dist/{chunk-T2MQY57J.js → chunk-6JILXFEA.js} +335 -5
  7. package/dist/chunk-6JILXFEA.js.map +1 -0
  8. package/dist/{chunk-D7ARGIA3.js → chunk-6RBH67W7.js} +23 -6
  9. package/dist/chunk-6RBH67W7.js.map +1 -0
  10. package/dist/{chunk-C7GUF747.js → chunk-FJTAWPAQ.js} +3 -5
  11. package/dist/{chunk-C7GUF747.js.map → chunk-FJTAWPAQ.js.map} +1 -1
  12. package/dist/{chunk-4HQ5BOVZ.js → chunk-NO5QHMDX.js} +7 -6
  13. package/dist/chunk-NO5QHMDX.js.map +1 -0
  14. package/dist/{chunk-ZPK5656W.js → chunk-O3NWNXDY.js} +4 -5
  15. package/dist/chunk-O3NWNXDY.js.map +1 -0
  16. package/dist/{chunk-BTCA3ENN.js → chunk-Q2UP3ZWQ.js} +4 -4
  17. package/dist/{chunk-QVEOQVD4.js → chunk-RVYGJPOD.js} +173 -20
  18. package/dist/chunk-RVYGJPOD.js.map +1 -0
  19. package/dist/{chunk-FVDOEGGG.js → chunk-UCMHBF7Y.js} +3 -5
  20. package/dist/{chunk-FVDOEGGG.js.map → chunk-UCMHBF7Y.js.map} +1 -1
  21. package/dist/{chunk-T6HVDA24.js → chunk-V3QO3LL7.js} +5 -7
  22. package/dist/chunk-V3QO3LL7.js.map +1 -0
  23. package/dist/{chunk-ZB6AEA7I.js → chunk-ZXJGZLLO.js} +17 -17
  24. package/dist/{chunk-ZB6AEA7I.js.map → chunk-ZXJGZLLO.js.map} +1 -1
  25. package/dist/components.d.ts +2 -2
  26. package/dist/components.js +8 -9
  27. package/dist/components.js.map +1 -1
  28. package/dist/hooks.d.ts +1 -1
  29. package/dist/hooks.js +9 -6
  30. package/dist/hooks.js.map +1 -1
  31. package/dist/index.d.ts +4 -4
  32. package/dist/index.js +16 -16
  33. package/dist/index.js.map +1 -1
  34. package/dist/providers.d.ts +1 -1
  35. package/dist/providers.js +5 -7
  36. package/dist/rbac/index.js +5 -6
  37. package/dist/{usePublicRouteParams-CdoFxnJK.d.ts → usePublicRouteParams-Ua1Vz-HG.d.ts} +35 -1
  38. package/dist/utils.d.ts +4 -1
  39. package/dist/utils.js +3 -3
  40. package/docs/DOCUMENTATION_CHECKLIST.md +281 -0
  41. package/docs/README.md +22 -10
  42. package/docs/api/README.md +26 -0
  43. package/docs/api/classes/ColumnFactory.md +1 -1
  44. package/docs/api/classes/ErrorBoundary.md +1 -1
  45. package/docs/api/classes/InvalidScopeError.md +1 -1
  46. package/docs/api/classes/MissingUserContextError.md +1 -1
  47. package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
  48. package/docs/api/classes/PermissionDeniedError.md +1 -1
  49. package/docs/api/classes/PublicErrorBoundary.md +1 -1
  50. package/docs/api/classes/RBACAuditManager.md +1 -1
  51. package/docs/api/classes/RBACCache.md +1 -1
  52. package/docs/api/classes/RBACEngine.md +1 -1
  53. package/docs/api/classes/RBACError.md +1 -1
  54. package/docs/api/classes/RBACNotInitializedError.md +1 -1
  55. package/docs/api/classes/SecureSupabaseClient.md +1 -1
  56. package/docs/api/classes/StorageUtils.md +1 -1
  57. package/docs/api/interfaces/AggregateConfig.md +1 -1
  58. package/docs/api/interfaces/ButtonProps.md +1 -1
  59. package/docs/api/interfaces/CardProps.md +1 -1
  60. package/docs/api/interfaces/ColorPalette.md +1 -1
  61. package/docs/api/interfaces/ColorShade.md +1 -1
  62. package/docs/api/interfaces/DataAccessRecord.md +1 -1
  63. package/docs/api/interfaces/DataTableAction.md +1 -1
  64. package/docs/api/interfaces/DataTableColumn.md +1 -1
  65. package/docs/api/interfaces/DataTableProps.md +1 -1
  66. package/docs/api/interfaces/DataTableToolbarButton.md +1 -1
  67. package/docs/api/interfaces/EmptyStateConfig.md +1 -1
  68. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
  69. package/docs/api/interfaces/EventContextType.md +1 -1
  70. package/docs/api/interfaces/EventLogoProps.md +1 -1
  71. package/docs/api/interfaces/EventProviderProps.md +1 -1
  72. package/docs/api/interfaces/FileSizeLimits.md +1 -1
  73. package/docs/api/interfaces/FileUploadProps.md +1 -1
  74. package/docs/api/interfaces/FooterProps.md +1 -1
  75. package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
  76. package/docs/api/interfaces/InputProps.md +1 -1
  77. package/docs/api/interfaces/LabelProps.md +1 -1
  78. package/docs/api/interfaces/LoginFormProps.md +1 -1
  79. package/docs/api/interfaces/NavigationAccessRecord.md +1 -1
  80. package/docs/api/interfaces/NavigationContextType.md +1 -1
  81. package/docs/api/interfaces/NavigationGuardProps.md +1 -1
  82. package/docs/api/interfaces/NavigationItem.md +1 -1
  83. package/docs/api/interfaces/NavigationMenuProps.md +1 -1
  84. package/docs/api/interfaces/NavigationProviderProps.md +1 -1
  85. package/docs/api/interfaces/Organisation.md +1 -1
  86. package/docs/api/interfaces/OrganisationContextType.md +1 -1
  87. package/docs/api/interfaces/OrganisationMembership.md +1 -1
  88. package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
  89. package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
  90. package/docs/api/interfaces/PaceAppLayoutProps.md +1 -1
  91. package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
  92. package/docs/api/interfaces/PageAccessRecord.md +1 -1
  93. package/docs/api/interfaces/PagePermissionContextType.md +1 -1
  94. package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
  95. package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
  96. package/docs/api/interfaces/PaletteData.md +1 -1
  97. package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
  98. package/docs/api/interfaces/PublicErrorBoundaryProps.md +1 -1
  99. package/docs/api/interfaces/PublicErrorBoundaryState.md +1 -1
  100. package/docs/api/interfaces/PublicLoadingSpinnerProps.md +1 -1
  101. package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
  102. package/docs/api/interfaces/PublicPageHeaderProps.md +2 -2
  103. package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
  104. package/docs/api/interfaces/RBACConfig.md +1 -1
  105. package/docs/api/interfaces/RBACContextType.md +1 -1
  106. package/docs/api/interfaces/RBACLogger.md +1 -1
  107. package/docs/api/interfaces/RBACProviderProps.md +1 -1
  108. package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
  109. package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
  110. package/docs/api/interfaces/RouteAccessRecord.md +1 -1
  111. package/docs/api/interfaces/RouteConfig.md +1 -1
  112. package/docs/api/interfaces/SecureDataContextType.md +1 -1
  113. package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
  114. package/docs/api/interfaces/StorageConfig.md +1 -1
  115. package/docs/api/interfaces/StorageFileInfo.md +1 -1
  116. package/docs/api/interfaces/StorageFileMetadata.md +1 -1
  117. package/docs/api/interfaces/StorageListOptions.md +1 -1
  118. package/docs/api/interfaces/StorageListResult.md +1 -1
  119. package/docs/api/interfaces/StorageUploadOptions.md +1 -1
  120. package/docs/api/interfaces/StorageUploadResult.md +1 -1
  121. package/docs/api/interfaces/StorageUrlOptions.md +1 -1
  122. package/docs/api/interfaces/StyleImport.md +1 -1
  123. package/docs/api/interfaces/SwitchProps.md +1 -1
  124. package/docs/api/interfaces/ToastActionElement.md +1 -1
  125. package/docs/api/interfaces/ToastProps.md +1 -1
  126. package/docs/api/interfaces/UnifiedAuthContextType.md +1 -1
  127. package/docs/api/interfaces/UnifiedAuthProviderProps.md +4 -4
  128. package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
  129. package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
  130. package/docs/api/interfaces/UsePublicEventLogoOptions.md +1 -1
  131. package/docs/api/interfaces/UsePublicEventLogoReturn.md +1 -1
  132. package/docs/api/interfaces/UsePublicEventOptions.md +1 -1
  133. package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
  134. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
  135. package/docs/api/interfaces/UserEventAccess.md +1 -1
  136. package/docs/api/interfaces/UserMenuProps.md +1 -1
  137. package/docs/api/interfaces/UserProfile.md +1 -1
  138. package/docs/api/modules.md +39 -14
  139. package/docs/api-reference/providers.md +16 -7
  140. package/docs/architecture/services.md +374 -0
  141. package/docs/best-practices/README.md +1 -1
  142. package/docs/best-practices/testing.md +1 -1
  143. package/docs/breaking-changes.md +182 -0
  144. package/docs/common-patterns.md +445 -0
  145. package/docs/core-concepts/authentication.md +26 -11
  146. package/docs/core-concepts/events.md +2 -0
  147. package/docs/core-concepts/organisations.md +2 -0
  148. package/docs/core-concepts/permissions.md +2 -0
  149. package/docs/{INDEX.md → documentation-index.md} +26 -38
  150. package/docs/faq.md +286 -0
  151. package/docs/{FILE_REFERENCE_SYSTEM.md → file-reference-system.md} +1 -1
  152. package/docs/getting-started/installation-guide.md +284 -0
  153. package/docs/getting-started/quick-start.md +8 -1
  154. package/docs/implementation-guides/app-layout.md +3 -1
  155. package/docs/implementation-guides/data-tables.md +2 -0
  156. package/docs/implementation-guides/dynamic-colors.md +47 -2
  157. package/docs/implementation-guides/event-theming-summary.md +220 -0
  158. package/docs/implementation-guides/forms.md +9 -7
  159. package/docs/implementation-guides/navigation.md +2 -0
  160. package/docs/migration/service-architecture.md +351 -0
  161. package/docs/migration-guides/unified-auth-provider-mandatory-timeouts.md +226 -0
  162. package/docs/rbac/README-rbac-rls-integration.md +2 -2
  163. package/docs/rbac/README.md +1 -1
  164. package/docs/rbac/examples/rbac-rls-integration-example.md +3 -3
  165. package/docs/rbac/quick-start.md +2 -0
  166. package/docs/rbac/rbac-rls-integration.md +2 -2
  167. package/docs/security/README.md +5 -1
  168. package/docs/style-guide.md +136 -1
  169. package/docs/testing/README.md +1 -1
  170. package/docs/troubleshooting/authentication-issues.md +334 -0
  171. package/docs/troubleshooting/common-issues.md +2 -0
  172. package/docs/troubleshooting/styling-issues.md +199 -144
  173. package/docs/usage.md +23 -2
  174. package/package.json +1 -1
  175. package/src/__tests__/{TESTING_GUIDELINES.md → TEST_GUIDE_CURSOR.md} +20 -0
  176. package/src/__tests__/TEST_GUIDE_HUMAN.md +103 -0
  177. package/src/__tests__/fixtures/test-data.ts +90 -0
  178. package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +260 -0
  179. package/src/__tests__/helpers/__tests__/optimized-test-setup.test.ts +224 -0
  180. package/src/__tests__/helpers/__tests__/supabaseMock.test.ts +273 -0
  181. package/src/__tests__/helpers/__tests__/test-providers.test.tsx +98 -0
  182. package/src/__tests__/helpers/__tests__/test-utils.test.tsx +436 -0
  183. package/src/__tests__/helpers/__tests__/timer-utils.test.ts +371 -0
  184. package/src/__tests__/helpers/component-test-utils.tsx +14 -4
  185. package/src/__tests__/helpers/optimized-test-setup.ts +68 -0
  186. package/src/__tests__/helpers/test-providers.tsx +329 -0
  187. package/src/__tests__/helpers/test-utils.tsx +91 -45
  188. package/src/__tests__/helpers/timer-utils.ts +71 -0
  189. package/src/__tests__/hooks/usePermissions.test.ts +1 -5
  190. package/src/__tests__/integration/UserProfile.test.tsx +1 -5
  191. package/src/__tests__/rbac/PagePermissionGuard.test.tsx +42 -12
  192. package/src/__tests__/setup.ts +34 -28
  193. package/src/components/Alert/Alert.test.tsx +1 -5
  194. package/src/components/Avatar/Avatar.test.tsx +1 -5
  195. package/src/components/Button/Button.test.tsx +4 -20
  196. package/src/components/Card/Card.test.tsx +1 -5
  197. package/src/components/Checkbox/Checkbox.test.tsx +1 -5
  198. package/src/components/DataTable/__tests__/DataTable.comprehensive.test.tsx +1 -5
  199. package/src/components/DataTable/__tests__/DataTable.test.tsx +45 -49
  200. package/src/components/DataTable/__tests__/DataTableCore.test.tsx +1 -5
  201. package/src/components/DataTable/__tests__/styles.test.ts +382 -0
  202. package/src/components/DataTable/context/__tests__/DataTableContext.test.tsx +409 -0
  203. package/src/components/DataTable/core/__tests__/ActionManager.test.ts +634 -0
  204. package/src/components/DataTable/core/__tests__/DataManager.test.ts +519 -0
  205. package/src/components/DataTable/core/__tests__/StateManager.test.ts +714 -0
  206. package/src/components/DataTable/hooks/__tests__/useDataTableState.test.ts +592 -0
  207. package/src/components/DataTable/utils/__tests__/exportUtils.test.ts +354 -0
  208. package/src/components/DataTable/utils/__tests__/hierarchicalUtils.test.ts +539 -0
  209. package/src/components/Dialog/examples/__tests__/SmartDialogExample.unit.test.tsx +1 -5
  210. package/src/components/Dialog/utils/__tests__/safeHtml.unit.test.ts +1 -8
  211. package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +34 -38
  212. package/src/components/Footer/Footer.test.tsx +1 -5
  213. package/src/components/Form/Form.test.tsx +22 -35
  214. package/src/components/Header/Header.test.tsx +1 -9
  215. package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +1 -5
  216. package/src/components/Input/Input.test.tsx +2 -10
  217. package/src/components/LoginForm/LoginForm.test.tsx +1 -5
  218. package/src/components/NavigationMenu/NavigationMenu.test.tsx +24 -24
  219. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.accessibility.test.tsx +1 -6
  220. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.integration.test.tsx +6 -16
  221. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.performance.test.tsx +1 -5
  222. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.rbac.test.tsx +1 -5
  223. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +1 -7
  224. package/src/components/PasswordReset/PasswordChangeForm.test.tsx +1 -9
  225. package/src/components/PasswordReset/PasswordResetForm.test.tsx +1 -9
  226. package/src/components/PublicLayout/PublicErrorBoundary.tsx +4 -5
  227. package/src/components/PublicLayout/PublicPageHeader.tsx +13 -9
  228. package/src/components/PublicLayout/__tests__/EventLogo.test.tsx +666 -0
  229. package/src/components/PublicLayout/__tests__/PublicErrorBoundary.test.tsx +457 -0
  230. package/src/components/PublicLayout/__tests__/PublicLoadingSpinner.test.tsx +393 -0
  231. package/src/components/PublicLayout/__tests__/PublicPageFooter.test.tsx +351 -0
  232. package/src/components/PublicLayout/__tests__/PublicPageHeader.test.tsx +374 -0
  233. package/src/components/PublicLayout/__tests__/PublicPageLayout.test.tsx +388 -0
  234. package/src/components/Select/Select.bug-test.tsx +69 -0
  235. package/src/components/Select/Select.refactored.tsx +497 -0
  236. package/src/components/Select/Select.test.tsx +42 -49
  237. package/src/components/Select/Select.tsx +5 -2
  238. package/src/components/Select/hooks.ts +254 -0
  239. package/src/components/Switch/Switch.test.tsx +1 -5
  240. package/src/components/Table/__tests__/Table.test.tsx +775 -0
  241. package/src/components/Toast/Toast.test.tsx +15 -8
  242. package/src/components/Tooltip/Tooltip.test.tsx +1 -5
  243. package/src/components/UserMenu/UserMenu.test.tsx +3 -15
  244. package/src/components/__tests__/FileDisplay.test.tsx +575 -0
  245. package/src/components/__tests__/FileUpload.test.tsx +446 -0
  246. package/src/components/__tests__/SuperAdminGuard.test.tsx +422 -354
  247. package/src/hooks/__tests__/ServiceHooks.test.tsx +613 -0
  248. package/src/hooks/__tests__/hooks.integration.test.tsx +1 -10
  249. package/src/hooks/__tests__/useApiFetch.unit.test.ts +10 -14
  250. package/src/hooks/__tests__/useAppConfig.unit.test.ts +307 -0
  251. package/src/hooks/__tests__/useComponentPerformance.unit.test.tsx +1 -6
  252. package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +1 -5
  253. package/src/hooks/__tests__/useOrganisationPermissions.unit.test.tsx +6 -9
  254. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +321 -0
  255. package/src/hooks/__tests__/usePublicEvent.unit.test.ts +583 -0
  256. package/src/hooks/__tests__/usePublicEventLogo.unit.test.ts +640 -0
  257. package/src/hooks/__tests__/usePublicRouteParams.unit.test.ts +435 -0
  258. package/src/hooks/__tests__/useRBAC.unit.test.ts +10 -10
  259. package/src/hooks/__tests__/useStorage.unit.test.ts +751 -0
  260. package/src/hooks/index.ts +3 -0
  261. package/src/hooks/public/usePublicEvent.ts +181 -13
  262. package/src/hooks/public/usePublicRouteParams.ts +13 -3
  263. package/src/hooks/services/useAuth.ts +50 -0
  264. package/src/hooks/services/useAuthService.ts +30 -0
  265. package/src/hooks/services/useCurrentEvent.ts +36 -0
  266. package/src/hooks/services/useCurrentOrganisation.ts +52 -0
  267. package/src/hooks/services/useEventService.ts +30 -0
  268. package/src/hooks/services/useInactivityService.ts +30 -0
  269. package/src/hooks/services/useOrganisationService.ts +30 -0
  270. package/src/hooks/services/usePermissions.ts +70 -0
  271. package/src/hooks/services/useRBACService.ts +30 -0
  272. package/src/hooks/useCounter.test.ts +1 -5
  273. package/src/hooks/useEventTheme.ts +86 -0
  274. package/src/hooks/useOrganisationPermissions.test.ts +2 -5
  275. package/src/hooks/useOrganisationSecurity.test.ts +1 -5
  276. package/src/hooks/usePermissionCache.test.ts +1 -5
  277. package/src/hooks/usePermissionCheck.ts +150 -0
  278. package/src/hooks/useSecureDataAccess.test.ts +1 -5
  279. package/src/index.ts +1 -0
  280. package/src/providers/OrganisationProvider.test.tsx +1 -5
  281. package/src/providers/OrganisationProvider.tsx +56 -4
  282. package/src/providers/UnifiedAuthProvider.test.simple.tsx +42 -6
  283. package/src/providers/UnifiedAuthProvider.test.tsx +1 -5
  284. package/src/providers/UnifiedAuthProvider.tsx +4 -4
  285. package/src/providers/__tests__/AuthProvider.test.tsx +105 -439
  286. package/src/providers/__tests__/AuthProvider.test.tsx.backup +771 -0
  287. package/src/providers/__tests__/EventProvider.test.tsx +211 -110
  288. package/src/providers/__tests__/EventProvider.test.tsx.backup +824 -0
  289. package/src/providers/__tests__/InactivityProvider.test.tsx +1 -5
  290. package/src/providers/__tests__/OrganisationProvider.test.tsx +97 -261
  291. package/src/providers/__tests__/OrganisationProvider.test.tsx.backup +820 -0
  292. package/src/providers/__tests__/ServiceProviders.test.tsx +477 -0
  293. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +72 -504
  294. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx.backup +911 -0
  295. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx.backup2 +166 -0
  296. package/src/providers/services/AuthServiceProvider.tsx +65 -0
  297. package/src/providers/services/EventServiceProvider.tsx +83 -0
  298. package/src/providers/services/InactivityServiceProvider.tsx +83 -0
  299. package/src/providers/services/OrganisationServiceProvider.tsx +77 -0
  300. package/src/providers/services/RBACServiceProvider.tsx +79 -0
  301. package/src/providers/services/UnifiedAuthProvider.tsx +368 -0
  302. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +210 -0
  303. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +269 -0
  304. package/src/rbac/__tests__/adapters.comprehensive.test.tsx +892 -0
  305. package/src/rbac/__tests__/engine.comprehensive.test.ts +954 -0
  306. package/src/rbac/__tests__/integration.authflow.test.tsx +1 -5
  307. package/src/rbac/__tests__/integration.navigation.test.tsx +1 -4
  308. package/src/rbac/__tests__/rbac-core.test.tsx +2 -7
  309. package/src/rbac/__tests__/rbac-functions.test.ts +1 -9
  310. package/src/rbac/__tests__/rbac-integration.test.ts +1 -9
  311. package/src/rbac/api.test.ts +1 -9
  312. package/src/rbac/cache.test.ts +10 -8
  313. package/src/rbac/cli/__tests__/policy-manager.test.ts +339 -0
  314. package/src/rbac/components/EnhancedNavigationMenu.test.tsx +1 -5
  315. package/src/rbac/components/NavigationProvider.test.tsx +1 -5
  316. package/src/rbac/components/PagePermissionProvider.test.tsx +1 -5
  317. package/src/rbac/components/SecureDataProvider.test.tsx +1 -5
  318. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +25 -29
  319. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +27 -30
  320. package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +23 -27
  321. package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +18 -22
  322. package/src/rbac/config.test.ts +1 -5
  323. package/src/rbac/hooks/useCan.test.ts +262 -9
  324. package/src/rbac/hooks/usePermissions.test.ts +246 -6
  325. package/src/rbac/hooks/useRBAC.simple.test.ts +1 -5
  326. package/src/rbac/hooks/useRBAC.test.ts +472 -198
  327. package/src/rbac/providers/__tests__/RBACProvider.test.tsx +1 -9
  328. package/src/services/AuthService.ts +416 -0
  329. package/src/services/EventService.ts +366 -0
  330. package/src/services/InactivityService.ts +388 -0
  331. package/src/services/OrganisationService.ts +592 -0
  332. package/src/services/RBACService.ts +522 -0
  333. package/src/services/__tests__/AuthService.test.ts +356 -0
  334. package/src/services/__tests__/BaseService.test.ts +314 -0
  335. package/src/services/__tests__/EventService.test.ts +489 -0
  336. package/src/services/__tests__/InactivityService.test.ts +403 -0
  337. package/src/services/__tests__/OrganisationService.test.ts +660 -0
  338. package/src/services/__tests__/RBACService.test.ts +492 -0
  339. package/src/services/base/BaseService.ts +87 -0
  340. package/src/services/interfaces/IAuthService.ts +39 -0
  341. package/src/services/interfaces/IEventService.ts +30 -0
  342. package/src/services/interfaces/IInactivityService.ts +31 -0
  343. package/src/services/interfaces/IOrganisationService.ts +41 -0
  344. package/src/services/interfaces/IRBACService.ts +62 -0
  345. package/src/theming/__tests__/runtime.test.ts +540 -0
  346. package/src/types/__tests__/file-reference.test.ts +447 -0
  347. package/src/types/__tests__/organisation.test.ts +1133 -0
  348. package/src/types/__tests__/theme.test.ts +830 -0
  349. package/src/types/__tests__/type-validation.test.ts +527 -0
  350. package/src/utils/__tests__/bundleAnalysis.unit.test.ts +1 -5
  351. package/src/utils/__tests__/debugLogger.test.ts +417 -0
  352. package/src/utils/__tests__/deviceFingerprint.unit.test.ts +1 -6
  353. package/src/utils/__tests__/dynamicUtils.unit.test.ts +1 -5
  354. package/src/utils/__tests__/lazyLoad.unit.test.tsx +35 -35
  355. package/src/utils/__tests__/organisationContext.unit.test.ts +1 -5
  356. package/src/utils/__tests__/performanceBudgets.unit.test.ts +5 -11
  357. package/src/utils/__tests__/secureErrors.unit.test.ts +1 -6
  358. package/src/utils/__tests__/secureStorage.unit.test.ts +1 -5
  359. package/src/utils/__tests__/securityMonitor.unit.test.ts +1 -5
  360. package/src/utils/__tests__/sessionTracking.unit.test.ts +1 -5
  361. package/src/utils/appIdResolver.test.ts +6 -10
  362. package/src/utils/appNameResolver.simple.test.ts +142 -0
  363. package/src/utils/appNameResolver.test.ts +31 -458
  364. package/src/utils/appNameResolver.test.ts.backup +494 -0
  365. package/src/utils/debugLogger.ts +26 -5
  366. package/src/utils/formatDate.test.ts +1 -5
  367. package/src/utils/organisationContext.test.ts +1 -5
  368. package/src/utils/performanceBudgets.ts +3 -4
  369. package/src/utils/secureDataAccess.test.ts +1 -5
  370. package/src/utils/storage/__tests__/helpers.unit.test.ts +1 -5
  371. package/src/validation/__tests__/sqlInjectionProtection.unit.test.ts +1 -5
  372. package/dist/chunk-4HQ5BOVZ.js.map +0 -1
  373. package/dist/chunk-D7ARGIA3.js.map +0 -1
  374. package/dist/chunk-QVEOQVD4.js.map +0 -1
  375. package/dist/chunk-T2MQY57J.js.map +0 -1
  376. package/dist/chunk-T6HVDA24.js.map +0 -1
  377. package/dist/chunk-VTJ5HCZB.js +0 -315
  378. package/dist/chunk-VTJ5HCZB.js.map +0 -1
  379. package/dist/chunk-ZPK5656W.js.map +0 -1
  380. package/docs/getting-started/installation.md +0 -269
  381. package/src/__tests__/REBUILD_PLAN.md +0 -223
  382. /package/dist/{DataTable-MFUXNGPR.js.map → DataTable-MPBSXUC6.js.map} +0 -0
  383. /package/dist/{chunk-CKNY7HYS.js.map → chunk-2ARQW6VX.js.map} +0 -0
  384. /package/dist/{chunk-BTCA3ENN.js.map → chunk-Q2UP3ZWQ.js.map} +0 -0
@@ -0,0 +1,382 @@
1
+ /**
2
+ * @file DataTable Styles Tests
3
+ * @description Comprehensive test suite for DataTable styling utilities
4
+ * @package @jmruthers/pace-core
5
+ * @module Components/DataTable/styles
6
+ * @since 0.4.0
7
+ */
8
+
9
+ import { describe, it, expect, vi } from 'vitest';
10
+ import {
11
+ tableStyles,
12
+ getTableCellClasses,
13
+ getTableHeadClasses,
14
+ getTableRowClasses,
15
+ getTableContainerClasses,
16
+ getTableClasses,
17
+ getMainContainerClasses,
18
+ } from '../styles';
19
+
20
+ // Mock the cn utility
21
+ vi.mock('../../../utils/cn', () => ({
22
+ cn: (...classes: (string | undefined | null | false)[]) =>
23
+ classes.filter(Boolean).join(' '),
24
+ }));
25
+
26
+ describe('DataTable Styles', () => {
27
+ describe('tableStyles constants', () => {
28
+ it('has all required table style constants', () => {
29
+ expect(tableStyles).toHaveProperty('table');
30
+ expect(tableStyles).toHaveProperty('tableFixed');
31
+ expect(tableStyles).toHaveProperty('header');
32
+ expect(tableStyles).toHaveProperty('body');
33
+ expect(tableStyles).toHaveProperty('footer');
34
+ expect(tableStyles).toHaveProperty('row');
35
+ expect(tableStyles).toHaveProperty('rowHover');
36
+ expect(tableStyles).toHaveProperty('rowSelected');
37
+ expect(tableStyles).toHaveProperty('head');
38
+ expect(tableStyles).toHaveProperty('headSortable');
39
+ expect(tableStyles).toHaveProperty('cell');
40
+ expect(tableStyles).toHaveProperty('cellCompact');
41
+ expect(tableStyles).toHaveProperty('cellVirtualized');
42
+ expect(tableStyles).toHaveProperty('cellSortable');
43
+ expect(tableStyles).toHaveProperty('mainContainer');
44
+ expect(tableStyles).toHaveProperty('container');
45
+ expect(tableStyles).toHaveProperty('containerVirtualized');
46
+ expect(tableStyles).toHaveProperty('stickyHeader');
47
+ expect(tableStyles).toHaveProperty('emptyState');
48
+ expect(tableStyles).toHaveProperty('emptyStateContent');
49
+ expect(tableStyles).toHaveProperty('emptyStateIcon');
50
+ expect(tableStyles).toHaveProperty('emptyStateText');
51
+ });
52
+
53
+ it('has correct table base styles', () => {
54
+ expect(tableStyles.table).toBe('w-full caption-bottom text-sm');
55
+ expect(tableStyles.tableFixed).toBe('w-full table-fixed');
56
+ });
57
+
58
+ it('has correct table section styles', () => {
59
+ expect(tableStyles.header).toBe('[&_tr]:border-b');
60
+ expect(tableStyles.body).toBe('[&_tr:last-child]:border-0');
61
+ expect(tableStyles.footer).toBe('border-t bg-muted/50 font-medium [&>tr]:last:border-b-0');
62
+ });
63
+
64
+ it('has correct row styles', () => {
65
+ expect(tableStyles.row).toBe('border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted');
66
+ expect(tableStyles.rowHover).toBe('hover:bg-sec-50 transition-colors');
67
+ expect(tableStyles.rowSelected).toBe('bg-main-50');
68
+ });
69
+
70
+ it('has correct cell styles', () => {
71
+ expect(tableStyles.head).toBe('h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0');
72
+ expect(tableStyles.headSortable).toBe('cursor-pointer select-none hover:bg-muted/50');
73
+ expect(tableStyles.cell).toBe('p-4 align-middle [&:has([role=checkbox])]:pr-0');
74
+ expect(tableStyles.cellCompact).toBe('px-3 py-2 align-middle [&:has([role=checkbox])]:pr-0');
75
+ expect(tableStyles.cellVirtualized).toBe('px-4 py-2 text-sm border-b border-sec-200 whitespace-normal');
76
+ expect(tableStyles.cellSortable).toBe('cursor-pointer select-none');
77
+ });
78
+
79
+ it('has correct container styles', () => {
80
+ expect(tableStyles.mainContainer).toBe('w-full max-w-full');
81
+ expect(tableStyles.container).toBe('overflow-x-auto w-full');
82
+ expect(tableStyles.containerVirtualized).toBe('overflow-hidden');
83
+ });
84
+
85
+ it('has correct empty state styles', () => {
86
+ expect(tableStyles.emptyState).toBe('flex items-center justify-center py-12');
87
+ expect(tableStyles.emptyStateContent).toBe('text-center');
88
+ expect(tableStyles.emptyStateIcon).toBe('text-sec-400 text-lg mb-2');
89
+ expect(tableStyles.emptyStateText).toBe('text-sec-500');
90
+ });
91
+ });
92
+
93
+ describe('getTableCellClasses', () => {
94
+ it('returns default cell classes', () => {
95
+ const result = getTableCellClasses();
96
+ expect(result).toBe('p-4 align-middle [&:has([role=checkbox])]:pr-0');
97
+ });
98
+
99
+ it('returns compact cell classes when isCompact is true', () => {
100
+ const result = getTableCellClasses({ isCompact: true });
101
+ expect(result).toBe('px-3 py-2 align-middle [&:has([role=checkbox])]:pr-0');
102
+ });
103
+
104
+ it('returns virtualized cell classes when isVirtualized is true', () => {
105
+ const result = getTableCellClasses({ isVirtualized: true });
106
+ expect(result).toBe('px-4 py-2 text-sm border-b border-sec-200 whitespace-normal');
107
+ });
108
+
109
+ it('returns sortable cell classes when isSortable is true', () => {
110
+ const result = getTableCellClasses({ isSortable: true });
111
+ expect(result).toBe('p-4 align-middle [&:has([role=checkbox])]:pr-0 cursor-pointer select-none');
112
+ });
113
+
114
+ it('combines virtualized and sortable classes', () => {
115
+ const result = getTableCellClasses({ isVirtualized: true, isSortable: true });
116
+ expect(result).toBe('px-4 py-2 text-sm border-b border-sec-200 whitespace-normal cursor-pointer select-none');
117
+ });
118
+
119
+ it('adds custom className', () => {
120
+ const result = getTableCellClasses({ className: 'custom-class' });
121
+ expect(result).toBe('p-4 align-middle [&:has([role=checkbox])]:pr-0 custom-class');
122
+ });
123
+
124
+ it('combines all options correctly', () => {
125
+ const result = getTableCellClasses({
126
+ isVirtualized: true,
127
+ isSortable: true,
128
+ className: 'custom-class',
129
+ });
130
+ expect(result).toBe('px-4 py-2 text-sm border-b border-sec-200 whitespace-normal cursor-pointer select-none custom-class');
131
+ });
132
+
133
+ it('prioritizes virtualized over compact', () => {
134
+ const result = getTableCellClasses({ isVirtualized: true, isCompact: true });
135
+ expect(result).toBe('px-4 py-2 text-sm border-b border-sec-200 whitespace-normal');
136
+ });
137
+ });
138
+
139
+ describe('getTableHeadClasses', () => {
140
+ it('returns default head classes', () => {
141
+ const result = getTableHeadClasses();
142
+ expect(result).toBe('h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0');
143
+ });
144
+
145
+ it('returns sortable head classes when isSortable is true', () => {
146
+ const result = getTableHeadClasses({ isSortable: true });
147
+ expect(result).toBe('h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0 cursor-pointer select-none hover:bg-muted/50');
148
+ });
149
+
150
+ it('adds custom className', () => {
151
+ const result = getTableHeadClasses({ className: 'custom-head-class' });
152
+ expect(result).toBe('h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0 custom-head-class');
153
+ });
154
+
155
+ it('combines sortable and custom className', () => {
156
+ const result = getTableHeadClasses({ isSortable: true, className: 'custom-head-class' });
157
+ expect(result).toBe('h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0 cursor-pointer select-none hover:bg-muted/50 custom-head-class');
158
+ });
159
+ });
160
+
161
+ describe('getTableRowClasses', () => {
162
+ it('returns default row classes', () => {
163
+ const result = getTableRowClasses();
164
+ expect(result).toBe('border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted');
165
+ });
166
+
167
+ it('returns selected row classes when isSelected is true', () => {
168
+ const result = getTableRowClasses({ isSelected: true });
169
+ expect(result).toBe('border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted bg-main-50');
170
+ });
171
+
172
+ it('returns virtualized row classes when isVirtualized is true', () => {
173
+ const result = getTableRowClasses({ isVirtualized: true });
174
+ expect(result).toBe('hover:bg-sec-50 transition-colors');
175
+ });
176
+
177
+ it('combines virtualized and selected classes', () => {
178
+ const result = getTableRowClasses({ isVirtualized: true, isSelected: true });
179
+ expect(result).toBe('hover:bg-sec-50 transition-colors bg-main-50');
180
+ });
181
+
182
+ it('adds custom className', () => {
183
+ const result = getTableRowClasses({ className: 'custom-row-class' });
184
+ expect(result).toBe('border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted custom-row-class');
185
+ });
186
+
187
+ it('combines all options correctly', () => {
188
+ const result = getTableRowClasses({
189
+ isVirtualized: true,
190
+ isSelected: true,
191
+ className: 'custom-row-class',
192
+ });
193
+ expect(result).toBe('hover:bg-sec-50 transition-colors bg-main-50 custom-row-class');
194
+ });
195
+ });
196
+
197
+ describe('getTableContainerClasses', () => {
198
+ it('returns default container classes', () => {
199
+ const result = getTableContainerClasses();
200
+ expect(result).toBe('overflow-x-auto w-full');
201
+ });
202
+
203
+ it('returns virtualized container classes when isVirtualized is true', () => {
204
+ const result = getTableContainerClasses({ isVirtualized: true });
205
+ expect(result).toBe('overflow-hidden');
206
+ });
207
+
208
+ it('adds custom className', () => {
209
+ const result = getTableContainerClasses({ className: 'custom-container-class' });
210
+ expect(result).toBe('overflow-x-auto w-full custom-container-class');
211
+ });
212
+
213
+ it('combines virtualized and custom className', () => {
214
+ const result = getTableContainerClasses({ isVirtualized: true, className: 'custom-container-class' });
215
+ expect(result).toBe('overflow-hidden custom-container-class');
216
+ });
217
+ });
218
+
219
+ describe('getTableClasses', () => {
220
+ it('returns default table classes', () => {
221
+ const result = getTableClasses();
222
+ expect(result).toBe('w-full caption-bottom text-sm');
223
+ });
224
+
225
+ it('returns fixed table classes when isFixed is true', () => {
226
+ const result = getTableClasses({ isFixed: true });
227
+ expect(result).toBe('w-full table-fixed');
228
+ });
229
+
230
+ it('returns compact variant classes', () => {
231
+ const result = getTableClasses({ variant: 'compact' });
232
+ expect(result).toBe('w-full caption-bottom text-sm text-sm');
233
+ });
234
+
235
+ it('returns spacious variant classes', () => {
236
+ const result = getTableClasses({ variant: 'spacious' });
237
+ expect(result).toBe('w-full caption-bottom text-sm text-base');
238
+ });
239
+
240
+ it('adds custom className', () => {
241
+ const result = getTableClasses({ className: 'custom-table-class' });
242
+ expect(result).toBe('w-full caption-bottom text-sm custom-table-class');
243
+ });
244
+
245
+ it('combines all options correctly', () => {
246
+ const result = getTableClasses({
247
+ isFixed: true,
248
+ variant: 'compact',
249
+ className: 'custom-table-class',
250
+ });
251
+ expect(result).toBe('w-full table-fixed text-sm custom-table-class');
252
+ });
253
+
254
+ it('prioritizes isFixed over variant', () => {
255
+ const result = getTableClasses({ isFixed: true, variant: 'spacious' });
256
+ expect(result).toBe('w-full table-fixed text-base');
257
+ });
258
+ });
259
+
260
+ describe('getMainContainerClasses', () => {
261
+ it('returns default main container classes', () => {
262
+ const result = getMainContainerClasses();
263
+ expect(result).toBe('w-full max-w-full');
264
+ });
265
+
266
+ it('adds custom className', () => {
267
+ const result = getMainContainerClasses({ className: 'custom-main-class' });
268
+ expect(result).toBe('w-full max-w-full custom-main-class');
269
+ });
270
+ });
271
+
272
+ describe('Style Consistency', () => {
273
+ it('maintains consistent spacing patterns', () => {
274
+ // Check that padding/margin values are consistent
275
+ expect(tableStyles.cell).toContain('p-4');
276
+ expect(tableStyles.cellCompact).toContain('px-3 py-2');
277
+ expect(tableStyles.cellVirtualized).toContain('px-4 py-2');
278
+ expect(tableStyles.head).toContain('px-4');
279
+ });
280
+
281
+ it('maintains consistent color patterns', () => {
282
+ // Check that color classes follow the design system
283
+ expect(tableStyles.rowHover).toContain('bg-sec-50');
284
+ expect(tableStyles.rowSelected).toContain('bg-main-50');
285
+ expect(tableStyles.emptyStateIcon).toContain('text-sec-400');
286
+ expect(tableStyles.emptyStateText).toContain('text-sec-500');
287
+ });
288
+
289
+ it('maintains consistent border patterns', () => {
290
+ // Check that border classes are consistent
291
+ expect(tableStyles.cellVirtualized).toContain('border-b border-sec-200');
292
+ expect(tableStyles.footer).toContain('border-t');
293
+ });
294
+
295
+ it('maintains consistent transition patterns', () => {
296
+ // Check that transition classes are consistent
297
+ expect(tableStyles.row).toContain('transition-colors');
298
+ expect(tableStyles.rowHover).toContain('transition-colors');
299
+ });
300
+ });
301
+
302
+ describe('Accessibility Considerations', () => {
303
+ it('includes proper cursor styles for interactive elements', () => {
304
+ expect(tableStyles.headSortable).toContain('cursor-pointer');
305
+ expect(tableStyles.cellSortable).toContain('cursor-pointer');
306
+ });
307
+
308
+ it('includes proper select styles for sortable elements', () => {
309
+ expect(tableStyles.headSortable).toContain('select-none');
310
+ expect(tableStyles.cellSortable).toContain('select-none');
311
+ });
312
+
313
+ it('includes proper hover states for interactive elements', () => {
314
+ expect(tableStyles.headSortable).toContain('hover:bg-muted/50');
315
+ expect(tableStyles.row).toContain('hover:bg-muted/50');
316
+ expect(tableStyles.rowHover).toContain('hover:bg-sec-50');
317
+ });
318
+ });
319
+
320
+ describe('Responsive Design', () => {
321
+ it('includes responsive overflow handling', () => {
322
+ expect(tableStyles.container).toContain('overflow-x-auto');
323
+ expect(tableStyles.containerVirtualized).toContain('overflow-hidden');
324
+ });
325
+
326
+ it('includes proper width constraints', () => {
327
+ expect(tableStyles.mainContainer).toContain('w-full max-w-full');
328
+ expect(tableStyles.table).toContain('w-full');
329
+ expect(tableStyles.tableFixed).toContain('w-full');
330
+ });
331
+ });
332
+
333
+ describe('Virtualization Support', () => {
334
+ it('provides distinct styles for virtualized tables', () => {
335
+ expect(tableStyles.cellVirtualized).not.toBe(tableStyles.cell);
336
+ expect(tableStyles.containerVirtualized).not.toBe(tableStyles.container);
337
+ });
338
+
339
+ it('maintains performance-optimized styles for virtualized elements', () => {
340
+ // Virtualized cells should have simpler styles for better performance
341
+ expect(tableStyles.cellVirtualized).toContain('whitespace-normal');
342
+ expect(tableStyles.cellVirtualized).not.toContain('hover:bg-muted/50');
343
+ });
344
+ });
345
+
346
+ describe('Edge Cases', () => {
347
+ it('handles undefined options gracefully', () => {
348
+ const result = getTableCellClasses({ isVirtualized: undefined, isSortable: undefined });
349
+ expect(result).toBe('p-4 align-middle [&:has([role=checkbox])]:pr-0');
350
+ });
351
+
352
+ it('handles null className gracefully', () => {
353
+ const result = getTableCellClasses({ className: null });
354
+ expect(result).toBe('p-4 align-middle [&:has([role=checkbox])]:pr-0');
355
+ });
356
+
357
+ it('handles empty string className gracefully', () => {
358
+ const result = getTableCellClasses({ className: '' });
359
+ expect(result).toBe('p-4 align-middle [&:has([role=checkbox])]:pr-0');
360
+ });
361
+
362
+ it('handles multiple className values', () => {
363
+ const result = getTableCellClasses({ className: 'class1 class2 class3' });
364
+ expect(result).toBe('p-4 align-middle [&:has([role=checkbox])]:pr-0 class1 class2 class3');
365
+ });
366
+ });
367
+
368
+ describe('Type Safety', () => {
369
+ it('accepts valid variant options', () => {
370
+ expect(() => getTableClasses({ variant: 'default' })).not.toThrow();
371
+ expect(() => getTableClasses({ variant: 'compact' })).not.toThrow();
372
+ expect(() => getTableClasses({ variant: 'spacious' })).not.toThrow();
373
+ });
374
+
375
+ it('handles boolean options correctly', () => {
376
+ expect(() => getTableCellClasses({ isVirtualized: true })).not.toThrow();
377
+ expect(() => getTableCellClasses({ isVirtualized: false })).not.toThrow();
378
+ expect(() => getTableRowClasses({ isSelected: true })).not.toThrow();
379
+ expect(() => getTableRowClasses({ isSelected: false })).not.toThrow();
380
+ });
381
+ });
382
+ });