@jmruthers/pace-core 0.6.8 → 0.6.10

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 (669) hide show
  1. package/CHANGELOG.md +3 -0
  2. package/audit-tool/audits/02-project-structure.cjs +97 -32
  3. package/audit-tool/audits/03-architecture.cjs +145 -19
  4. package/audit-tool/audits/04-code-quality.cjs +86 -1
  5. package/audit-tool/audits/06-security-rbac.cjs +109 -11
  6. package/cursor-rules/02-project-structure.mdc +2 -26
  7. package/cursor-rules/05-styling.mdc +84 -6
  8. package/cursor-rules/06-security-rbac.mdc +124 -1
  9. package/dist/{DataTable-6RMSCQJ6.js → DataTable-SAXFG4XI.js} +11 -13
  10. package/dist/{AuthService-DmfO5rGS.d.ts → InactivityServiceProvider-DHryoh6K.d.ts} +24 -249
  11. package/dist/UnifiedAuthProvider-BBD2PS3Q.js +7 -0
  12. package/dist/{UnifiedAuthProvider-CKvHP1MK.d.ts → UnifiedAuthProvider-CiBAl9-s.d.ts} +34 -22
  13. package/dist/{api-7P7DI652.js → api-F47QJ7FX.js} +3 -3
  14. package/dist/assets/app-icons/admin_favicon.svg +462 -0
  15. package/dist/assets/app-icons/base_favicon.svg +85 -0
  16. package/dist/assets/app-icons/cake_favicon.svg +68 -0
  17. package/dist/assets/app-icons/core_favicon.svg +256 -0
  18. package/dist/assets/app-icons/gear_favicon.svg +91 -0
  19. package/dist/assets/app-icons/medi_favicon.svg +92 -0
  20. package/dist/assets/app-icons/mint_favicon.svg +83 -0
  21. package/dist/assets/app-icons/pace_favicon.svg +49 -0
  22. package/dist/assets/app-icons/pump_favicon.svg +68 -0
  23. package/dist/assets/app-icons/seed_favicon.svg +91 -0
  24. package/dist/assets/app-icons/team_favicon.svg +67 -0
  25. package/dist/assets/app-icons/trac_favicon.svg +112 -0
  26. package/dist/assets/app-icons/trip_favicon.svg +102 -0
  27. package/dist/audit-Z6ZZBWLU.js +3 -0
  28. package/dist/chunk-3GWSPISD.js +61 -0
  29. package/dist/{chunk-4DDCYDQ3.js → chunk-66R6RLUZ.js} +12 -27
  30. package/dist/{chunk-FYHN4DD5.js → chunk-7YDC7LMU.js} +80 -8
  31. package/dist/{chunk-S7DKJPLT.js → chunk-BCTXBU6U.js} +22 -17
  32. package/dist/{chunk-TTRFSOKR.js → chunk-BTHN5MKC.js} +4 -4
  33. package/dist/{chunk-A3W6LW53.js → chunk-DDMPHZ3D.js} +6 -18
  34. package/dist/{chunk-MPBLMWVR.js → chunk-FBZ7U3ID.js} +140 -92
  35. package/dist/chunk-FN52B75D.js +246 -0
  36. package/dist/{chunk-5W2A3DRC.js → chunk-JJEYZ3DX.js} +5 -4
  37. package/dist/chunk-KPYQWGFQ.js +183 -0
  38. package/dist/{chunk-IUBRCBSY.js → chunk-KSNLMI7N.js} +14 -8
  39. package/dist/chunk-KYURMOQM.js +977 -0
  40. package/dist/{chunk-LX6U42O3.js → chunk-LNHFAF4X.js} +160 -58
  41. package/dist/{chunk-NKHKXPI4.js → chunk-MPY44PWB.js} +683 -627
  42. package/dist/{chunk-AHU7G2R5.js → chunk-NIU6DPQV.js} +10 -6
  43. package/dist/{chunk-HF6O3O37.js → chunk-RMLY6KB5.js} +1 -1
  44. package/dist/{chunk-6GLLNA6U.js → chunk-SACF5YSM.js} +1 -1
  45. package/dist/{chunk-EURB7QFZ.js → chunk-TFIPNIPE.js} +867 -534
  46. package/dist/{chunk-OJ4SKRSV.js → chunk-UZNAFKGW.js} +25 -5
  47. package/dist/chunk-W46INAVW.js +1216 -0
  48. package/dist/chunk-X5EAU5G7.js +793 -0
  49. package/dist/{chunk-T5CVK4R3.js → chunk-Y4PF6HIM.js} +110 -64
  50. package/dist/components.d.ts +8 -86
  51. package/dist/components.js +21 -55
  52. package/dist/{database.generated-CcnC_DRc.d.ts → database.generated-DT8JTZiP.d.ts} +12 -12
  53. package/dist/eslint-rules/rules/05-styling.cjs +507 -0
  54. package/dist/eslint-rules/rules/06-security-rbac.cjs +10 -0
  55. package/dist/{event-CW5YB_2p.d.ts → event-WTAQuGcq.d.ts} +1 -1
  56. package/dist/{functions-lBy5L2ry.d.ts → functions-DH45k8ec.d.ts} +1 -1
  57. package/dist/hooks.d.ts +12 -11
  58. package/dist/hooks.js +69 -44
  59. package/dist/index.d.ts +380 -32
  60. package/dist/index.js +46 -32
  61. package/dist/papaparseLoader-WG2UXQ22.js +7 -0
  62. package/dist/providers.d.ts +28 -14
  63. package/dist/providers.js +5 -5
  64. package/dist/rbac/eslint-rules.js +2 -2
  65. package/dist/rbac/index.d.ts +58 -214
  66. package/dist/rbac/index.js +11 -11
  67. package/dist/theming/runtime.d.ts +9 -3
  68. package/dist/theming/runtime.js +2 -2
  69. package/dist/{timezone-BZe_eUxx.d.ts → timezone-K-ptz3HO.d.ts} +22 -23
  70. package/dist/{types-t9H8qKRw.d.ts → types-BE2sEHKd.d.ts} +1 -1
  71. package/dist/{types-BeoeWV5I.d.ts → types-CvOPXWWZ.d.ts} +6 -5
  72. package/dist/{types-DXstZpNI.d.ts → types-D05dCGma.d.ts} +56 -149
  73. package/dist/types-Dr8sNhER.d.ts +50 -0
  74. package/dist/types.d.ts +5 -5
  75. package/dist/{PublicPageProvider-CIGSujI2.d.ts → usePublicPageContext-vxBlEHO9.d.ts} +294 -151
  76. package/dist/{usePublicRouteParams-MamNgwqe.d.ts → usePublicRouteParams-G3Ks53mk.d.ts} +8 -7
  77. package/dist/utils.d.ts +301 -137
  78. package/dist/utils.js +42 -41
  79. package/dist/{validation-643vUDZW.d.ts → validation-g5n0hDkh.d.ts} +2 -2
  80. package/docs/api/modules.md +542 -549
  81. package/docs/api-reference/components.md +5 -5
  82. package/docs/api-reference/rpc-functions.md +3 -3
  83. package/docs/implementation-guides/data-tables.md +256 -8
  84. package/docs/rbac/RBAC_CONTRACT.md +0 -12
  85. package/docs/standards/2-project-structure-standards.md +12 -74
  86. package/docs/standards/6-security-rbac-standards.md +222 -7
  87. package/docs/standards/7-api-tech-stack-standards.md +91 -3
  88. package/docs/testing/README.md +10 -0
  89. package/docs/testing/test-setup-for-consumers.md +914 -0
  90. package/eslint-config-pace-core.cjs +4 -0
  91. package/package.json +1 -1
  92. package/scripts/eslint-audit.cjs +110 -11
  93. package/src/__mocks__/lucide-react.ts +0 -2
  94. package/src/__tests__/helpers/__tests__/test-utils.test.tsx +0 -2
  95. package/src/__tests__/index.test.ts +532 -0
  96. package/src/__tests__/integration/UserProfile.test.tsx +1 -1
  97. package/src/__tests__/rbac/PagePermissionGuard.test.tsx +10 -8
  98. package/src/__tests__/rls-policies.test.ts +3 -2
  99. package/src/assets/app-icons/admin_favicon.svg +462 -0
  100. package/src/assets/app-icons/base_favicon.svg +85 -0
  101. package/src/assets/app-icons/cake_favicon.svg +68 -0
  102. package/src/assets/app-icons/core_favicon.svg +256 -0
  103. package/src/assets/app-icons/gear_favicon.svg +91 -0
  104. package/src/assets/app-icons/index.ts +83 -0
  105. package/src/assets/app-icons/medi_favicon.svg +92 -0
  106. package/src/assets/app-icons/mint_favicon.svg +83 -0
  107. package/src/assets/app-icons/pace_favicon.svg +49 -0
  108. package/src/assets/app-icons/pump_favicon.svg +68 -0
  109. package/src/assets/app-icons/seed_favicon.svg +91 -0
  110. package/src/assets/app-icons/team_favicon.svg +67 -0
  111. package/src/assets/app-icons/trac_favicon.svg +112 -0
  112. package/src/assets/app-icons/trip_favicon.svg +102 -0
  113. package/src/components/AddressField/AddressField.test.tsx +378 -3
  114. package/src/components/AddressField/AddressField.tsx +2 -2
  115. package/src/components/AddressField/types.ts +2 -2
  116. package/src/components/Alert/Alert.test.tsx +35 -25
  117. package/src/components/Alert/Alert.tsx +8 -8
  118. package/src/components/AppSwitcher/AppSwitcher.test.tsx +1250 -0
  119. package/src/components/AppSwitcher/AppSwitcher.tsx +315 -0
  120. package/src/components/Avatar/Avatar.test.tsx +11 -1
  121. package/src/components/Avatar/Avatar.tsx +3 -2
  122. package/src/components/Badge/Badge.test.tsx +11 -1
  123. package/src/components/Button/Button.test.tsx +13 -3
  124. package/src/components/Calendar/Calendar.test.tsx +523 -131
  125. package/src/components/Calendar/Calendar.tsx +107 -488
  126. package/src/components/Card/Card.test.tsx +220 -249
  127. package/src/components/Checkbox/Checkbox.test.tsx +58 -174
  128. package/src/components/ContextSelector/ContextSelector.tsx +3 -3
  129. package/src/components/ContextSelector/__tests__/ContextSelector.test.tsx +360 -0
  130. package/src/components/DataTable/DataTable.tsx +2 -2
  131. package/src/components/DataTable/__tests__/DataTable.comprehensive.test.tsx +1 -1
  132. package/src/components/DataTable/__tests__/DataTable.export.test.tsx +2 -2
  133. package/src/components/DataTable/__tests__/DataTable.grouping-aggregation.test.tsx +1 -1
  134. package/src/components/DataTable/__tests__/DataTable.select-label-display.test.tsx +485 -0
  135. package/src/components/DataTable/__tests__/DataTable.test.tsx +2 -2
  136. package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +1 -1
  137. package/src/components/DataTable/__tests__/DataTableCore.test.tsx +76 -580
  138. package/src/components/DataTable/__tests__/README.md +1 -1
  139. package/src/components/DataTable/__tests__/a11y.basic.test.tsx +1 -1
  140. package/src/components/DataTable/__tests__/keyboard.test.tsx +1 -1
  141. package/src/components/DataTable/__tests__/pagination.modes.test.tsx +1 -3
  142. package/src/components/DataTable/__tests__/ssr.strict-mode.test.tsx +0 -6
  143. package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +14 -6
  144. package/src/components/DataTable/components/ActionButtons.tsx +9 -4
  145. package/src/components/DataTable/components/BulkOperationsDropdown.tsx +3 -3
  146. package/src/components/DataTable/components/ColumnFilter.tsx +2 -7
  147. package/src/components/DataTable/components/DataTableCore.tsx +44 -52
  148. package/src/components/DataTable/components/DataTableLayout.tsx +37 -26
  149. package/src/components/DataTable/components/DataTableModals.tsx +118 -30
  150. package/src/components/DataTable/components/DataTableToolbar.tsx +2 -2
  151. package/src/components/DataTable/components/EditFields.tsx +6 -47
  152. package/src/components/DataTable/components/EditableRow.tsx +8 -8
  153. package/src/components/DataTable/components/EmptyState.tsx +6 -3
  154. package/src/components/DataTable/components/FilterRow.tsx +18 -11
  155. package/src/components/DataTable/components/GroupingDropdown.tsx +0 -1
  156. package/src/components/DataTable/components/ImportModal.tsx +305 -133
  157. package/src/components/DataTable/components/LoadingState.tsx +2 -2
  158. package/src/components/DataTable/components/PaginationControls.tsx +0 -4
  159. package/src/components/DataTable/components/RowComponent.tsx +42 -22
  160. package/src/components/DataTable/components/UnifiedTableBody.tsx +52 -12
  161. package/src/components/DataTable/components/__tests__/AccessDeniedPage.test.tsx +51 -463
  162. package/src/components/DataTable/components/__tests__/ActionButtons.test.tsx +122 -116
  163. package/src/components/DataTable/components/__tests__/BulkOperationsDropdown.test.tsx +40 -68
  164. package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +9 -137
  165. package/src/components/DataTable/components/__tests__/ColumnVisibilityDropdown.test.tsx +57 -17
  166. package/src/components/DataTable/components/__tests__/DataTableCore.test.tsx +792 -0
  167. package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +24 -65
  168. package/src/components/DataTable/components/__tests__/DataTableLayout.test.tsx +467 -0
  169. package/src/components/DataTable/components/__tests__/DataTableModals.test.tsx +8 -125
  170. package/src/components/DataTable/components/__tests__/DataTableToolbar.test.tsx +528 -56
  171. package/src/components/DataTable/components/__tests__/EditFields.test.tsx +526 -0
  172. package/src/components/DataTable/components/__tests__/EditableRow.test.tsx +1 -68
  173. package/src/components/DataTable/components/__tests__/EmptyState.test.tsx +8 -25
  174. package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +3 -62
  175. package/src/components/DataTable/components/__tests__/GroupingDropdown.test.tsx +9 -14
  176. package/src/components/DataTable/components/__tests__/ImportModal.test.tsx +50 -186
  177. package/src/components/DataTable/components/__tests__/LoadingState.test.tsx +39 -97
  178. package/src/components/DataTable/components/__tests__/PaginationControls.test.tsx +13 -103
  179. package/src/components/DataTable/components/__tests__/RowComponent.test.tsx +629 -0
  180. package/src/components/DataTable/components/__tests__/SortIndicator.test.tsx +135 -0
  181. package/src/components/DataTable/components/__tests__/UnifiedTableBody.test.tsx +31 -171
  182. package/src/components/DataTable/components/__tests__/cellValueUtils.test.ts +453 -0
  183. package/src/components/DataTable/components/hooks/useImportModalFocus.test.ts +184 -0
  184. package/src/components/DataTable/components/hooks/usePermissionTracking.test.ts +381 -0
  185. package/src/components/DataTable/context/DataTableContext.tsx +9 -10
  186. package/src/components/DataTable/context/__tests__/DataTableContext.test.tsx +12 -26
  187. package/src/components/DataTable/core/ColumnFactory.ts +3 -3
  188. package/src/components/DataTable/core/ColumnManager.ts +0 -1
  189. package/src/components/DataTable/core/DataManager.ts +4 -2
  190. package/src/components/DataTable/core/LocalDataAdapter.ts +1 -1
  191. package/src/components/DataTable/core/PluginRegistry.ts +2 -2
  192. package/src/components/DataTable/core/__tests__/ActionManager.test.ts +114 -2
  193. package/src/components/DataTable/core/__tests__/ColumnFactory.test.ts +103 -5
  194. package/src/components/DataTable/core/__tests__/ColumnManager.test.ts +57 -0
  195. package/src/components/DataTable/core/__tests__/DataManager.test.ts +63 -0
  196. package/src/components/DataTable/core/__tests__/LocalDataAdapter.test.ts +42 -9
  197. package/src/components/DataTable/core/__tests__/PluginRegistry.test.ts +29 -7
  198. package/src/components/DataTable/core/__tests__/StateManager.test.ts +58 -4
  199. package/src/components/DataTable/hooks/__tests__/useColumnOrderPersistence.test.ts +16 -21
  200. package/src/components/DataTable/hooks/__tests__/useColumnVisibilityPersistence.test.ts +93 -4
  201. package/src/components/DataTable/hooks/__tests__/useDataTableConfiguration.test.ts +227 -54
  202. package/src/components/DataTable/hooks/__tests__/useDataTableDataPipeline.test.ts +215 -62
  203. package/src/components/DataTable/hooks/__tests__/useDataTablePermissions.test.ts +217 -39
  204. package/src/components/DataTable/hooks/__tests__/useDataTableState.test.ts +101 -6
  205. package/src/components/DataTable/hooks/__tests__/useEffectiveColumnOrder.test.ts +157 -27
  206. package/src/components/DataTable/hooks/__tests__/useHierarchicalState.test.ts +80 -0
  207. package/src/components/DataTable/hooks/__tests__/useKeyboardNavigation.test.ts +787 -0
  208. package/src/components/DataTable/hooks/__tests__/useServerSideDataEffect.test.ts +258 -0
  209. package/src/components/DataTable/hooks/__tests__/useTableColumns.test.ts +298 -23
  210. package/src/components/DataTable/hooks/__tests__/useTableHandlers.test.ts +440 -0
  211. package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +12 -9
  212. package/src/components/DataTable/hooks/useColumnVisibilityPersistence.ts +12 -9
  213. package/src/components/DataTable/hooks/useDataTableConfiguration.ts +1 -1
  214. package/src/components/DataTable/hooks/useDataTablePermissions.ts +11 -22
  215. package/src/components/DataTable/hooks/useDataTableState.ts +20 -24
  216. package/src/components/DataTable/hooks/useKeyboardNavigation.ts +5 -5
  217. package/src/components/DataTable/hooks/useServerSideDataEffect.ts +13 -1
  218. package/src/components/DataTable/hooks/useTableColumns.ts +36 -38
  219. package/src/components/DataTable/hooks/useTableHandlers.ts +8 -20
  220. package/src/components/DataTable/index.ts +24 -2
  221. package/src/components/DataTable/types.ts +6 -3
  222. package/src/components/DataTable/utils/__tests__/a11yUtils.test.ts +3 -67
  223. package/src/components/DataTable/utils/__tests__/aggregationUtils.test.ts +288 -0
  224. package/src/components/DataTable/utils/__tests__/errorHandling.test.ts +3 -60
  225. package/src/components/DataTable/utils/__tests__/flexibleImport.test.ts +1 -1
  226. package/src/components/DataTable/utils/__tests__/hierarchicalSorting.test.ts +9 -21
  227. package/src/components/DataTable/utils/__tests__/hierarchicalUtils.test.ts +102 -86
  228. package/src/components/DataTable/utils/__tests__/paginationUtils.test.ts +593 -0
  229. package/src/components/DataTable/utils/__tests__/rowUtils.test.ts +33 -49
  230. package/src/components/DataTable/utils/__tests__/selectFieldUtils.test.ts +208 -0
  231. package/src/components/DataTable/utils/a11yUtils.ts +1 -1
  232. package/src/components/DataTable/utils/aggregationUtils.ts +5 -5
  233. package/src/components/DataTable/utils/errorHandling.ts +3 -1
  234. package/src/components/DataTable/utils/exportUtils.ts +1 -1
  235. package/src/components/DataTable/utils/flexibleImport.ts +2 -2
  236. package/src/components/DataTable/utils/hierarchicalSorting.ts +3 -3
  237. package/src/components/DataTable/utils/paginationUtils.ts +1 -1
  238. package/src/components/DataTable/utils/performanceUtils.ts +1 -1
  239. package/src/components/DataTable/utils/selectFieldUtils.ts +127 -0
  240. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +17 -24
  241. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.tsx +1 -1
  242. package/src/components/DateTimeField/DateTimeField.test.tsx +2 -15
  243. package/src/components/DateTimeField/DateTimeField.tsx +1 -1
  244. package/src/components/Dialog/Dialog.test.tsx +2007 -407
  245. package/src/components/Dialog/Dialog.tsx +97 -192
  246. package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +2 -62
  247. package/src/components/ErrorBoundary/ErrorBoundaryContext.context.ts +17 -0
  248. package/src/components/ErrorBoundary/ErrorBoundaryContext.tsx +2 -45
  249. package/src/components/ErrorBoundary/ErrorBoundaryContext.types.ts +41 -0
  250. package/src/components/ErrorBoundary/index.ts +3 -4
  251. package/src/components/ErrorBoundary/useErrorBoundaryContext.ts +20 -0
  252. package/src/components/FileDisplay/FileDisplay.test.tsx +454 -222
  253. package/src/components/FileDisplay/FileDisplay.tsx +14 -12
  254. package/src/components/FileDisplay/index.tsx +1 -1
  255. package/src/components/FileUpload/FileUpload.test.tsx +54 -18
  256. package/src/components/FileUpload/FileUpload.tsx +10 -7
  257. package/src/components/FileUpload/index.tsx +1 -1
  258. package/src/components/Footer/Footer.test.tsx +33 -114
  259. package/src/components/Form/Form.test.tsx +388 -68
  260. package/src/components/Form/Form.tsx +57 -42
  261. package/src/components/Header/Header.test.tsx +645 -154
  262. package/src/components/Header/Header.tsx +52 -43
  263. package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +35 -76
  264. package/src/components/Input/Input.test.tsx +34 -120
  265. package/src/components/Label/Label.test.tsx +47 -46
  266. package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +9 -12
  267. package/src/components/LoginForm/LoginForm.test.tsx +0 -1
  268. package/src/components/NavigationMenu/NavigationMenu.test.tsx +1399 -82
  269. package/src/components/NavigationMenu/NavigationMenu.tsx +2 -2
  270. package/src/components/NavigationMenu/__tests__/useNavigationFiltering.test.ts +1934 -0
  271. package/src/components/NavigationMenu/useNavigationFiltering.ts +5 -15
  272. package/src/components/PaceAppLayout/PaceAppLayout.edge-cases.test.tsx +1307 -0
  273. package/src/components/PaceAppLayout/PaceAppLayout.integration.test.tsx +47 -46
  274. package/src/components/PaceAppLayout/PaceAppLayout.performance.test.tsx +81 -38
  275. package/src/components/PaceAppLayout/PaceAppLayout.security.test.tsx +87 -66
  276. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +245 -39
  277. package/src/components/PaceAppLayout/PaceAppLayout.tsx +14 -20
  278. package/src/components/PaceAppLayout/README.md +0 -9
  279. package/src/components/PaceAppLayout/test-setup.tsx +15 -9
  280. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +759 -3
  281. package/src/components/PaceLoginPage/PaceLoginPage.tsx +2 -3
  282. package/src/components/PasswordChange/PasswordChangeForm.test.tsx +1 -1
  283. package/src/components/Progress/Progress.test.tsx +127 -1
  284. package/src/components/ProtectedRoute/ProtectedRoute.test.tsx +1196 -4
  285. package/src/components/ProtectedRoute/ProtectedRoute.tsx +24 -6
  286. package/src/components/PublicLayout/PublicLayout.test.tsx +1435 -14
  287. package/src/components/PublicLayout/PublicPageContext.ts +28 -0
  288. package/src/components/PublicLayout/PublicPageLayout.tsx +6 -6
  289. package/src/components/PublicLayout/PublicPageProvider.tsx +2 -41
  290. package/src/components/PublicLayout/usePublicPageContext.ts +36 -0
  291. package/src/components/Select/Select.test.tsx +46 -9
  292. package/src/components/Select/Select.tsx +31 -24
  293. package/src/components/Select/__tests__/context.test.tsx +56 -0
  294. package/src/components/Select/hooks/__tests__/useSelectEvents.test.ts +279 -0
  295. package/src/components/Select/hooks/__tests__/useSelectSearch.test.tsx +295 -0
  296. package/src/components/Select/hooks/__tests__/useSelectState.test.ts +254 -0
  297. package/src/components/Select/hooks/useSelectState.ts +16 -16
  298. package/src/components/Select/types.ts +3 -0
  299. package/src/components/Select/utils/__tests__/text.test.tsx +104 -0
  300. package/src/components/SessionRestorationLoader/SessionRestorationLoader.test.tsx +28 -112
  301. package/src/components/Switch/Switch.test.tsx +57 -153
  302. package/src/components/Table/Table.test.tsx +47 -317
  303. package/src/components/Tabs/Tabs.tsx +3 -3
  304. package/src/components/Textarea/Textarea.test.tsx +11 -38
  305. package/src/components/Toast/Toast.test.tsx +78 -569
  306. package/src/components/Tooltip/Tooltip.test.tsx +4 -21
  307. package/src/components/UserMenu/UserMenu.test.tsx +1 -21
  308. package/src/components/UserMenu/UserMenu.tsx +3 -6
  309. package/src/components/__tests__/index.test.ts +346 -0
  310. package/src/components/index.ts +12 -1
  311. package/src/constants/__tests__/performance.test.ts +91 -0
  312. package/src/hooks/__tests__/ServiceHooks.test.tsx +239 -129
  313. package/src/hooks/__tests__/hooks.integration.test.tsx +4 -3
  314. package/src/hooks/__tests__/useApiFetch.unit.test.ts +1 -1
  315. package/src/hooks/__tests__/useAppConfig.unit.test.ts +88 -29
  316. package/src/hooks/__tests__/useComponentPerformance.unit.test.tsx +282 -98
  317. package/src/hooks/__tests__/useDataTablePerformance.unit.test.ts +53 -109
  318. package/src/hooks/__tests__/useDataTableState.test.ts +143 -49
  319. package/src/hooks/__tests__/useDebounce.unit.test.ts +94 -19
  320. package/src/hooks/__tests__/useEvents.unit.test.ts +100 -125
  321. package/src/hooks/__tests__/useFileDisplay.test.ts +540 -0
  322. package/src/hooks/__tests__/useFileDisplay.unit.test.ts +1 -4
  323. package/src/hooks/__tests__/useFileUrl.unit.test.ts +27 -247
  324. package/src/hooks/__tests__/useFileUrlCache.test.ts +246 -56
  325. package/src/hooks/__tests__/useFocusManagement.unit.test.ts +442 -68
  326. package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +345 -560
  327. package/src/hooks/__tests__/useFormDialog.test.ts +51 -222
  328. package/src/hooks/__tests__/useInactivityTracker.unit.test.ts +1 -1
  329. package/src/hooks/__tests__/useKeyboardShortcuts.unit.test.ts +1 -4
  330. package/src/hooks/__tests__/useOrganisationPermissions.unit.test.tsx +0 -1
  331. package/src/hooks/__tests__/usePerformanceMonitor.unit.test.ts +1 -1
  332. package/src/hooks/__tests__/usePermissionCache.test.ts +506 -0
  333. package/src/hooks/__tests__/usePreventTabReload.test.ts +255 -36
  334. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +17 -8
  335. package/src/hooks/__tests__/usePublicEvent.test.ts +16 -24
  336. package/src/hooks/__tests__/usePublicEvent.unit.test.ts +12 -4
  337. package/src/hooks/__tests__/usePublicFileDisplay.test.ts +3 -6
  338. package/src/hooks/__tests__/usePublicRouteParams.unit.test.ts +1 -2
  339. package/src/hooks/__tests__/useQueryCache.test.ts +313 -66
  340. package/src/hooks/__tests__/useSessionDraft.test.ts +496 -103
  341. package/src/hooks/__tests__/useSessionRestoration.unit.test.tsx +2 -2
  342. package/src/hooks/__tests__/useStorage.unit.test.ts +72 -102
  343. package/src/hooks/__tests__/useToast.test.ts +413 -0
  344. package/src/hooks/__tests__/useToast.unit.test.tsx +1 -1
  345. package/src/hooks/__tests__/useZodForm.unit.test.tsx +175 -21
  346. package/src/hooks/index.ts +13 -1
  347. package/src/hooks/public/usePublicEvent.test.ts +304 -0
  348. package/src/hooks/public/usePublicEvent.ts +11 -11
  349. package/src/hooks/public/usePublicEventLogo.test.ts +655 -120
  350. package/src/hooks/public/usePublicEventLogo.ts +2 -2
  351. package/src/hooks/public/usePublicFileDisplay.test.ts +723 -0
  352. package/src/hooks/public/usePublicFileDisplay.ts +79 -49
  353. package/src/hooks/public/usePublicRouteParams.test.ts +595 -0
  354. package/src/hooks/public/usePublicRouteParams.ts +2 -2
  355. package/src/hooks/services/useAuthService.ts +1 -1
  356. package/src/hooks/services/useEventService.ts +1 -1
  357. package/src/hooks/useAccessibleApps.test.ts +400 -0
  358. package/src/hooks/useAccessibleApps.ts +264 -0
  359. package/src/hooks/useAddressAutocomplete.test.ts +165 -42
  360. package/src/hooks/useAddressAutocomplete.ts +41 -28
  361. package/src/hooks/useAppConfig.ts +13 -3
  362. package/src/hooks/useDataTablePerformance.ts +13 -12
  363. package/src/hooks/useDataTableState.ts +5 -5
  364. package/src/hooks/useEventTheme.test.ts +66 -17
  365. package/src/hooks/useEventTheme.ts +1 -1
  366. package/src/hooks/useEvents.ts +8 -1
  367. package/src/hooks/useFileDisplay.ts +66 -33
  368. package/src/hooks/useFileReference.test.ts +365 -87
  369. package/src/hooks/useFileReference.ts +2 -6
  370. package/src/hooks/useFileUrlCache.ts +4 -1
  371. package/src/hooks/useFormDialog.ts +2 -2
  372. package/src/hooks/useInactivityTracker.ts +3 -3
  373. package/src/hooks/useOrganisationPermissions.test.ts +1 -2
  374. package/src/hooks/useOrganisationPermissions.ts +1 -4
  375. package/src/hooks/useOrganisationSecurity.test.ts +1 -30
  376. package/src/hooks/useOrganisationSecurity.ts +3 -3
  377. package/src/hooks/useOrganisations.ts +1 -1
  378. package/src/hooks/usePerformanceMonitor.ts +1 -1
  379. package/src/hooks/usePermissionCache.ts +2 -6
  380. package/src/hooks/useQueryCache.ts +7 -7
  381. package/src/hooks/useSessionDraft.ts +14 -11
  382. package/src/hooks/useSessionRestoration.ts +1 -1
  383. package/src/hooks/useStorage.ts +75 -40
  384. package/src/hooks/useToast.ts +2 -2
  385. package/src/hooks/useZodForm.ts +3 -3
  386. package/src/icons/__tests__/index.test.ts +133 -0
  387. package/src/icons/index.ts +1 -1
  388. package/src/index.ts +43 -4
  389. package/src/providers/OrganisationProvider.test.tsx +40 -0
  390. package/src/providers/OrganisationProvider.tsx +5 -5
  391. package/src/providers/UnifiedAuthProvider.smoke.test.tsx +7 -12
  392. package/src/providers/__tests__/AuthProvider.test.tsx +22 -91
  393. package/src/providers/__tests__/EventProvider.test.tsx +16 -80
  394. package/src/providers/__tests__/InactivityProvider.test.tsx +29 -173
  395. package/src/providers/__tests__/OrganisationProvider.test.tsx +4 -5
  396. package/src/providers/__tests__/OrganisationProvider.wrapper.test.tsx +591 -0
  397. package/src/providers/__tests__/ProviderLifecycle.test.tsx +80 -196
  398. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +40 -133
  399. package/src/providers/__tests__/index.test.ts +138 -0
  400. package/src/providers/services/AuthServiceContext.ts +27 -0
  401. package/src/providers/services/AuthServiceProvider.tsx +81 -20
  402. package/src/providers/services/EventServiceContext.ts +25 -0
  403. package/src/providers/services/EventServiceProvider.tsx +11 -20
  404. package/src/providers/services/InactivityServiceContext.ts +25 -0
  405. package/src/providers/services/InactivityServiceProvider.tsx +7 -17
  406. package/src/providers/services/OrganisationServiceContext.ts +25 -0
  407. package/src/providers/services/OrganisationServiceProvider.tsx +7 -17
  408. package/src/providers/services/UnifiedAuthContext.ts +99 -0
  409. package/src/providers/services/UnifiedAuthProvider.test.tsx +212 -0
  410. package/src/providers/services/UnifiedAuthProvider.tsx +38 -143
  411. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +61 -95
  412. package/src/providers/services/__tests__/AuthServiceProvider.test.tsx +638 -0
  413. package/src/providers/services/__tests__/EventServiceProvider.test.tsx +839 -0
  414. package/src/providers/services/__tests__/InactivityServiceProvider.test.tsx +662 -0
  415. package/src/providers/services/__tests__/OrganisationServiceProvider.test.tsx +440 -0
  416. package/src/providers/services/__tests__/UnifiedAuthProvider.advanced.test.tsx +435 -0
  417. package/src/providers/services/__tests__/UnifiedAuthProvider.appId.test.tsx +408 -0
  418. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +55 -48
  419. package/src/providers/services/__tests__/contexts.test.tsx +281 -0
  420. package/src/providers/services/__tests__/useUnifiedAuth.test.tsx +251 -0
  421. package/src/providers/services/useUnifiedAuth.ts +29 -0
  422. package/src/rbac/README.md +5 -5
  423. package/src/rbac/__tests__/adapters.comprehensive.test.tsx +9 -14
  424. package/src/rbac/__tests__/audit-batched.test.ts +550 -0
  425. package/src/rbac/__tests__/auth-rbac-security.integration.test.tsx +1 -14
  426. package/src/rbac/__tests__/auth-rbac.e2e.test.tsx +43 -12
  427. package/src/rbac/__tests__/cache-invalidation.test.ts +8 -14
  428. package/src/rbac/__tests__/engine.comprehensive.test.ts +2 -7
  429. package/src/rbac/__tests__/index.test.ts +107 -0
  430. package/src/rbac/__tests__/performance.test.ts +451 -0
  431. package/src/rbac/__tests__/rbac-core.test.tsx +2 -2
  432. package/src/rbac/__tests__/rbac-engine-core-logic.test.ts +0 -5
  433. package/src/rbac/__tests__/rbac-engine-simplified.test.ts +1 -7
  434. package/src/rbac/__tests__/rbac-functions.test.ts +0 -1
  435. package/src/rbac/__tests__/rbac-integration.test.ts +0 -1
  436. package/src/rbac/__tests__/scenarios.user-role.test.tsx +21 -32
  437. package/src/rbac/adapters.test.tsx +654 -0
  438. package/src/rbac/adapters.tsx +24 -9
  439. package/src/rbac/api.test.ts +13 -217
  440. package/src/rbac/api.ts +85 -16
  441. package/src/rbac/audit-batched.ts +5 -4
  442. package/src/rbac/audit.test.ts +225 -28
  443. package/src/rbac/audit.ts +22 -17
  444. package/src/rbac/cache-invalidation.ts +18 -15
  445. package/src/rbac/cache.test.ts +123 -63
  446. package/src/rbac/cache.ts +3 -4
  447. package/src/rbac/components/AccessDenied.tsx +20 -18
  448. package/src/rbac/components/NavigationGuard.tsx +10 -8
  449. package/src/rbac/components/PagePermissionGuard.tsx +27 -25
  450. package/src/rbac/components/__tests__/AccessDenied.test.tsx +324 -0
  451. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +242 -71
  452. package/src/rbac/components/__tests__/PagePermissionGuard.performance.test.tsx +20 -37
  453. package/src/rbac/components/__tests__/PagePermissionGuard.race-condition.test.tsx +18 -17
  454. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +452 -129
  455. package/src/rbac/components/__tests__/PagePermissionGuard.verification.test.tsx +14 -13
  456. package/src/rbac/config.test.ts +131 -48
  457. package/src/rbac/config.ts +11 -8
  458. package/src/rbac/docs/event-based-apps.md +26 -13
  459. package/src/rbac/engine.test.ts +496 -146
  460. package/src/rbac/engine.ts +53 -13
  461. package/src/rbac/errors.test.ts +99 -87
  462. package/src/rbac/eslint-rules.js +2 -2
  463. package/src/rbac/hooks/__tests__/usePermissions.integration.test.ts +0 -5
  464. package/src/rbac/hooks/__tests__/useSecureSupabase.test.ts +601 -1
  465. package/src/rbac/hooks/permissions/__tests__/useAccessLevel.test.ts +622 -0
  466. package/src/rbac/hooks/permissions/__tests__/useCan.test.ts +798 -0
  467. package/src/rbac/hooks/permissions/__tests__/useMultiplePermissions.test.ts +843 -0
  468. package/src/rbac/hooks/permissions/__tests__/usePermissions.test.ts +545 -0
  469. package/src/rbac/hooks/permissions/useAccessLevel.ts +7 -8
  470. package/src/rbac/hooks/permissions/useCan.ts +12 -10
  471. package/src/rbac/hooks/permissions/useMultiplePermissions.ts +57 -8
  472. package/src/rbac/hooks/permissions/usePermissions.ts +15 -14
  473. package/src/rbac/hooks/useCan.test.ts +319 -3
  474. package/src/rbac/hooks/usePermissions.test.ts +426 -0
  475. package/src/rbac/hooks/usePermissions.ts +5 -7
  476. package/src/rbac/hooks/useRBAC.test.ts +1669 -2
  477. package/src/rbac/hooks/useRBAC.ts +7 -11
  478. package/src/rbac/hooks/useResolvedScope.test.ts +442 -5
  479. package/src/rbac/hooks/useResolvedScope.ts +4 -1
  480. package/src/rbac/hooks/useResourcePermissions.test.ts +538 -1
  481. package/src/rbac/hooks/useResourcePermissions.ts +9 -7
  482. package/src/rbac/hooks/useRoleManagement.test.ts +659 -1
  483. package/src/rbac/hooks/useRoleManagement.ts +16 -12
  484. package/src/rbac/hooks/useSecureSupabase.ts +11 -12
  485. package/src/rbac/index.ts +32 -32
  486. package/src/rbac/permissions.test.ts +149 -68
  487. package/src/rbac/permissions.ts +0 -3
  488. package/src/rbac/request-deduplication.test.ts +347 -0
  489. package/src/rbac/secureClient.test.ts +112 -159
  490. package/src/rbac/secureClient.ts +46 -26
  491. package/src/rbac/security.test.ts +125 -44
  492. package/src/rbac/security.ts +7 -6
  493. package/src/rbac/types.test.ts +236 -0
  494. package/src/rbac/types.ts +7 -5
  495. package/src/rbac/utils/__tests__/clientSecurity.test.ts +192 -0
  496. package/src/rbac/utils/__tests__/contextValidator.test.ts +1 -3
  497. package/src/rbac/utils/__tests__/deep-equal.test.ts +23 -0
  498. package/src/rbac/utils/__tests__/eventContext.test.ts +10 -57
  499. package/src/rbac/utils/clientSecurity.ts +6 -4
  500. package/src/rbac/utils/contextValidator.ts +1 -2
  501. package/src/rbac/utils/eventContext.ts +2 -2
  502. package/src/services/AuthService.ts +13 -11
  503. package/src/services/EventService.ts +4 -5
  504. package/src/services/OrganisationService.ts +13 -30
  505. package/src/services/__tests__/AuthService.edge-cases.test.ts +746 -0
  506. package/src/services/__tests__/AuthService.restoreSession.test.ts +23 -3
  507. package/src/services/__tests__/AuthService.test.ts +4 -8
  508. package/src/services/__tests__/BaseService.edge-cases.test.ts +506 -0
  509. package/src/services/__tests__/BaseService.test.ts +49 -0
  510. package/src/services/__tests__/EventService.edge-cases.test.ts +633 -0
  511. package/src/services/__tests__/EventService.eventColours.test.ts +0 -12
  512. package/src/services/__tests__/EventService.test.ts +0 -7
  513. package/src/services/__tests__/InactivityService.edge-cases.test.ts +492 -0
  514. package/src/services/__tests__/InactivityService.lifecycle.test.ts +0 -5
  515. package/src/services/__tests__/OrganisationService.edge-cases.test.ts +633 -0
  516. package/src/services/base/BaseService.test.ts +214 -0
  517. package/src/services/interfaces/IOrganisationService.ts +0 -1
  518. package/src/services/interfaces/__tests__/IAuthService.test.ts +190 -0
  519. package/src/services/interfaces/__tests__/IEventService.test.ts +176 -0
  520. package/src/services/interfaces/__tests__/IInactivityService.test.ts +183 -0
  521. package/src/services/interfaces/__tests__/IOrganisationService.test.ts +207 -0
  522. package/src/styles/core.css +1 -0
  523. package/src/theming/__tests__/runtime.test.ts +29 -94
  524. package/src/theming/parseEventColours.ts +18 -9
  525. package/src/theming/runtime.ts +1 -5
  526. package/src/types/__tests__/core.test.ts +397 -0
  527. package/src/types/__tests__/database-generated.test.ts +78 -0
  528. package/src/types/__tests__/file-reference.test.ts +270 -366
  529. package/src/types/__tests__/guards.test.ts +26 -26
  530. package/src/types/__tests__/index.test.ts +265 -0
  531. package/src/types/__tests__/type-validation.test.ts +3 -3
  532. package/src/types/__tests__/validation.test.ts +0 -2
  533. package/src/types/auth.ts +0 -1
  534. package/src/types/database.generated.ts +9 -9
  535. package/src/types/event.ts +1 -1
  536. package/src/types/rpc-responses.ts +33 -0
  537. package/src/types/supabase.ts +1 -2
  538. package/src/types/vitest-globals.d.ts +1 -1
  539. package/src/utils/__tests__/bundleAnalysis.unit.test.ts +64 -77
  540. package/src/utils/__tests__/dynamicUtils.unit.test.ts +13 -0
  541. package/src/utils/__tests__/formatDate.unit.test.ts +1 -1
  542. package/src/utils/__tests__/lazyLoad.unit.test.tsx +0 -1
  543. package/src/utils/__tests__/logger.unit.test.ts +1 -1
  544. package/src/utils/__tests__/performanceBenchmark.test.ts +1 -2
  545. package/src/utils/__tests__/performanceBudgets.unit.test.ts +48 -13
  546. package/src/utils/__tests__/request-deduplication.test.ts +349 -0
  547. package/src/utils/__tests__/secureDataAccess.unit.test.ts +0 -1
  548. package/src/utils/__tests__/timezone.test.ts +1 -1
  549. package/src/utils/__tests__/validation.unit.test.ts +1 -2
  550. package/src/utils/__tests__/validationUtils.unit.test.ts +1 -1
  551. package/src/utils/app/appConfig.test.ts +235 -0
  552. package/src/utils/app/appIdResolver.test.ts +188 -20
  553. package/src/utils/app/appNameResolver.test.ts +18 -10
  554. package/src/utils/app/appNameResolver.ts +11 -9
  555. package/src/utils/app/appPortMap.test.ts +125 -0
  556. package/src/utils/app/appPortMap.ts +51 -0
  557. package/src/utils/app/buildAppUrl.test.ts +273 -0
  558. package/src/utils/app/buildAppUrl.ts +114 -0
  559. package/src/utils/audit/audit.test.ts +354 -39
  560. package/src/utils/context/organisationContext.test.ts +10 -4
  561. package/src/utils/context/organisationContext.ts +5 -5
  562. package/src/utils/context/sessionTracking.test.ts +354 -0
  563. package/src/utils/core/__tests__/cn.test.ts +66 -0
  564. package/src/utils/core/__tests__/debugLogger.test.ts +113 -0
  565. package/src/utils/core/__tests__/logger.test.ts +217 -0
  566. package/src/utils/core/debugLogger.ts +15 -8
  567. package/src/utils/core/logger.ts +20 -16
  568. package/src/utils/device/deviceFingerprint.test.ts +8 -5
  569. package/src/utils/device/deviceFingerprint.ts +3 -3
  570. package/src/utils/dynamic/__tests__/dynamicUtils.test.ts +185 -0
  571. package/src/utils/dynamic/__tests__/lazyLoad.test.tsx +156 -0
  572. package/src/utils/dynamic/createLazyComponent.tsx +38 -0
  573. package/src/utils/dynamic/dynamicUtils.ts +6 -6
  574. package/src/utils/dynamic/lazyLoad.tsx +8 -36
  575. package/src/utils/dynamic/papaparseLoader.ts +7 -0
  576. package/src/utils/file-reference/__tests__/file-reference.test.ts +583 -145
  577. package/src/utils/file-reference/index.ts +0 -1
  578. package/src/utils/formatting/formatDate.test.ts +22 -148
  579. package/src/utils/formatting/formatDateTime.test.ts +41 -119
  580. package/src/utils/formatting/formatDateTimeTimezone.test.ts +40 -84
  581. package/src/utils/formatting/formatNumber.test.ts +259 -0
  582. package/src/utils/formatting/formatTime.test.ts +36 -128
  583. package/src/utils/formatting/formatting.ts +1 -1
  584. package/src/utils/google-places/googlePlacesUtils.test.ts +72 -3
  585. package/src/utils/google-places/googlePlacesUtils.ts +15 -2
  586. package/src/utils/google-places/loadGoogleMapsScript.test.ts +58 -1
  587. package/src/utils/google-places/loadGoogleMapsScript.ts +2 -1
  588. package/src/utils/index.ts +52 -11
  589. package/src/utils/location/location.test.ts +18 -115
  590. package/src/utils/performance/__tests__/bundleAnalysis.test.ts +148 -0
  591. package/src/utils/performance/__tests__/performanceBenchmark.test.ts +251 -0
  592. package/src/utils/performance/__tests__/performanceBudgets.test.ts +241 -0
  593. package/src/utils/performance/bundleAnalysis.ts +16 -22
  594. package/src/utils/performance/performanceBenchmark.ts +12 -4
  595. package/src/utils/performance/performanceBudgets.ts +9 -6
  596. package/src/utils/permissions/__tests__/permissionTypes.test.ts +149 -0
  597. package/src/utils/permissions/permissionUtils.test.ts +20 -42
  598. package/src/utils/persistence/__tests__/keyDerivation.test.ts +180 -9
  599. package/src/utils/persistence/__tests__/sensitiveFieldDetection.test.ts +164 -16
  600. package/src/utils/persistence/sensitiveFieldDetection.ts +2 -2
  601. package/src/utils/request-deduplication.ts +6 -4
  602. package/src/utils/security/auth-utils.ts +7 -7
  603. package/src/utils/security/secureDataAccess.test.ts +22 -191
  604. package/src/utils/security/secureErrors.test.ts +163 -0
  605. package/src/utils/security/secureStorage.test.ts +156 -0
  606. package/src/utils/security/secureStorage.ts +1 -1
  607. package/src/utils/security/security.test.ts +204 -0
  608. package/src/utils/security/securityMonitor.test.ts +90 -0
  609. package/src/utils/security/securityMonitor.ts +1 -1
  610. package/src/utils/storage/__tests__/config.unit.test.ts +239 -0
  611. package/src/utils/storage/__tests__/index.unit.test.ts +64 -12
  612. package/src/utils/storage/helpers.test.ts +757 -430
  613. package/src/utils/storage/helpers.ts +1 -2
  614. package/src/utils/storage/{index.ts → storageUtils.ts} +1 -36
  615. package/src/utils/storage/types.ts +2 -2
  616. package/src/utils/supabase/createBaseClient.test.ts +201 -0
  617. package/src/utils/supabase/createBaseClient.ts +27 -8
  618. package/src/utils/timezone/timezone.test.ts +25 -43
  619. package/src/utils/validation/__tests__/common.test.ts +115 -0
  620. package/src/utils/validation/__tests__/csrf.test.ts +65 -0
  621. package/src/utils/validation/__tests__/htmlSanitization.unit.test.ts +27 -7
  622. package/src/utils/validation/__tests__/passwordSchema.test.ts +164 -0
  623. package/src/utils/validation/__tests__/schema.test.ts +127 -0
  624. package/src/utils/validation/__tests__/sqlInjectionProtection.test.ts +76 -3
  625. package/src/utils/validation/__tests__/user.test.ts +173 -0
  626. package/src/utils/validation/__tests__/validation.test.ts +197 -0
  627. package/src/utils/validation/__tests__/validationUtils.test.ts +265 -43
  628. package/src/utils/validation/htmlSanitization.ts +27 -31
  629. package/src/utils/validation/schema.ts +6 -3
  630. package/src/utils/validation/sqlInjectionProtection.ts +2 -2
  631. package/src/vite-env.d.ts +6 -0
  632. package/dist/DataTable-DRUIgtUH.d.ts +0 -166
  633. package/dist/UnifiedAuthProvider-7SNDOWYD.js +0 -7
  634. package/dist/audit-MYQXYZFU.js +0 -3
  635. package/dist/chunk-7ILTDCL2.js +0 -80
  636. package/dist/chunk-EF2UGZWY.js +0 -611
  637. package/dist/chunk-FEJLJNWA.js +0 -181
  638. package/dist/chunk-GS5672WG.js +0 -2003
  639. package/dist/chunk-S6ZQKDY6.js +0 -62
  640. package/dist/chunk-Z2FNRKF3.js +0 -994
  641. package/dist/useToast-AyaT-x7p.d.ts +0 -68
  642. package/src/components/DataTable/components/index.ts +0 -16
  643. package/src/components/DataTable/core/index.ts +0 -1
  644. package/src/components/DataTable/hooks/index.ts +0 -13
  645. package/src/components/DataTable/utils/index.ts +0 -9
  646. package/src/components/PublicLayout/index.ts +0 -32
  647. package/src/hooks/__tests__/usePermissionCache.simple.test.ts +0 -192
  648. package/src/hooks/__tests__/usePermissionCache.unit.test.ts +0 -741
  649. package/src/hooks/public/index.ts +0 -36
  650. package/src/hooks/usePermissionCache.test.ts +0 -536
  651. package/src/rbac/__tests__/isSuperAdmin.real.test.ts +0 -82
  652. package/src/rbac/audit-enhanced.ts +0 -384
  653. package/src/rbac/compliance/database-validator.ts +0 -165
  654. package/src/rbac/compliance/index.ts +0 -48
  655. package/src/rbac/compliance/pattern-detector.ts +0 -553
  656. package/src/rbac/compliance/quick-fix-suggestions.ts +0 -209
  657. package/src/rbac/compliance/runtime-compliance.ts +0 -99
  658. package/src/rbac/compliance/setup-validator.ts +0 -131
  659. package/src/rbac/components/index.ts +0 -26
  660. package/src/rbac/hooks/index.ts +0 -34
  661. package/src/rbac/hooks/permissions/index.ts +0 -4
  662. package/src/rbac/hooks/useRBAC.simple.test.ts +0 -95
  663. package/src/rbac/utils/__tests__/eventContext.unit.test.ts +0 -490
  664. package/src/utils/app/appNameResolver.simple.test.ts +0 -212
  665. package/src/utils/google-places/index.ts +0 -26
  666. package/src/utils/location/index.ts +0 -16
  667. package/src/utils/storage/__tests__/helpers.unit.test.ts +0 -332
  668. package/src/utils/timezone/index.ts +0 -17
  669. package/src/utils/validation/index.ts +0 -73
@@ -0,0 +1,532 @@
1
+ /**
2
+ * @file Main Index Barrel File Tests
3
+ * @package @jmruthers/pace-core
4
+ * @module Core/__tests__
5
+ * @since 0.1.0
6
+ *
7
+ * Comprehensive tests for the main barrel file (src/index.ts) ensuring all expected
8
+ * exports are correctly exposed and accessible.
9
+ */
10
+
11
+ import { describe, it, expect } from 'vitest';
12
+ import * as MainExports from '../index';
13
+
14
+ // Following testing standards: use timeout parameter to prevent hanging
15
+ const TEST_TIMEOUT = 10000; // 10 seconds per test
16
+
17
+ describe('Main Index Barrel File Exports', () => {
18
+ describe('Provider Exports', () => {
19
+ it('should export UnifiedAuthProvider', () => {
20
+ expect(MainExports.UnifiedAuthProvider).toBeDefined();
21
+ expect(typeof MainExports.UnifiedAuthProvider).toBe('function');
22
+ }, TEST_TIMEOUT);
23
+
24
+ it('should export useUnifiedAuth hook', () => {
25
+ expect(MainExports.useUnifiedAuth).toBeDefined();
26
+ expect(typeof MainExports.useUnifiedAuth).toBe('function');
27
+ }, TEST_TIMEOUT);
28
+
29
+ it('should export EventServiceProvider', () => {
30
+ expect(MainExports.EventServiceProvider).toBeDefined();
31
+ expect(typeof MainExports.EventServiceProvider).toBe('function');
32
+ }, TEST_TIMEOUT);
33
+
34
+ it('should export OrganisationServiceProvider', () => {
35
+ expect(MainExports.OrganisationServiceProvider).toBeDefined();
36
+ expect(typeof MainExports.OrganisationServiceProvider).toBe('function');
37
+ }, TEST_TIMEOUT);
38
+
39
+ it('should export InactivityServiceProvider', () => {
40
+ expect(MainExports.InactivityServiceProvider).toBeDefined();
41
+ expect(typeof MainExports.InactivityServiceProvider).toBe('function');
42
+ }, TEST_TIMEOUT);
43
+
44
+ it('should export OrganisationProvider', () => {
45
+ expect(MainExports.OrganisationProvider).toBeDefined();
46
+ expect(typeof MainExports.OrganisationProvider).toBe('function');
47
+ }, TEST_TIMEOUT);
48
+ });
49
+
50
+ describe('Hook Exports', () => {
51
+ it('should export useEvents hook', () => {
52
+ expect(MainExports.useEvents).toBeDefined();
53
+ expect(typeof MainExports.useEvents).toBe('function');
54
+ }, TEST_TIMEOUT);
55
+
56
+ it('should export useOrganisations hook', () => {
57
+ expect(MainExports.useOrganisations).toBeDefined();
58
+ expect(typeof MainExports.useOrganisations).toBe('function');
59
+ }, TEST_TIMEOUT);
60
+
61
+ it('should export useEventService hook', () => {
62
+ expect(MainExports.useEventService).toBeDefined();
63
+ expect(typeof MainExports.useEventService).toBe('function');
64
+ }, TEST_TIMEOUT);
65
+
66
+ it('should export useOrganisationService hook', () => {
67
+ expect(MainExports.useOrganisationService).toBeDefined();
68
+ expect(typeof MainExports.useOrganisationService).toBe('function');
69
+ }, TEST_TIMEOUT);
70
+
71
+ it('should export useAuthService hook', () => {
72
+ expect(MainExports.useAuthService).toBeDefined();
73
+ expect(typeof MainExports.useAuthService).toBe('function');
74
+ }, TEST_TIMEOUT);
75
+
76
+ it('should export useInactivityService hook', () => {
77
+ expect(MainExports.useInactivityService).toBeDefined();
78
+ expect(typeof MainExports.useInactivityService).toBe('function');
79
+ }, TEST_TIMEOUT);
80
+
81
+ it('should export useSessionRestoration hook', () => {
82
+ expect(MainExports.useSessionRestoration).toBeDefined();
83
+ expect(typeof MainExports.useSessionRestoration).toBe('function');
84
+ }, TEST_TIMEOUT);
85
+
86
+ it('should export useInactivityTracker hook', () => {
87
+ expect(MainExports.useInactivityTracker).toBeDefined();
88
+ expect(typeof MainExports.useInactivityTracker).toBe('function');
89
+ }, TEST_TIMEOUT);
90
+
91
+ it('should export useSessionTracking hook', () => {
92
+ expect(MainExports.useSessionTracking).toBeDefined();
93
+ expect(typeof MainExports.useSessionTracking).toBe('function');
94
+ }, TEST_TIMEOUT);
95
+
96
+ it('should export useToast hook', () => {
97
+ expect(MainExports.useToast).toBeDefined();
98
+ expect(typeof MainExports.useToast).toBe('function');
99
+ }, TEST_TIMEOUT);
100
+
101
+ it('should export useAppConfig hook', () => {
102
+ expect(MainExports.useAppConfig).toBeDefined();
103
+ expect(typeof MainExports.useAppConfig).toBe('function');
104
+ }, TEST_TIMEOUT);
105
+
106
+ it('should export useEventTheme hook', () => {
107
+ expect(MainExports.useEventTheme).toBeDefined();
108
+ expect(typeof MainExports.useEventTheme).toBe('function');
109
+ }, TEST_TIMEOUT);
110
+
111
+ it('should export useZodForm hook', () => {
112
+ expect(MainExports.useZodForm).toBeDefined();
113
+ expect(typeof MainExports.useZodForm).toBe('function');
114
+ }, TEST_TIMEOUT);
115
+
116
+ it('should export useFormDialog hook', () => {
117
+ expect(MainExports.useFormDialog).toBeDefined();
118
+ expect(typeof MainExports.useFormDialog).toBe('function');
119
+ }, TEST_TIMEOUT);
120
+
121
+ it('should export useOrganisationPermissions hook', () => {
122
+ expect(MainExports.useOrganisationPermissions).toBeDefined();
123
+ expect(typeof MainExports.useOrganisationPermissions).toBe('function');
124
+ }, TEST_TIMEOUT);
125
+
126
+ it('should export useOrganisationSecurity hook', () => {
127
+ expect(MainExports.useOrganisationSecurity).toBeDefined();
128
+ expect(typeof MainExports.useOrganisationSecurity).toBe('function');
129
+ }, TEST_TIMEOUT);
130
+
131
+ it('should export useFileReference hooks', () => {
132
+ expect(MainExports.useFileReference).toBeDefined();
133
+ expect(MainExports.useFileReferenceForRecord).toBeDefined();
134
+ expect(MainExports.useFileReferenceById).toBeDefined();
135
+ expect(MainExports.useFilesByCategory).toBeDefined();
136
+ }, TEST_TIMEOUT);
137
+ });
138
+
139
+ describe('Component Exports', () => {
140
+ it('should export Button component', () => {
141
+ expect(MainExports.Button).toBeDefined();
142
+ // React components can be functions or objects (memoized/forwardRef)
143
+ expect(['function', 'object']).toContain(typeof MainExports.Button);
144
+ }, TEST_TIMEOUT);
145
+
146
+ it('should export Card components', () => {
147
+ expect(MainExports.Card).toBeDefined();
148
+ expect(MainExports.CardHeader).toBeDefined();
149
+ expect(MainExports.CardFooter).toBeDefined();
150
+ expect(MainExports.CardTitle).toBeDefined();
151
+ expect(MainExports.CardDescription).toBeDefined();
152
+ expect(MainExports.CardContent).toBeDefined();
153
+ expect(MainExports.CardActions).toBeDefined();
154
+ }, TEST_TIMEOUT);
155
+
156
+ it('should export Input component', () => {
157
+ expect(MainExports.Input).toBeDefined();
158
+ // React components can be functions or objects (memoized/forwardRef)
159
+ expect(['function', 'object']).toContain(typeof MainExports.Input);
160
+ }, TEST_TIMEOUT);
161
+
162
+ it('should export AddressField component', () => {
163
+ expect(MainExports.AddressField).toBeDefined();
164
+ // React components can be functions or objects (memoized/forwardRef)
165
+ expect(['function', 'object']).toContain(typeof MainExports.AddressField);
166
+ }, TEST_TIMEOUT);
167
+
168
+ it('should export Label component', () => {
169
+ expect(MainExports.Label).toBeDefined();
170
+ // React components can be functions or objects (memoized/forwardRef)
171
+ expect(['function', 'object']).toContain(typeof MainExports.Label);
172
+ }, TEST_TIMEOUT);
173
+
174
+ it('should export Textarea component', () => {
175
+ expect(MainExports.Textarea).toBeDefined();
176
+ // React components can be functions or objects (memoized/forwardRef)
177
+ expect(['function', 'object']).toContain(typeof MainExports.Textarea);
178
+ }, TEST_TIMEOUT);
179
+
180
+ it('should export Alert components', () => {
181
+ expect(MainExports.Alert).toBeDefined();
182
+ expect(MainExports.AlertTitle).toBeDefined();
183
+ expect(MainExports.AlertDescription).toBeDefined();
184
+ }, TEST_TIMEOUT);
185
+
186
+ it('should export Avatar component', () => {
187
+ expect(MainExports.Avatar).toBeDefined();
188
+ // React components can be functions or objects (memoized/forwardRef)
189
+ expect(['function', 'object']).toContain(typeof MainExports.Avatar);
190
+ }, TEST_TIMEOUT);
191
+
192
+ it('should export Badge component', () => {
193
+ expect(MainExports.Badge).toBeDefined();
194
+ // React components can be functions or objects (memoized/forwardRef)
195
+ expect(['function', 'object']).toContain(typeof MainExports.Badge);
196
+ }, TEST_TIMEOUT);
197
+
198
+ it('should export Checkbox component', () => {
199
+ expect(MainExports.Checkbox).toBeDefined();
200
+ // React components can be functions or objects (memoized/forwardRef)
201
+ expect(['function', 'object']).toContain(typeof MainExports.Checkbox);
202
+ }, TEST_TIMEOUT);
203
+
204
+ it('should export Switch component', () => {
205
+ expect(MainExports.Switch).toBeDefined();
206
+ // React components can be functions or objects (memoized/forwardRef)
207
+ expect(['function', 'object']).toContain(typeof MainExports.Switch);
208
+ }, TEST_TIMEOUT);
209
+
210
+ it('should export Progress component', () => {
211
+ expect(MainExports.Progress).toBeDefined();
212
+ // React components can be functions or objects (memoized/forwardRef)
213
+ expect(['function', 'object']).toContain(typeof MainExports.Progress);
214
+ }, TEST_TIMEOUT);
215
+
216
+ it('should export Dialog components', () => {
217
+ expect(MainExports.Dialog).toBeDefined();
218
+ expect(MainExports.DialogPortal).toBeDefined();
219
+ expect(MainExports.DialogTrigger).toBeDefined();
220
+ expect(MainExports.DialogClose).toBeDefined();
221
+ expect(MainExports.DialogContent).toBeDefined();
222
+ expect(MainExports.DialogHeader).toBeDefined();
223
+ expect(MainExports.DialogBody).toBeDefined();
224
+ expect(MainExports.DialogFooter).toBeDefined();
225
+ expect(MainExports.DialogTitle).toBeDefined();
226
+ expect(MainExports.DialogDescription).toBeDefined();
227
+ }, TEST_TIMEOUT);
228
+
229
+ it('should export Select components', () => {
230
+ expect(MainExports.Select).toBeDefined();
231
+ expect(MainExports.SelectGroup).toBeDefined();
232
+ expect(MainExports.SelectValue).toBeDefined();
233
+ expect(MainExports.SelectTrigger).toBeDefined();
234
+ expect(MainExports.SelectContent).toBeDefined();
235
+ expect(MainExports.SelectLabel).toBeDefined();
236
+ expect(MainExports.SelectItem).toBeDefined();
237
+ expect(MainExports.SelectSeparator).toBeDefined();
238
+ }, TEST_TIMEOUT);
239
+
240
+ it('should export Tabs components', () => {
241
+ expect(MainExports.Tabs).toBeDefined();
242
+ expect(MainExports.TabsList).toBeDefined();
243
+ expect(MainExports.TabsTrigger).toBeDefined();
244
+ expect(MainExports.TabsContent).toBeDefined();
245
+ }, TEST_TIMEOUT);
246
+
247
+ it('should export Calendar component', () => {
248
+ expect(MainExports.Calendar).toBeDefined();
249
+ // React components can be functions or objects (memoized/forwardRef)
250
+ expect(['function', 'object']).toContain(typeof MainExports.Calendar);
251
+ }, TEST_TIMEOUT);
252
+
253
+ it('should export Toast components', () => {
254
+ expect(MainExports.Toast).toBeDefined();
255
+ expect(MainExports.Toaster).toBeDefined();
256
+ expect(MainExports.ToastAction).toBeDefined();
257
+ expect(MainExports.ToastProvider).toBeDefined();
258
+ expect(MainExports.ToastViewport).toBeDefined();
259
+ expect(MainExports.ToastTitle).toBeDefined();
260
+ expect(MainExports.ToastDescription).toBeDefined();
261
+ expect(MainExports.ToastClose).toBeDefined();
262
+ }, TEST_TIMEOUT);
263
+
264
+ it('should export Tooltip components', () => {
265
+ expect(MainExports.Tooltip).toBeDefined();
266
+ expect(MainExports.TooltipTrigger).toBeDefined();
267
+ expect(MainExports.TooltipContent).toBeDefined();
268
+ expect(MainExports.TooltipProvider).toBeDefined();
269
+ expect(MainExports.TooltipRoot).toBeDefined();
270
+ }, TEST_TIMEOUT);
271
+
272
+ it('should export DataTable component', () => {
273
+ expect(MainExports.DataTable).toBeDefined();
274
+ // React components can be functions or objects (memoized/forwardRef)
275
+ expect(['function', 'object']).toContain(typeof MainExports.DataTable);
276
+ }, TEST_TIMEOUT);
277
+
278
+ it('should export Form components', () => {
279
+ expect(MainExports.Form).toBeDefined();
280
+ expect(MainExports.FormField).toBeDefined();
281
+ }, TEST_TIMEOUT);
282
+
283
+ it('should export LoginForm component', () => {
284
+ expect(MainExports.LoginForm).toBeDefined();
285
+ // React components can be functions or objects (memoized/forwardRef)
286
+ expect(['function', 'object']).toContain(typeof MainExports.LoginForm);
287
+ }, TEST_TIMEOUT);
288
+
289
+ it('should export Header component', () => {
290
+ expect(MainExports.Header).toBeDefined();
291
+ // React components can be functions or objects (memoized/forwardRef)
292
+ expect(['function', 'object']).toContain(typeof MainExports.Header);
293
+ }, TEST_TIMEOUT);
294
+
295
+ it('should export Footer component', () => {
296
+ expect(MainExports.Footer).toBeDefined();
297
+ // React components can be functions or objects (memoized/forwardRef)
298
+ expect(['function', 'object']).toContain(typeof MainExports.Footer);
299
+ }, TEST_TIMEOUT);
300
+
301
+ it('should export NavigationMenu component', () => {
302
+ expect(MainExports.NavigationMenu).toBeDefined();
303
+ // React components can be functions or objects (memoized/forwardRef)
304
+ expect(['function', 'object']).toContain(typeof MainExports.NavigationMenu);
305
+ }, TEST_TIMEOUT);
306
+
307
+ it('should export UserMenu component', () => {
308
+ expect(MainExports.UserMenu).toBeDefined();
309
+ // React components can be functions or objects (memoized/forwardRef)
310
+ expect(['function', 'object']).toContain(typeof MainExports.UserMenu);
311
+ }, TEST_TIMEOUT);
312
+
313
+ it('should export PaceAppLayout component', () => {
314
+ expect(MainExports.PaceAppLayout).toBeDefined();
315
+ // React components can be functions or objects (memoized/forwardRef)
316
+ expect(['function', 'object']).toContain(typeof MainExports.PaceAppLayout);
317
+ }, TEST_TIMEOUT);
318
+
319
+ it('should export PaceLoginPage component', () => {
320
+ expect(MainExports.PaceLoginPage).toBeDefined();
321
+ // React components can be functions or objects (memoized/forwardRef)
322
+ expect(['function', 'object']).toContain(typeof MainExports.PaceLoginPage);
323
+ }, TEST_TIMEOUT);
324
+
325
+ it('should export ProtectedRoute component', () => {
326
+ expect(MainExports.ProtectedRoute).toBeDefined();
327
+ // React components can be functions or objects (memoized/forwardRef)
328
+ expect(['function', 'object']).toContain(typeof MainExports.ProtectedRoute);
329
+ }, TEST_TIMEOUT);
330
+
331
+ it('should export ErrorBoundary components', () => {
332
+ expect(MainExports.ErrorBoundary).toBeDefined();
333
+ expect(MainExports.ErrorBoundaryProvider).toBeDefined();
334
+ }, TEST_TIMEOUT);
335
+
336
+ it('should export LoadingSpinner component', () => {
337
+ expect(MainExports.LoadingSpinner).toBeDefined();
338
+ // React components can be functions or objects (memoized/forwardRef)
339
+ expect(['function', 'object']).toContain(typeof MainExports.LoadingSpinner);
340
+ }, TEST_TIMEOUT);
341
+
342
+ it('should export SessionRestorationLoader component', () => {
343
+ expect(MainExports.SessionRestorationLoader).toBeDefined();
344
+ // React components can be functions or objects (memoized/forwardRef)
345
+ expect(['function', 'object']).toContain(typeof MainExports.SessionRestorationLoader);
346
+ }, TEST_TIMEOUT);
347
+
348
+ it('should export ContextSelector component', () => {
349
+ expect(MainExports.ContextSelector).toBeDefined();
350
+ // React components can be functions or objects (memoized/forwardRef)
351
+ expect(['function', 'object']).toContain(typeof MainExports.ContextSelector);
352
+ }, TEST_TIMEOUT);
353
+
354
+ it('should export PasswordChangeForm component', () => {
355
+ expect(MainExports.PasswordChangeForm).toBeDefined();
356
+ // React components can be functions or objects (memoized/forwardRef)
357
+ expect(['function', 'object']).toContain(typeof MainExports.PasswordChangeForm);
358
+ }, TEST_TIMEOUT);
359
+
360
+ it('should export FileUpload component', () => {
361
+ expect(MainExports.FileUpload).toBeDefined();
362
+ // React components can be functions or objects (memoized/forwardRef)
363
+ expect(['function', 'object']).toContain(typeof MainExports.FileUpload);
364
+ }, TEST_TIMEOUT);
365
+
366
+ it('should export FileDisplay component', () => {
367
+ expect(MainExports.FileDisplay).toBeDefined();
368
+ // React components can be functions or objects (memoized/forwardRef)
369
+ expect(['function', 'object']).toContain(typeof MainExports.FileDisplay);
370
+ }, TEST_TIMEOUT);
371
+
372
+ it('should export InactivityWarningModal component', () => {
373
+ expect(MainExports.InactivityWarningModal).toBeDefined();
374
+ // React components can be functions or objects (memoized/forwardRef)
375
+ expect(['function', 'object']).toContain(typeof MainExports.InactivityWarningModal);
376
+ }, TEST_TIMEOUT);
377
+
378
+ it('should export Table components', () => {
379
+ expect(MainExports.Table).toBeDefined();
380
+ expect(MainExports.TableHeader).toBeDefined();
381
+ expect(MainExports.TableBody).toBeDefined();
382
+ expect(MainExports.TableCaption).toBeDefined();
383
+ expect(MainExports.TableCell).toBeDefined();
384
+ expect(MainExports.TableFooter).toBeDefined();
385
+ expect(MainExports.TableHead).toBeDefined();
386
+ expect(MainExports.TableRow).toBeDefined();
387
+ }, TEST_TIMEOUT);
388
+ });
389
+
390
+ describe('Utility Function Exports', () => {
391
+ it('should export cn utility', () => {
392
+ expect(MainExports.cn).toBeDefined();
393
+ expect(typeof MainExports.cn).toBe('function');
394
+ }, TEST_TIMEOUT);
395
+
396
+ it('should export app config utilities', () => {
397
+ expect(MainExports.setAppConfig).toBeDefined();
398
+ expect(MainExports.getAppConfig).toBeDefined();
399
+ expect(MainExports.getCurrentAppName).toBeDefined();
400
+ expect(MainExports.getCurrentAppId).toBeDefined();
401
+ }, TEST_TIMEOUT);
402
+
403
+ it('should export createBaseClient utility', () => {
404
+ expect(MainExports.createBaseClient).toBeDefined();
405
+ expect(typeof MainExports.createBaseClient).toBe('function');
406
+ }, TEST_TIMEOUT);
407
+
408
+ it('should export logger utilities', () => {
409
+ expect(MainExports.Logger).toBeDefined();
410
+ expect(MainExports.logger).toBeDefined();
411
+ expect(MainExports.createLogger).toBeDefined();
412
+ expect(MainExports.LogLevel).toBeDefined();
413
+ }, TEST_TIMEOUT);
414
+
415
+ it('should export formatting utilities', () => {
416
+ expect(MainExports.formatDate).toBeDefined();
417
+ expect(MainExports.formatTime).toBeDefined();
418
+ expect(MainExports.formatDateTime).toBeDefined();
419
+ expect(MainExports.formatCurrency).toBeDefined();
420
+ expect(MainExports.formatNumber).toBeDefined();
421
+ expect(MainExports.formatPercent).toBeDefined();
422
+ expect(MainExports.formatCompactNumber).toBeDefined();
423
+ expect(MainExports.formatFileSize).toBeDefined();
424
+ }, TEST_TIMEOUT);
425
+
426
+ it('should export timezone utilities', () => {
427
+ expect(MainExports.formatInTimeZone).toBeDefined();
428
+ expect(MainExports.getTimezoneAbbreviation).toBeDefined();
429
+ expect(MainExports.formatTimeInTimeZone).toBeDefined();
430
+ expect(MainExports.getUserTimeZone).toBeDefined();
431
+ expect(MainExports.toZonedTime).toBeDefined();
432
+ expect(MainExports.fromZonedTime).toBeDefined();
433
+ expect(MainExports.roundToNearestMinutes).toBeDefined();
434
+ expect(MainExports.getTimeZoneDifference).toBeDefined();
435
+ }, TEST_TIMEOUT);
436
+
437
+ it('should export validation schemas', () => {
438
+ expect(MainExports.emailSchema).toBeDefined();
439
+ expect(MainExports.nameSchema).toBeDefined();
440
+ expect(MainExports.phoneSchema).toBeDefined();
441
+ expect(MainExports.urlSchema).toBeDefined();
442
+ expect(MainExports.passwordSchema).toBeDefined();
443
+ }, TEST_TIMEOUT);
444
+
445
+ it('should export sanitization utilities', () => {
446
+ expect(MainExports.sanitizeUserInput).toBeDefined();
447
+ expect(MainExports.sanitizeFormData).toBeDefined();
448
+ expect(MainExports.sanitizeHtml).toBeDefined();
449
+ }, TEST_TIMEOUT);
450
+
451
+ it('should export DataTable utility functions', () => {
452
+ expect(MainExports.exportToCSV).toBeDefined();
453
+ expect(MainExports.exportToCSVWithTableRows).toBeDefined();
454
+ expect(MainExports.generateCSVContent).toBeDefined();
455
+ expect(MainExports.sum).toBeDefined();
456
+ expect(MainExports.average).toBeDefined();
457
+ expect(MainExports.count).toBeDefined();
458
+ expect(MainExports.min).toBeDefined();
459
+ expect(MainExports.max).toBeDefined();
460
+ }, TEST_TIMEOUT);
461
+
462
+ it('should export ColumnFactory', () => {
463
+ expect(MainExports.ColumnFactory).toBeDefined();
464
+ }, TEST_TIMEOUT);
465
+
466
+ it('should export createSecureDataAccess utility', () => {
467
+ expect(MainExports.createSecureDataAccess).toBeDefined();
468
+ expect(typeof MainExports.createSecureDataAccess).toBe('function');
469
+ }, TEST_TIMEOUT);
470
+
471
+ it('should export theming utilities', () => {
472
+ expect(MainExports.parseAndNormalizeEventColours).toBeDefined();
473
+ expect(MainExports.applyPalette).toBeDefined();
474
+ expect(MainExports.clearPalette).toBeDefined();
475
+ }, TEST_TIMEOUT);
476
+ });
477
+
478
+ describe('Type Exports', () => {
479
+ it('should export type definitions', () => {
480
+ // Types are compile-time only, so we verify they exist in the type system
481
+ // by checking that the module exports them (they may be undefined at runtime)
482
+ const exports = Object.keys(MainExports);
483
+ expect(exports.length).toBeGreaterThan(0);
484
+ }, TEST_TIMEOUT);
485
+ });
486
+
487
+ describe('RBAC Exports', () => {
488
+ it('should export RBAC module', () => {
489
+ // RBAC is exported via export * from './rbac'
490
+ // Verify that some expected RBAC exports are present
491
+ // Note: Specific RBAC exports may vary, so we check for common ones
492
+ const exports = Object.keys(MainExports);
493
+ // RBAC exports should be present (exact exports depend on rbac/index.ts)
494
+ expect(exports.length).toBeGreaterThan(50); // Should have many exports including RBAC
495
+ }, TEST_TIMEOUT);
496
+ });
497
+
498
+ describe('Zod Export', () => {
499
+ it('should export zod for schema creation', () => {
500
+ expect(MainExports.z).toBeDefined();
501
+ // zod is an object with many properties, not a function
502
+ expect(typeof MainExports.z).toBe('object');
503
+ }, TEST_TIMEOUT);
504
+ });
505
+
506
+ describe('Export Structure', () => {
507
+ it('should have a substantial number of exports', () => {
508
+ const exports = Object.keys(MainExports);
509
+ // Main index should export many items (components, hooks, utilities, types)
510
+ expect(exports.length).toBeGreaterThan(100);
511
+ }, TEST_TIMEOUT);
512
+
513
+ it('should export functions as functions', () => {
514
+ // Sample check: verify some key exports are functions
515
+ const functionExports = [
516
+ 'Button',
517
+ 'Input',
518
+ 'useUnifiedAuth',
519
+ 'cn',
520
+ 'formatDate'
521
+ ];
522
+
523
+ functionExports.forEach(exportName => {
524
+ if (MainExports[exportName as keyof typeof MainExports]) {
525
+ // React components can be functions or objects (memoized/forwardRef)
526
+ const exportType = typeof MainExports[exportName as keyof typeof MainExports];
527
+ expect(['function', 'object']).toContain(exportType);
528
+ }
529
+ });
530
+ }, TEST_TIMEOUT);
531
+ });
532
+ });
@@ -27,7 +27,7 @@ const UserProfile = ({ userId }: { userId: string }) => {
27
27
  } else {
28
28
  setError('User not found');
29
29
  }
30
- } catch (err) {
30
+ } catch (_err) {
31
31
  setError('Failed to fetch user');
32
32
  } finally {
33
33
  setLoading(false);
@@ -16,7 +16,6 @@ import { render, screen, waitFor, act } from '@testing-library/react';
16
16
  import { vi } from 'vitest';
17
17
  import { PagePermissionGuard } from '../../rbac/components/PagePermissionGuard';
18
18
  import { useUnifiedAuth } from '../../providers';
19
- import { useCan } from '../../rbac/hooks';
20
19
 
21
20
  // Mock the hooks
22
21
  const mockUseUnifiedAuthFn = vi.fn();
@@ -24,12 +23,15 @@ vi.mock('../../providers/services/UnifiedAuthProvider', () => ({
24
23
  useUnifiedAuth: () => mockUseUnifiedAuthFn(),
25
24
  UnifiedAuthProvider: ({ children }: { children: React.ReactNode }) => <>{children}</>,
26
25
  }));
27
- vi.mock('../../rbac/hooks', () => ({
28
- useCan: vi.fn()
26
+ // Mock individual hook file since barrel was removed
27
+ // CRITICAL: Use hoisted mock so vi.mocked() works correctly
28
+ const mockUseCanFn = vi.hoisted(() => vi.fn());
29
+ vi.mock('../../rbac/hooks/usePermissions', () => ({
30
+ useCan: mockUseCanFn
29
31
  }));
30
32
  vi.mock('../../utils/appNameResolver');
31
33
 
32
- const mockUseCan = vi.mocked(useCan);
34
+ // Use the hoisted mock function directly
33
35
 
34
36
  describe('PagePermissionGuard', () => {
35
37
  const mockUser = {
@@ -62,7 +64,7 @@ describe('PagePermissionGuard', () => {
62
64
  // Add other required properties
63
65
  } as any);
64
66
 
65
- mockUseCan.mockReturnValue({
67
+ mockUseCanFn.mockReturnValue({
66
68
  can: false,
67
69
  isLoading: false,
68
70
  error: null,
@@ -90,7 +92,7 @@ describe('PagePermissionGuard', () => {
90
92
  });
91
93
 
92
94
  it('should show protected content when permission is granted', async () => {
93
- mockUseCan.mockReturnValue({
95
+ mockUseCanFn.mockReturnValue({
94
96
  can: true,
95
97
  isLoading: false,
96
98
  error: null,
@@ -115,7 +117,7 @@ describe('PagePermissionGuard', () => {
115
117
 
116
118
  describe('Permission State Transitions', () => {
117
119
  it('should handle permission state changes', async () => {
118
- mockUseCan.mockReturnValue({
120
+ mockUseCanFn.mockReturnValue({
119
121
  can: true,
120
122
  isLoading: false,
121
123
  error: null,
@@ -140,7 +142,7 @@ describe('PagePermissionGuard', () => {
140
142
 
141
143
  describe('Error Handling', () => {
142
144
  it('should handle errors gracefully', async () => {
143
- mockUseCan.mockReturnValue({
145
+ mockUseCanFn.mockReturnValue({
144
146
  can: false,
145
147
  isLoading: false,
146
148
  error: new Error('Permission check failed'),
@@ -187,8 +187,9 @@ describe('RLS Policies - Organisations', () => {
187
187
  expect(error).toBeNull();
188
188
  expect(data).toBeDefined();
189
189
  // Use <= to account for minor timing variations in test environment
190
- // Increase threshold slightly for CI/test environments which may be slower
191
- const adjustedThreshold = PERFORMANCE_THRESHOLD * 1.5; // Allow 50% more time
190
+ // Increase threshold for CI/test environments which may be slower
191
+ // Allow 2x threshold for test environment variability
192
+ const adjustedThreshold = PERFORMANCE_THRESHOLD * 2; // Allow 100% more time for test environments
192
193
  expect(duration).toBeLessThanOrEqual(adjustedThreshold);
193
194
  }, TEST_TIMEOUT);
194
195