@jmruthers/pace-core 0.6.9 → 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 (665) hide show
  1. package/audit-tool/audits/02-project-structure.cjs +62 -0
  2. package/audit-tool/audits/03-architecture.cjs +145 -19
  3. package/audit-tool/audits/04-code-quality.cjs +86 -1
  4. package/audit-tool/audits/06-security-rbac.cjs +109 -11
  5. package/cursor-rules/02-project-structure.mdc +2 -26
  6. package/cursor-rules/05-styling.mdc +84 -6
  7. package/cursor-rules/06-security-rbac.mdc +124 -1
  8. package/dist/{DataTable-SOAFXIWY.js → DataTable-SAXFG4XI.js} +11 -13
  9. package/dist/{AuthService-DmfO5rGS.d.ts → InactivityServiceProvider-DHryoh6K.d.ts} +24 -249
  10. package/dist/UnifiedAuthProvider-BBD2PS3Q.js +7 -0
  11. package/dist/{UnifiedAuthProvider-CKvHP1MK.d.ts → UnifiedAuthProvider-CiBAl9-s.d.ts} +34 -22
  12. package/dist/{api-7P7DI652.js → api-F47QJ7FX.js} +3 -3
  13. package/dist/assets/app-icons/admin_favicon.svg +462 -0
  14. package/dist/assets/app-icons/base_favicon.svg +85 -0
  15. package/dist/assets/app-icons/cake_favicon.svg +68 -0
  16. package/dist/assets/app-icons/core_favicon.svg +256 -0
  17. package/dist/assets/app-icons/gear_favicon.svg +91 -0
  18. package/dist/assets/app-icons/medi_favicon.svg +92 -0
  19. package/dist/assets/app-icons/mint_favicon.svg +83 -0
  20. package/dist/assets/app-icons/pace_favicon.svg +49 -0
  21. package/dist/assets/app-icons/pump_favicon.svg +68 -0
  22. package/dist/assets/app-icons/seed_favicon.svg +91 -0
  23. package/dist/assets/app-icons/team_favicon.svg +67 -0
  24. package/dist/assets/app-icons/trac_favicon.svg +112 -0
  25. package/dist/assets/app-icons/trip_favicon.svg +102 -0
  26. package/dist/audit-Z6ZZBWLU.js +3 -0
  27. package/dist/chunk-3GWSPISD.js +61 -0
  28. package/dist/{chunk-4DDCYDQ3.js → chunk-66R6RLUZ.js} +12 -27
  29. package/dist/{chunk-FYHN4DD5.js → chunk-7YDC7LMU.js} +80 -8
  30. package/dist/{chunk-S7DKJPLT.js → chunk-BCTXBU6U.js} +22 -17
  31. package/dist/{chunk-TTRFSOKR.js → chunk-BTHN5MKC.js} +4 -4
  32. package/dist/{chunk-A3W6LW53.js → chunk-DDMPHZ3D.js} +6 -18
  33. package/dist/{chunk-MPBLMWVR.js → chunk-FBZ7U3ID.js} +140 -92
  34. package/dist/chunk-FN52B75D.js +246 -0
  35. package/dist/{chunk-5W2A3DRC.js → chunk-JJEYZ3DX.js} +5 -4
  36. package/dist/chunk-KPYQWGFQ.js +183 -0
  37. package/dist/{chunk-C7ZQ5O4C.js → chunk-KSNLMI7N.js} +3 -3
  38. package/dist/chunk-KYURMOQM.js +977 -0
  39. package/dist/{chunk-LX6U42O3.js → chunk-LNHFAF4X.js} +160 -58
  40. package/dist/{chunk-J2U36LHD.js → chunk-MPY44PWB.js} +620 -627
  41. package/dist/{chunk-AHU7G2R5.js → chunk-NIU6DPQV.js} +10 -6
  42. package/dist/{chunk-HF6O3O37.js → chunk-RMLY6KB5.js} +1 -1
  43. package/dist/{chunk-6GLLNA6U.js → chunk-SACF5YSM.js} +1 -1
  44. package/dist/{chunk-5HNSDQWH.js → chunk-TFIPNIPE.js} +865 -532
  45. package/dist/{chunk-OJ4SKRSV.js → chunk-UZNAFKGW.js} +25 -5
  46. package/dist/chunk-W46INAVW.js +1216 -0
  47. package/dist/chunk-X5EAU5G7.js +793 -0
  48. package/dist/{chunk-T5CVK4R3.js → chunk-Y4PF6HIM.js} +110 -64
  49. package/dist/components.d.ts +8 -86
  50. package/dist/components.js +21 -55
  51. package/dist/eslint-rules/rules/05-styling.cjs +507 -0
  52. package/dist/eslint-rules/rules/06-security-rbac.cjs +10 -0
  53. package/dist/{event-CW5YB_2p.d.ts → event-WTAQuGcq.d.ts} +1 -1
  54. package/dist/{functions-lBy5L2ry.d.ts → functions-DH45k8ec.d.ts} +1 -1
  55. package/dist/hooks.d.ts +11 -10
  56. package/dist/hooks.js +69 -44
  57. package/dist/index.d.ts +379 -31
  58. package/dist/index.js +46 -32
  59. package/dist/papaparseLoader-WG2UXQ22.js +7 -0
  60. package/dist/providers.d.ts +28 -14
  61. package/dist/providers.js +5 -5
  62. package/dist/rbac/eslint-rules.js +2 -2
  63. package/dist/rbac/index.d.ts +57 -213
  64. package/dist/rbac/index.js +11 -11
  65. package/dist/theming/runtime.d.ts +9 -3
  66. package/dist/theming/runtime.js +2 -2
  67. package/dist/{timezone-0AyangqX.d.ts → timezone-K-ptz3HO.d.ts} +21 -22
  68. package/dist/{types-t9H8qKRw.d.ts → types-BE2sEHKd.d.ts} +1 -1
  69. package/dist/{types-BeoeWV5I.d.ts → types-CvOPXWWZ.d.ts} +6 -5
  70. package/dist/{types-DXstZpNI.d.ts → types-D05dCGma.d.ts} +56 -149
  71. package/dist/types-Dr8sNhER.d.ts +50 -0
  72. package/dist/types.d.ts +4 -4
  73. package/dist/{PublicPageProvider-CIGSujI2.d.ts → usePublicPageContext-vxBlEHO9.d.ts} +294 -151
  74. package/dist/{usePublicRouteParams-DQLrDqDb.d.ts → usePublicRouteParams-G3Ks53mk.d.ts} +7 -6
  75. package/dist/utils.d.ts +300 -136
  76. package/dist/utils.js +42 -41
  77. package/dist/{validation-643vUDZW.d.ts → validation-g5n0hDkh.d.ts} +2 -2
  78. package/docs/api/modules.md +542 -549
  79. package/docs/api-reference/components.md +5 -5
  80. package/docs/implementation-guides/data-tables.md +190 -8
  81. package/docs/rbac/RBAC_CONTRACT.md +0 -12
  82. package/docs/standards/2-project-structure-standards.md +12 -74
  83. package/docs/standards/6-security-rbac-standards.md +222 -7
  84. package/docs/standards/7-api-tech-stack-standards.md +91 -3
  85. package/docs/testing/README.md +10 -0
  86. package/docs/testing/test-setup-for-consumers.md +914 -0
  87. package/eslint-config-pace-core.cjs +4 -0
  88. package/package.json +1 -1
  89. package/scripts/eslint-audit.cjs +110 -11
  90. package/src/__mocks__/lucide-react.ts +0 -2
  91. package/src/__tests__/helpers/__tests__/test-utils.test.tsx +0 -2
  92. package/src/__tests__/index.test.ts +532 -0
  93. package/src/__tests__/integration/UserProfile.test.tsx +1 -1
  94. package/src/__tests__/rbac/PagePermissionGuard.test.tsx +10 -8
  95. package/src/__tests__/rls-policies.test.ts +3 -2
  96. package/src/assets/app-icons/admin_favicon.svg +462 -0
  97. package/src/assets/app-icons/base_favicon.svg +85 -0
  98. package/src/assets/app-icons/cake_favicon.svg +68 -0
  99. package/src/assets/app-icons/core_favicon.svg +256 -0
  100. package/src/assets/app-icons/gear_favicon.svg +91 -0
  101. package/src/assets/app-icons/index.ts +83 -0
  102. package/src/assets/app-icons/medi_favicon.svg +92 -0
  103. package/src/assets/app-icons/mint_favicon.svg +83 -0
  104. package/src/assets/app-icons/pace_favicon.svg +49 -0
  105. package/src/assets/app-icons/pump_favicon.svg +68 -0
  106. package/src/assets/app-icons/seed_favicon.svg +91 -0
  107. package/src/assets/app-icons/team_favicon.svg +67 -0
  108. package/src/assets/app-icons/trac_favicon.svg +112 -0
  109. package/src/assets/app-icons/trip_favicon.svg +102 -0
  110. package/src/components/AddressField/AddressField.test.tsx +378 -3
  111. package/src/components/AddressField/AddressField.tsx +2 -2
  112. package/src/components/AddressField/types.ts +2 -2
  113. package/src/components/Alert/Alert.test.tsx +35 -25
  114. package/src/components/Alert/Alert.tsx +8 -8
  115. package/src/components/AppSwitcher/AppSwitcher.test.tsx +1250 -0
  116. package/src/components/AppSwitcher/AppSwitcher.tsx +315 -0
  117. package/src/components/Avatar/Avatar.test.tsx +11 -1
  118. package/src/components/Avatar/Avatar.tsx +3 -2
  119. package/src/components/Badge/Badge.test.tsx +11 -1
  120. package/src/components/Button/Button.test.tsx +13 -3
  121. package/src/components/Calendar/Calendar.test.tsx +523 -131
  122. package/src/components/Calendar/Calendar.tsx +107 -488
  123. package/src/components/Card/Card.test.tsx +220 -249
  124. package/src/components/Checkbox/Checkbox.test.tsx +58 -174
  125. package/src/components/ContextSelector/ContextSelector.tsx +3 -3
  126. package/src/components/ContextSelector/__tests__/ContextSelector.test.tsx +360 -0
  127. package/src/components/DataTable/DataTable.tsx +2 -2
  128. package/src/components/DataTable/__tests__/DataTable.comprehensive.test.tsx +1 -1
  129. package/src/components/DataTable/__tests__/DataTable.export.test.tsx +2 -2
  130. package/src/components/DataTable/__tests__/DataTable.grouping-aggregation.test.tsx +1 -1
  131. package/src/components/DataTable/__tests__/DataTable.select-label-display.test.tsx +16 -14
  132. package/src/components/DataTable/__tests__/DataTable.test.tsx +2 -2
  133. package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +1 -1
  134. package/src/components/DataTable/__tests__/DataTableCore.test.tsx +76 -580
  135. package/src/components/DataTable/__tests__/README.md +1 -1
  136. package/src/components/DataTable/__tests__/a11y.basic.test.tsx +1 -1
  137. package/src/components/DataTable/__tests__/keyboard.test.tsx +1 -1
  138. package/src/components/DataTable/__tests__/pagination.modes.test.tsx +1 -3
  139. package/src/components/DataTable/__tests__/ssr.strict-mode.test.tsx +0 -6
  140. package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +14 -6
  141. package/src/components/DataTable/components/ActionButtons.tsx +9 -4
  142. package/src/components/DataTable/components/BulkOperationsDropdown.tsx +3 -3
  143. package/src/components/DataTable/components/ColumnFilter.tsx +2 -7
  144. package/src/components/DataTable/components/DataTableCore.tsx +44 -52
  145. package/src/components/DataTable/components/DataTableLayout.tsx +37 -26
  146. package/src/components/DataTable/components/DataTableModals.tsx +118 -30
  147. package/src/components/DataTable/components/DataTableToolbar.tsx +2 -2
  148. package/src/components/DataTable/components/EditFields.tsx +6 -47
  149. package/src/components/DataTable/components/EditableRow.tsx +8 -8
  150. package/src/components/DataTable/components/EmptyState.tsx +6 -3
  151. package/src/components/DataTable/components/FilterRow.tsx +18 -11
  152. package/src/components/DataTable/components/GroupingDropdown.tsx +0 -1
  153. package/src/components/DataTable/components/ImportModal.tsx +305 -133
  154. package/src/components/DataTable/components/LoadingState.tsx +2 -2
  155. package/src/components/DataTable/components/PaginationControls.tsx +0 -4
  156. package/src/components/DataTable/components/RowComponent.tsx +42 -22
  157. package/src/components/DataTable/components/UnifiedTableBody.tsx +52 -12
  158. package/src/components/DataTable/components/__tests__/AccessDeniedPage.test.tsx +51 -463
  159. package/src/components/DataTable/components/__tests__/ActionButtons.test.tsx +122 -116
  160. package/src/components/DataTable/components/__tests__/BulkOperationsDropdown.test.tsx +40 -68
  161. package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +9 -137
  162. package/src/components/DataTable/components/__tests__/ColumnVisibilityDropdown.test.tsx +57 -17
  163. package/src/components/DataTable/components/__tests__/DataTableCore.test.tsx +792 -0
  164. package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +24 -65
  165. package/src/components/DataTable/components/__tests__/DataTableLayout.test.tsx +467 -0
  166. package/src/components/DataTable/components/__tests__/DataTableModals.test.tsx +8 -125
  167. package/src/components/DataTable/components/__tests__/DataTableToolbar.test.tsx +528 -56
  168. package/src/components/DataTable/components/__tests__/EditFields.test.tsx +526 -0
  169. package/src/components/DataTable/components/__tests__/EditableRow.test.tsx +1 -68
  170. package/src/components/DataTable/components/__tests__/EmptyState.test.tsx +8 -25
  171. package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +3 -62
  172. package/src/components/DataTable/components/__tests__/GroupingDropdown.test.tsx +9 -14
  173. package/src/components/DataTable/components/__tests__/ImportModal.test.tsx +50 -186
  174. package/src/components/DataTable/components/__tests__/LoadingState.test.tsx +39 -97
  175. package/src/components/DataTable/components/__tests__/PaginationControls.test.tsx +13 -103
  176. package/src/components/DataTable/components/__tests__/RowComponent.test.tsx +629 -0
  177. package/src/components/DataTable/components/__tests__/SortIndicator.test.tsx +135 -0
  178. package/src/components/DataTable/components/__tests__/UnifiedTableBody.test.tsx +31 -171
  179. package/src/components/DataTable/components/__tests__/cellValueUtils.test.ts +453 -0
  180. package/src/components/DataTable/components/hooks/useImportModalFocus.test.ts +184 -0
  181. package/src/components/DataTable/components/hooks/usePermissionTracking.test.ts +381 -0
  182. package/src/components/DataTable/context/DataTableContext.tsx +9 -10
  183. package/src/components/DataTable/context/__tests__/DataTableContext.test.tsx +12 -26
  184. package/src/components/DataTable/core/ColumnFactory.ts +3 -3
  185. package/src/components/DataTable/core/ColumnManager.ts +0 -1
  186. package/src/components/DataTable/core/DataManager.ts +4 -2
  187. package/src/components/DataTable/core/LocalDataAdapter.ts +1 -1
  188. package/src/components/DataTable/core/PluginRegistry.ts +2 -2
  189. package/src/components/DataTable/core/__tests__/ActionManager.test.ts +114 -2
  190. package/src/components/DataTable/core/__tests__/ColumnFactory.test.ts +103 -5
  191. package/src/components/DataTable/core/__tests__/ColumnManager.test.ts +57 -0
  192. package/src/components/DataTable/core/__tests__/DataManager.test.ts +63 -0
  193. package/src/components/DataTable/core/__tests__/LocalDataAdapter.test.ts +42 -9
  194. package/src/components/DataTable/core/__tests__/PluginRegistry.test.ts +29 -7
  195. package/src/components/DataTable/core/__tests__/StateManager.test.ts +58 -4
  196. package/src/components/DataTable/hooks/__tests__/useColumnOrderPersistence.test.ts +16 -21
  197. package/src/components/DataTable/hooks/__tests__/useColumnVisibilityPersistence.test.ts +93 -4
  198. package/src/components/DataTable/hooks/__tests__/useDataTableConfiguration.test.ts +227 -54
  199. package/src/components/DataTable/hooks/__tests__/useDataTableDataPipeline.test.ts +215 -62
  200. package/src/components/DataTable/hooks/__tests__/useDataTablePermissions.test.ts +217 -39
  201. package/src/components/DataTable/hooks/__tests__/useDataTableState.test.ts +101 -6
  202. package/src/components/DataTable/hooks/__tests__/useEffectiveColumnOrder.test.ts +157 -27
  203. package/src/components/DataTable/hooks/__tests__/useHierarchicalState.test.ts +80 -0
  204. package/src/components/DataTable/hooks/__tests__/useKeyboardNavigation.test.ts +787 -0
  205. package/src/components/DataTable/hooks/__tests__/useServerSideDataEffect.test.ts +258 -0
  206. package/src/components/DataTable/hooks/__tests__/useTableColumns.test.ts +128 -77
  207. package/src/components/DataTable/hooks/__tests__/useTableHandlers.test.ts +440 -0
  208. package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +12 -9
  209. package/src/components/DataTable/hooks/useColumnVisibilityPersistence.ts +12 -9
  210. package/src/components/DataTable/hooks/useDataTableConfiguration.ts +1 -1
  211. package/src/components/DataTable/hooks/useDataTablePermissions.ts +11 -22
  212. package/src/components/DataTable/hooks/useDataTableState.ts +20 -24
  213. package/src/components/DataTable/hooks/useKeyboardNavigation.ts +5 -5
  214. package/src/components/DataTable/hooks/useServerSideDataEffect.ts +13 -1
  215. package/src/components/DataTable/hooks/useTableColumns.ts +15 -39
  216. package/src/components/DataTable/hooks/useTableHandlers.ts +8 -20
  217. package/src/components/DataTable/index.ts +24 -2
  218. package/src/components/DataTable/types.ts +6 -3
  219. package/src/components/DataTable/utils/__tests__/a11yUtils.test.ts +3 -67
  220. package/src/components/DataTable/utils/__tests__/aggregationUtils.test.ts +288 -0
  221. package/src/components/DataTable/utils/__tests__/errorHandling.test.ts +3 -60
  222. package/src/components/DataTable/utils/__tests__/flexibleImport.test.ts +1 -1
  223. package/src/components/DataTable/utils/__tests__/hierarchicalSorting.test.ts +9 -21
  224. package/src/components/DataTable/utils/__tests__/hierarchicalUtils.test.ts +102 -86
  225. package/src/components/DataTable/utils/__tests__/paginationUtils.test.ts +593 -0
  226. package/src/components/DataTable/utils/__tests__/rowUtils.test.ts +33 -49
  227. package/src/components/DataTable/utils/__tests__/selectFieldUtils.test.ts +1 -0
  228. package/src/components/DataTable/utils/a11yUtils.ts +1 -1
  229. package/src/components/DataTable/utils/aggregationUtils.ts +5 -5
  230. package/src/components/DataTable/utils/errorHandling.ts +3 -1
  231. package/src/components/DataTable/utils/exportUtils.ts +1 -1
  232. package/src/components/DataTable/utils/flexibleImport.ts +2 -2
  233. package/src/components/DataTable/utils/hierarchicalSorting.ts +3 -3
  234. package/src/components/DataTable/utils/paginationUtils.ts +1 -1
  235. package/src/components/DataTable/utils/performanceUtils.ts +1 -1
  236. package/src/components/DataTable/utils/selectFieldUtils.ts +0 -7
  237. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +17 -24
  238. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.tsx +1 -1
  239. package/src/components/DateTimeField/DateTimeField.test.tsx +2 -15
  240. package/src/components/DateTimeField/DateTimeField.tsx +1 -1
  241. package/src/components/Dialog/Dialog.test.tsx +2007 -407
  242. package/src/components/Dialog/Dialog.tsx +97 -192
  243. package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +2 -62
  244. package/src/components/ErrorBoundary/ErrorBoundaryContext.context.ts +17 -0
  245. package/src/components/ErrorBoundary/ErrorBoundaryContext.tsx +2 -45
  246. package/src/components/ErrorBoundary/ErrorBoundaryContext.types.ts +41 -0
  247. package/src/components/ErrorBoundary/index.ts +3 -4
  248. package/src/components/ErrorBoundary/useErrorBoundaryContext.ts +20 -0
  249. package/src/components/FileDisplay/FileDisplay.test.tsx +454 -222
  250. package/src/components/FileDisplay/FileDisplay.tsx +14 -12
  251. package/src/components/FileDisplay/index.tsx +1 -1
  252. package/src/components/FileUpload/FileUpload.test.tsx +54 -18
  253. package/src/components/FileUpload/FileUpload.tsx +10 -7
  254. package/src/components/FileUpload/index.tsx +1 -1
  255. package/src/components/Footer/Footer.test.tsx +33 -114
  256. package/src/components/Form/Form.test.tsx +388 -68
  257. package/src/components/Form/Form.tsx +57 -42
  258. package/src/components/Header/Header.test.tsx +645 -154
  259. package/src/components/Header/Header.tsx +52 -43
  260. package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +35 -76
  261. package/src/components/Input/Input.test.tsx +34 -120
  262. package/src/components/Label/Label.test.tsx +47 -46
  263. package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +9 -12
  264. package/src/components/LoginForm/LoginForm.test.tsx +0 -1
  265. package/src/components/NavigationMenu/NavigationMenu.test.tsx +1399 -82
  266. package/src/components/NavigationMenu/NavigationMenu.tsx +2 -2
  267. package/src/components/NavigationMenu/__tests__/useNavigationFiltering.test.ts +1934 -0
  268. package/src/components/NavigationMenu/useNavigationFiltering.ts +5 -15
  269. package/src/components/PaceAppLayout/PaceAppLayout.edge-cases.test.tsx +1307 -0
  270. package/src/components/PaceAppLayout/PaceAppLayout.integration.test.tsx +47 -46
  271. package/src/components/PaceAppLayout/PaceAppLayout.performance.test.tsx +81 -38
  272. package/src/components/PaceAppLayout/PaceAppLayout.security.test.tsx +87 -66
  273. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +245 -39
  274. package/src/components/PaceAppLayout/PaceAppLayout.tsx +14 -20
  275. package/src/components/PaceAppLayout/README.md +0 -9
  276. package/src/components/PaceAppLayout/test-setup.tsx +15 -9
  277. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +759 -3
  278. package/src/components/PaceLoginPage/PaceLoginPage.tsx +2 -3
  279. package/src/components/PasswordChange/PasswordChangeForm.test.tsx +1 -1
  280. package/src/components/Progress/Progress.test.tsx +127 -1
  281. package/src/components/ProtectedRoute/ProtectedRoute.test.tsx +1196 -4
  282. package/src/components/ProtectedRoute/ProtectedRoute.tsx +24 -6
  283. package/src/components/PublicLayout/PublicLayout.test.tsx +1435 -14
  284. package/src/components/PublicLayout/PublicPageContext.ts +28 -0
  285. package/src/components/PublicLayout/PublicPageLayout.tsx +6 -6
  286. package/src/components/PublicLayout/PublicPageProvider.tsx +2 -41
  287. package/src/components/PublicLayout/usePublicPageContext.ts +36 -0
  288. package/src/components/Select/Select.test.tsx +46 -9
  289. package/src/components/Select/Select.tsx +31 -24
  290. package/src/components/Select/__tests__/context.test.tsx +56 -0
  291. package/src/components/Select/hooks/__tests__/useSelectEvents.test.ts +279 -0
  292. package/src/components/Select/hooks/__tests__/useSelectSearch.test.tsx +295 -0
  293. package/src/components/Select/hooks/__tests__/useSelectState.test.ts +254 -0
  294. package/src/components/Select/hooks/useSelectState.ts +16 -16
  295. package/src/components/Select/types.ts +3 -0
  296. package/src/components/Select/utils/__tests__/text.test.tsx +104 -0
  297. package/src/components/SessionRestorationLoader/SessionRestorationLoader.test.tsx +28 -112
  298. package/src/components/Switch/Switch.test.tsx +57 -153
  299. package/src/components/Table/Table.test.tsx +47 -317
  300. package/src/components/Tabs/Tabs.tsx +3 -3
  301. package/src/components/Textarea/Textarea.test.tsx +11 -38
  302. package/src/components/Toast/Toast.test.tsx +78 -569
  303. package/src/components/Tooltip/Tooltip.test.tsx +4 -21
  304. package/src/components/UserMenu/UserMenu.test.tsx +1 -21
  305. package/src/components/UserMenu/UserMenu.tsx +0 -1
  306. package/src/components/__tests__/index.test.ts +346 -0
  307. package/src/components/index.ts +12 -1
  308. package/src/constants/__tests__/performance.test.ts +91 -0
  309. package/src/hooks/__tests__/ServiceHooks.test.tsx +239 -129
  310. package/src/hooks/__tests__/hooks.integration.test.tsx +4 -3
  311. package/src/hooks/__tests__/useApiFetch.unit.test.ts +1 -1
  312. package/src/hooks/__tests__/useAppConfig.unit.test.ts +88 -29
  313. package/src/hooks/__tests__/useComponentPerformance.unit.test.tsx +282 -98
  314. package/src/hooks/__tests__/useDataTablePerformance.unit.test.ts +53 -109
  315. package/src/hooks/__tests__/useDataTableState.test.ts +143 -49
  316. package/src/hooks/__tests__/useDebounce.unit.test.ts +94 -19
  317. package/src/hooks/__tests__/useEvents.unit.test.ts +100 -125
  318. package/src/hooks/__tests__/useFileDisplay.test.ts +540 -0
  319. package/src/hooks/__tests__/useFileDisplay.unit.test.ts +1 -4
  320. package/src/hooks/__tests__/useFileUrl.unit.test.ts +27 -247
  321. package/src/hooks/__tests__/useFileUrlCache.test.ts +246 -56
  322. package/src/hooks/__tests__/useFocusManagement.unit.test.ts +442 -68
  323. package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +345 -560
  324. package/src/hooks/__tests__/useFormDialog.test.ts +51 -222
  325. package/src/hooks/__tests__/useInactivityTracker.unit.test.ts +1 -1
  326. package/src/hooks/__tests__/useKeyboardShortcuts.unit.test.ts +1 -4
  327. package/src/hooks/__tests__/useOrganisationPermissions.unit.test.tsx +0 -1
  328. package/src/hooks/__tests__/usePerformanceMonitor.unit.test.ts +1 -1
  329. package/src/hooks/__tests__/usePermissionCache.test.ts +506 -0
  330. package/src/hooks/__tests__/usePreventTabReload.test.ts +255 -36
  331. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +17 -8
  332. package/src/hooks/__tests__/usePublicEvent.test.ts +16 -24
  333. package/src/hooks/__tests__/usePublicEvent.unit.test.ts +12 -4
  334. package/src/hooks/__tests__/usePublicFileDisplay.test.ts +3 -6
  335. package/src/hooks/__tests__/usePublicRouteParams.unit.test.ts +1 -2
  336. package/src/hooks/__tests__/useQueryCache.test.ts +313 -66
  337. package/src/hooks/__tests__/useSessionDraft.test.ts +496 -103
  338. package/src/hooks/__tests__/useSessionRestoration.unit.test.tsx +2 -2
  339. package/src/hooks/__tests__/useStorage.unit.test.ts +72 -102
  340. package/src/hooks/__tests__/useToast.test.ts +413 -0
  341. package/src/hooks/__tests__/useToast.unit.test.tsx +1 -1
  342. package/src/hooks/__tests__/useZodForm.unit.test.tsx +175 -21
  343. package/src/hooks/index.ts +13 -1
  344. package/src/hooks/public/usePublicEvent.test.ts +304 -0
  345. package/src/hooks/public/usePublicEvent.ts +11 -11
  346. package/src/hooks/public/usePublicEventLogo.test.ts +655 -120
  347. package/src/hooks/public/usePublicEventLogo.ts +2 -2
  348. package/src/hooks/public/usePublicFileDisplay.test.ts +723 -0
  349. package/src/hooks/public/usePublicFileDisplay.ts +79 -49
  350. package/src/hooks/public/usePublicRouteParams.test.ts +595 -0
  351. package/src/hooks/public/usePublicRouteParams.ts +2 -2
  352. package/src/hooks/services/useAuthService.ts +1 -1
  353. package/src/hooks/services/useEventService.ts +1 -1
  354. package/src/hooks/useAccessibleApps.test.ts +400 -0
  355. package/src/hooks/useAccessibleApps.ts +264 -0
  356. package/src/hooks/useAddressAutocomplete.test.ts +165 -42
  357. package/src/hooks/useAddressAutocomplete.ts +41 -28
  358. package/src/hooks/useAppConfig.ts +13 -3
  359. package/src/hooks/useDataTablePerformance.ts +13 -12
  360. package/src/hooks/useDataTableState.ts +5 -5
  361. package/src/hooks/useEventTheme.test.ts +66 -17
  362. package/src/hooks/useEventTheme.ts +1 -1
  363. package/src/hooks/useEvents.ts +8 -1
  364. package/src/hooks/useFileDisplay.ts +66 -33
  365. package/src/hooks/useFileReference.test.ts +365 -87
  366. package/src/hooks/useFileReference.ts +2 -6
  367. package/src/hooks/useFileUrlCache.ts +4 -1
  368. package/src/hooks/useFormDialog.ts +2 -2
  369. package/src/hooks/useInactivityTracker.ts +3 -3
  370. package/src/hooks/useOrganisationPermissions.test.ts +1 -2
  371. package/src/hooks/useOrganisationPermissions.ts +1 -4
  372. package/src/hooks/useOrganisationSecurity.test.ts +1 -30
  373. package/src/hooks/useOrganisationSecurity.ts +3 -3
  374. package/src/hooks/useOrganisations.ts +1 -1
  375. package/src/hooks/usePerformanceMonitor.ts +1 -1
  376. package/src/hooks/usePermissionCache.ts +2 -6
  377. package/src/hooks/useQueryCache.ts +7 -7
  378. package/src/hooks/useSessionDraft.ts +14 -11
  379. package/src/hooks/useSessionRestoration.ts +1 -1
  380. package/src/hooks/useStorage.ts +75 -40
  381. package/src/hooks/useToast.ts +2 -2
  382. package/src/hooks/useZodForm.ts +3 -3
  383. package/src/icons/__tests__/index.test.ts +133 -0
  384. package/src/icons/index.ts +1 -1
  385. package/src/index.ts +43 -4
  386. package/src/providers/OrganisationProvider.test.tsx +40 -0
  387. package/src/providers/OrganisationProvider.tsx +5 -5
  388. package/src/providers/UnifiedAuthProvider.smoke.test.tsx +7 -12
  389. package/src/providers/__tests__/AuthProvider.test.tsx +22 -91
  390. package/src/providers/__tests__/EventProvider.test.tsx +16 -80
  391. package/src/providers/__tests__/InactivityProvider.test.tsx +29 -173
  392. package/src/providers/__tests__/OrganisationProvider.test.tsx +4 -5
  393. package/src/providers/__tests__/OrganisationProvider.wrapper.test.tsx +591 -0
  394. package/src/providers/__tests__/ProviderLifecycle.test.tsx +80 -196
  395. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +40 -133
  396. package/src/providers/__tests__/index.test.ts +138 -0
  397. package/src/providers/services/AuthServiceContext.ts +27 -0
  398. package/src/providers/services/AuthServiceProvider.tsx +81 -20
  399. package/src/providers/services/EventServiceContext.ts +25 -0
  400. package/src/providers/services/EventServiceProvider.tsx +11 -20
  401. package/src/providers/services/InactivityServiceContext.ts +25 -0
  402. package/src/providers/services/InactivityServiceProvider.tsx +7 -17
  403. package/src/providers/services/OrganisationServiceContext.ts +25 -0
  404. package/src/providers/services/OrganisationServiceProvider.tsx +7 -17
  405. package/src/providers/services/UnifiedAuthContext.ts +99 -0
  406. package/src/providers/services/UnifiedAuthProvider.test.tsx +212 -0
  407. package/src/providers/services/UnifiedAuthProvider.tsx +38 -143
  408. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +61 -95
  409. package/src/providers/services/__tests__/AuthServiceProvider.test.tsx +638 -0
  410. package/src/providers/services/__tests__/EventServiceProvider.test.tsx +839 -0
  411. package/src/providers/services/__tests__/InactivityServiceProvider.test.tsx +662 -0
  412. package/src/providers/services/__tests__/OrganisationServiceProvider.test.tsx +440 -0
  413. package/src/providers/services/__tests__/UnifiedAuthProvider.advanced.test.tsx +435 -0
  414. package/src/providers/services/__tests__/UnifiedAuthProvider.appId.test.tsx +408 -0
  415. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +55 -48
  416. package/src/providers/services/__tests__/contexts.test.tsx +281 -0
  417. package/src/providers/services/__tests__/useUnifiedAuth.test.tsx +251 -0
  418. package/src/providers/services/useUnifiedAuth.ts +29 -0
  419. package/src/rbac/README.md +5 -5
  420. package/src/rbac/__tests__/adapters.comprehensive.test.tsx +9 -14
  421. package/src/rbac/__tests__/audit-batched.test.ts +550 -0
  422. package/src/rbac/__tests__/auth-rbac-security.integration.test.tsx +1 -14
  423. package/src/rbac/__tests__/auth-rbac.e2e.test.tsx +43 -12
  424. package/src/rbac/__tests__/cache-invalidation.test.ts +8 -14
  425. package/src/rbac/__tests__/engine.comprehensive.test.ts +2 -7
  426. package/src/rbac/__tests__/index.test.ts +107 -0
  427. package/src/rbac/__tests__/performance.test.ts +451 -0
  428. package/src/rbac/__tests__/rbac-core.test.tsx +2 -2
  429. package/src/rbac/__tests__/rbac-engine-core-logic.test.ts +0 -5
  430. package/src/rbac/__tests__/rbac-engine-simplified.test.ts +1 -7
  431. package/src/rbac/__tests__/rbac-functions.test.ts +0 -1
  432. package/src/rbac/__tests__/rbac-integration.test.ts +0 -1
  433. package/src/rbac/__tests__/scenarios.user-role.test.tsx +21 -32
  434. package/src/rbac/adapters.test.tsx +654 -0
  435. package/src/rbac/adapters.tsx +24 -9
  436. package/src/rbac/api.test.ts +13 -217
  437. package/src/rbac/api.ts +85 -16
  438. package/src/rbac/audit-batched.ts +5 -4
  439. package/src/rbac/audit.test.ts +225 -28
  440. package/src/rbac/audit.ts +22 -17
  441. package/src/rbac/cache-invalidation.ts +18 -15
  442. package/src/rbac/cache.test.ts +123 -63
  443. package/src/rbac/cache.ts +3 -4
  444. package/src/rbac/components/AccessDenied.tsx +20 -18
  445. package/src/rbac/components/NavigationGuard.tsx +10 -8
  446. package/src/rbac/components/PagePermissionGuard.tsx +27 -25
  447. package/src/rbac/components/__tests__/AccessDenied.test.tsx +324 -0
  448. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +242 -71
  449. package/src/rbac/components/__tests__/PagePermissionGuard.performance.test.tsx +20 -37
  450. package/src/rbac/components/__tests__/PagePermissionGuard.race-condition.test.tsx +18 -17
  451. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +452 -129
  452. package/src/rbac/components/__tests__/PagePermissionGuard.verification.test.tsx +14 -13
  453. package/src/rbac/config.test.ts +131 -48
  454. package/src/rbac/config.ts +11 -8
  455. package/src/rbac/docs/event-based-apps.md +26 -13
  456. package/src/rbac/engine.test.ts +496 -146
  457. package/src/rbac/engine.ts +53 -13
  458. package/src/rbac/errors.test.ts +99 -87
  459. package/src/rbac/eslint-rules.js +2 -2
  460. package/src/rbac/hooks/__tests__/usePermissions.integration.test.ts +0 -5
  461. package/src/rbac/hooks/__tests__/useSecureSupabase.test.ts +601 -1
  462. package/src/rbac/hooks/permissions/__tests__/useAccessLevel.test.ts +622 -0
  463. package/src/rbac/hooks/permissions/__tests__/useCan.test.ts +798 -0
  464. package/src/rbac/hooks/permissions/__tests__/useMultiplePermissions.test.ts +843 -0
  465. package/src/rbac/hooks/permissions/__tests__/usePermissions.test.ts +545 -0
  466. package/src/rbac/hooks/permissions/useAccessLevel.ts +7 -8
  467. package/src/rbac/hooks/permissions/useCan.ts +12 -10
  468. package/src/rbac/hooks/permissions/useMultiplePermissions.ts +57 -8
  469. package/src/rbac/hooks/permissions/usePermissions.ts +15 -14
  470. package/src/rbac/hooks/useCan.test.ts +319 -3
  471. package/src/rbac/hooks/usePermissions.test.ts +426 -0
  472. package/src/rbac/hooks/usePermissions.ts +5 -7
  473. package/src/rbac/hooks/useRBAC.test.ts +1669 -2
  474. package/src/rbac/hooks/useRBAC.ts +7 -11
  475. package/src/rbac/hooks/useResolvedScope.test.ts +442 -5
  476. package/src/rbac/hooks/useResolvedScope.ts +4 -1
  477. package/src/rbac/hooks/useResourcePermissions.test.ts +538 -1
  478. package/src/rbac/hooks/useResourcePermissions.ts +9 -7
  479. package/src/rbac/hooks/useRoleManagement.test.ts +659 -1
  480. package/src/rbac/hooks/useRoleManagement.ts +16 -12
  481. package/src/rbac/hooks/useSecureSupabase.ts +11 -12
  482. package/src/rbac/index.ts +32 -32
  483. package/src/rbac/permissions.test.ts +149 -68
  484. package/src/rbac/permissions.ts +0 -3
  485. package/src/rbac/request-deduplication.test.ts +347 -0
  486. package/src/rbac/secureClient.test.ts +112 -159
  487. package/src/rbac/secureClient.ts +46 -26
  488. package/src/rbac/security.test.ts +125 -44
  489. package/src/rbac/security.ts +7 -6
  490. package/src/rbac/types.test.ts +236 -0
  491. package/src/rbac/types.ts +7 -5
  492. package/src/rbac/utils/__tests__/clientSecurity.test.ts +192 -0
  493. package/src/rbac/utils/__tests__/contextValidator.test.ts +1 -3
  494. package/src/rbac/utils/__tests__/deep-equal.test.ts +23 -0
  495. package/src/rbac/utils/__tests__/eventContext.test.ts +10 -57
  496. package/src/rbac/utils/clientSecurity.ts +6 -4
  497. package/src/rbac/utils/contextValidator.ts +1 -2
  498. package/src/rbac/utils/eventContext.ts +2 -2
  499. package/src/services/AuthService.ts +13 -11
  500. package/src/services/EventService.ts +4 -5
  501. package/src/services/OrganisationService.ts +13 -30
  502. package/src/services/__tests__/AuthService.edge-cases.test.ts +746 -0
  503. package/src/services/__tests__/AuthService.restoreSession.test.ts +23 -3
  504. package/src/services/__tests__/AuthService.test.ts +4 -8
  505. package/src/services/__tests__/BaseService.edge-cases.test.ts +506 -0
  506. package/src/services/__tests__/BaseService.test.ts +49 -0
  507. package/src/services/__tests__/EventService.edge-cases.test.ts +633 -0
  508. package/src/services/__tests__/EventService.eventColours.test.ts +0 -12
  509. package/src/services/__tests__/EventService.test.ts +0 -7
  510. package/src/services/__tests__/InactivityService.edge-cases.test.ts +492 -0
  511. package/src/services/__tests__/InactivityService.lifecycle.test.ts +0 -5
  512. package/src/services/__tests__/OrganisationService.edge-cases.test.ts +633 -0
  513. package/src/services/base/BaseService.test.ts +214 -0
  514. package/src/services/interfaces/IOrganisationService.ts +0 -1
  515. package/src/services/interfaces/__tests__/IAuthService.test.ts +190 -0
  516. package/src/services/interfaces/__tests__/IEventService.test.ts +176 -0
  517. package/src/services/interfaces/__tests__/IInactivityService.test.ts +183 -0
  518. package/src/services/interfaces/__tests__/IOrganisationService.test.ts +207 -0
  519. package/src/styles/core.css +1 -0
  520. package/src/theming/__tests__/runtime.test.ts +29 -94
  521. package/src/theming/parseEventColours.ts +18 -9
  522. package/src/theming/runtime.ts +1 -5
  523. package/src/types/__tests__/core.test.ts +397 -0
  524. package/src/types/__tests__/database-generated.test.ts +78 -0
  525. package/src/types/__tests__/file-reference.test.ts +270 -366
  526. package/src/types/__tests__/guards.test.ts +26 -26
  527. package/src/types/__tests__/index.test.ts +265 -0
  528. package/src/types/__tests__/type-validation.test.ts +3 -3
  529. package/src/types/__tests__/validation.test.ts +0 -2
  530. package/src/types/auth.ts +0 -1
  531. package/src/types/event.ts +1 -1
  532. package/src/types/rpc-responses.ts +33 -0
  533. package/src/types/supabase.ts +1 -2
  534. package/src/types/vitest-globals.d.ts +1 -1
  535. package/src/utils/__tests__/bundleAnalysis.unit.test.ts +64 -77
  536. package/src/utils/__tests__/dynamicUtils.unit.test.ts +13 -0
  537. package/src/utils/__tests__/formatDate.unit.test.ts +1 -1
  538. package/src/utils/__tests__/lazyLoad.unit.test.tsx +0 -1
  539. package/src/utils/__tests__/logger.unit.test.ts +1 -1
  540. package/src/utils/__tests__/performanceBenchmark.test.ts +1 -2
  541. package/src/utils/__tests__/performanceBudgets.unit.test.ts +48 -13
  542. package/src/utils/__tests__/request-deduplication.test.ts +349 -0
  543. package/src/utils/__tests__/secureDataAccess.unit.test.ts +0 -1
  544. package/src/utils/__tests__/timezone.test.ts +1 -1
  545. package/src/utils/__tests__/validation.unit.test.ts +1 -2
  546. package/src/utils/__tests__/validationUtils.unit.test.ts +1 -1
  547. package/src/utils/app/appConfig.test.ts +235 -0
  548. package/src/utils/app/appIdResolver.test.ts +188 -20
  549. package/src/utils/app/appNameResolver.test.ts +18 -10
  550. package/src/utils/app/appNameResolver.ts +11 -9
  551. package/src/utils/app/appPortMap.test.ts +125 -0
  552. package/src/utils/app/appPortMap.ts +51 -0
  553. package/src/utils/app/buildAppUrl.test.ts +273 -0
  554. package/src/utils/app/buildAppUrl.ts +114 -0
  555. package/src/utils/audit/audit.test.ts +354 -39
  556. package/src/utils/context/organisationContext.test.ts +10 -4
  557. package/src/utils/context/organisationContext.ts +5 -5
  558. package/src/utils/context/sessionTracking.test.ts +354 -0
  559. package/src/utils/core/__tests__/cn.test.ts +66 -0
  560. package/src/utils/core/__tests__/debugLogger.test.ts +113 -0
  561. package/src/utils/core/__tests__/logger.test.ts +217 -0
  562. package/src/utils/core/debugLogger.ts +15 -8
  563. package/src/utils/core/logger.ts +20 -16
  564. package/src/utils/device/deviceFingerprint.test.ts +8 -5
  565. package/src/utils/device/deviceFingerprint.ts +3 -3
  566. package/src/utils/dynamic/__tests__/dynamicUtils.test.ts +185 -0
  567. package/src/utils/dynamic/__tests__/lazyLoad.test.tsx +156 -0
  568. package/src/utils/dynamic/createLazyComponent.tsx +38 -0
  569. package/src/utils/dynamic/dynamicUtils.ts +6 -6
  570. package/src/utils/dynamic/lazyLoad.tsx +8 -36
  571. package/src/utils/dynamic/papaparseLoader.ts +7 -0
  572. package/src/utils/file-reference/__tests__/file-reference.test.ts +583 -145
  573. package/src/utils/file-reference/index.ts +0 -1
  574. package/src/utils/formatting/formatDate.test.ts +22 -148
  575. package/src/utils/formatting/formatDateTime.test.ts +41 -119
  576. package/src/utils/formatting/formatDateTimeTimezone.test.ts +40 -84
  577. package/src/utils/formatting/formatNumber.test.ts +259 -0
  578. package/src/utils/formatting/formatTime.test.ts +36 -128
  579. package/src/utils/formatting/formatting.ts +1 -1
  580. package/src/utils/google-places/googlePlacesUtils.test.ts +72 -3
  581. package/src/utils/google-places/googlePlacesUtils.ts +15 -2
  582. package/src/utils/google-places/loadGoogleMapsScript.test.ts +58 -1
  583. package/src/utils/google-places/loadGoogleMapsScript.ts +2 -1
  584. package/src/utils/index.ts +52 -11
  585. package/src/utils/location/location.test.ts +18 -115
  586. package/src/utils/performance/__tests__/bundleAnalysis.test.ts +148 -0
  587. package/src/utils/performance/__tests__/performanceBenchmark.test.ts +251 -0
  588. package/src/utils/performance/__tests__/performanceBudgets.test.ts +241 -0
  589. package/src/utils/performance/bundleAnalysis.ts +16 -22
  590. package/src/utils/performance/performanceBenchmark.ts +12 -4
  591. package/src/utils/performance/performanceBudgets.ts +9 -6
  592. package/src/utils/permissions/__tests__/permissionTypes.test.ts +149 -0
  593. package/src/utils/permissions/permissionUtils.test.ts +20 -42
  594. package/src/utils/persistence/__tests__/keyDerivation.test.ts +180 -9
  595. package/src/utils/persistence/__tests__/sensitiveFieldDetection.test.ts +164 -16
  596. package/src/utils/persistence/sensitiveFieldDetection.ts +2 -2
  597. package/src/utils/request-deduplication.ts +6 -4
  598. package/src/utils/security/auth-utils.ts +7 -7
  599. package/src/utils/security/secureDataAccess.test.ts +22 -191
  600. package/src/utils/security/secureErrors.test.ts +163 -0
  601. package/src/utils/security/secureStorage.test.ts +156 -0
  602. package/src/utils/security/secureStorage.ts +1 -1
  603. package/src/utils/security/security.test.ts +204 -0
  604. package/src/utils/security/securityMonitor.test.ts +90 -0
  605. package/src/utils/security/securityMonitor.ts +1 -1
  606. package/src/utils/storage/__tests__/config.unit.test.ts +239 -0
  607. package/src/utils/storage/__tests__/index.unit.test.ts +64 -12
  608. package/src/utils/storage/helpers.test.ts +757 -430
  609. package/src/utils/storage/helpers.ts +1 -2
  610. package/src/utils/storage/{index.ts → storageUtils.ts} +1 -36
  611. package/src/utils/storage/types.ts +2 -2
  612. package/src/utils/supabase/createBaseClient.test.ts +201 -0
  613. package/src/utils/supabase/createBaseClient.ts +2 -1
  614. package/src/utils/timezone/timezone.test.ts +25 -43
  615. package/src/utils/validation/__tests__/common.test.ts +115 -0
  616. package/src/utils/validation/__tests__/csrf.test.ts +65 -0
  617. package/src/utils/validation/__tests__/htmlSanitization.unit.test.ts +27 -7
  618. package/src/utils/validation/__tests__/passwordSchema.test.ts +164 -0
  619. package/src/utils/validation/__tests__/schema.test.ts +127 -0
  620. package/src/utils/validation/__tests__/sqlInjectionProtection.test.ts +76 -3
  621. package/src/utils/validation/__tests__/user.test.ts +173 -0
  622. package/src/utils/validation/__tests__/validation.test.ts +197 -0
  623. package/src/utils/validation/__tests__/validationUtils.test.ts +265 -43
  624. package/src/utils/validation/htmlSanitization.ts +27 -31
  625. package/src/utils/validation/schema.ts +6 -3
  626. package/src/utils/validation/sqlInjectionProtection.ts +2 -2
  627. package/src/vite-env.d.ts +6 -0
  628. package/dist/DataTable-DRUIgtUH.d.ts +0 -166
  629. package/dist/UnifiedAuthProvider-7SNDOWYD.js +0 -7
  630. package/dist/audit-MYQXYZFU.js +0 -3
  631. package/dist/chunk-7ILTDCL2.js +0 -80
  632. package/dist/chunk-EF2UGZWY.js +0 -611
  633. package/dist/chunk-FEJLJNWA.js +0 -181
  634. package/dist/chunk-GS5672WG.js +0 -2003
  635. package/dist/chunk-S6ZQKDY6.js +0 -62
  636. package/dist/chunk-Z2FNRKF3.js +0 -994
  637. package/dist/useToast-AyaT-x7p.d.ts +0 -68
  638. package/src/components/DataTable/components/index.ts +0 -16
  639. package/src/components/DataTable/core/index.ts +0 -1
  640. package/src/components/DataTable/hooks/index.ts +0 -13
  641. package/src/components/DataTable/utils/index.ts +0 -10
  642. package/src/components/PublicLayout/index.ts +0 -32
  643. package/src/hooks/__tests__/usePermissionCache.simple.test.ts +0 -192
  644. package/src/hooks/__tests__/usePermissionCache.unit.test.ts +0 -741
  645. package/src/hooks/public/index.ts +0 -36
  646. package/src/hooks/usePermissionCache.test.ts +0 -536
  647. package/src/rbac/__tests__/isSuperAdmin.real.test.ts +0 -82
  648. package/src/rbac/audit-enhanced.ts +0 -384
  649. package/src/rbac/compliance/database-validator.ts +0 -165
  650. package/src/rbac/compliance/index.ts +0 -48
  651. package/src/rbac/compliance/pattern-detector.ts +0 -553
  652. package/src/rbac/compliance/quick-fix-suggestions.ts +0 -209
  653. package/src/rbac/compliance/runtime-compliance.ts +0 -99
  654. package/src/rbac/compliance/setup-validator.ts +0 -131
  655. package/src/rbac/components/index.ts +0 -26
  656. package/src/rbac/hooks/index.ts +0 -34
  657. package/src/rbac/hooks/permissions/index.ts +0 -4
  658. package/src/rbac/hooks/useRBAC.simple.test.ts +0 -95
  659. package/src/rbac/utils/__tests__/eventContext.unit.test.ts +0 -490
  660. package/src/utils/app/appNameResolver.simple.test.ts +0 -212
  661. package/src/utils/google-places/index.ts +0 -26
  662. package/src/utils/location/index.ts +0 -16
  663. package/src/utils/storage/__tests__/helpers.unit.test.ts +0 -332
  664. package/src/utils/timezone/index.ts +0 -17
  665. package/src/utils/validation/index.ts +0 -73
@@ -1,3 +1,18 @@
1
+ /**
2
+ * @file PaceAppLayout Integration Tests
3
+ * @package @jmruthers/pace-core
4
+ * @module Components/PaceAppLayout/Integration
5
+ * @since 0.1.0
6
+ *
7
+ * Comprehensive integration tests for PaceAppLayout component covering:
8
+ * - Integration with React Router
9
+ * - Integration with authentication providers
10
+ * - Integration with permission systems
11
+ * - Real-world user workflows
12
+ * - Configuration integration
13
+ * - Layout integration
14
+ */
15
+
1
16
  import React from 'react';
2
17
  import { render, screen, fireEvent, waitFor } from '@testing-library/react';
3
18
  import { describe, it, expect, vi, beforeEach } from 'vitest';
@@ -165,15 +180,16 @@ vi.mock('../../hooks/services/useEventService', () => ({
165
180
  // Mock useEvents hook (used by useEventTheme and ContextSelector)
166
181
  // Use the hoisted mockUseEventService so useEvents can work properly
167
182
  // But also provide a direct mock for components that import useEvents directly
168
- const mockUseEvents = vi.hoisted(() => vi.fn(() => ({
169
- selectedEvent: { event_id: 'event-123' },
170
- events: [],
171
- isLoading: false,
172
- error: null,
173
- setSelectedEvent: vi.fn(),
174
- refreshEvents: vi.fn(),
175
- clearEventSelection: vi.fn(),
176
- })));
183
+ // Note: mockUseEvents is defined but not currently used - kept for potential future use
184
+ // const mockUseEvents = vi.hoisted(() => vi.fn(() => ({
185
+ // selectedEvent: { event_id: 'event-123' },
186
+ // events: [],
187
+ // isLoading: false,
188
+ // error: null,
189
+ // setSelectedEvent: vi.fn(),
190
+ // refreshEvents: vi.fn(),
191
+ // clearEventSelection: vi.fn(),
192
+ // })));
177
193
 
178
194
  // Don't mock useEvents - let it use the mocked useEventService
179
195
  // The real useEvents will work because useEventService is mocked
@@ -231,7 +247,7 @@ vi.mock('../../providers/services/EventServiceProvider', () => {
231
247
  return React.createElement(MockContext.Provider, { value: mockContextValue }, children);
232
248
  },
233
249
  EventServiceContext: {
234
- Provider: ({ children, value }: any) => React.createElement('div', { 'data-testid': 'event-service-provider' }, children),
250
+ Provider: ({ children }: any) => React.createElement('div', { 'data-testid': 'event-service-provider' }, children),
235
251
  Consumer: ({ children }: any) => children(mockContextValue),
236
252
  },
237
253
  useEventService: mockUseEventService,
@@ -279,9 +295,9 @@ vi.mock('../../rbac/api', () => ({
279
295
  setupRBAC: vi.fn()
280
296
  }));
281
297
 
282
- // Mock RBAC hooks
298
+ // Mock RBAC hooks - mock individual files since barrel was removed
283
299
  // Reference hoisted mocks - they're available when factory runs
284
- vi.mock('../../rbac/hooks', () => ({
300
+ vi.mock('../../rbac/hooks/useRBAC', () => ({
285
301
  useRBAC: vi.fn(() => ({
286
302
  hasPermission: mockHasPermissionRBAC,
287
303
  isLoading: false,
@@ -294,7 +310,9 @@ vi.mock('../../rbac/hooks', () => ({
294
310
  eventRoles: [],
295
311
  permissionMap: {},
296
312
  })),
297
- useCan: mockUseCan,
313
+ }));
314
+
315
+ vi.mock('../../rbac/hooks/useResolvedScope', () => ({
298
316
  useResolvedScope: vi.fn(() => ({
299
317
  resolvedScope: { organisationId: 'org-123', eventId: 'event-123', appId: 'app-123' },
300
318
  isLoading: false,
@@ -302,6 +320,10 @@ vi.mock('../../rbac/hooks', () => ({
302
320
  })),
303
321
  }));
304
322
 
323
+ vi.mock('../../rbac/hooks/usePermissions', () => ({
324
+ useCan: mockUseCan,
325
+ }));
326
+
305
327
  // Mock ContextSelector to avoid useEventService requirement
306
328
  vi.mock('../ContextSelector', () => ({
307
329
  ContextSelector: vi.fn(({ placeholder, className, 'data-testid': testId }: any) => (
@@ -323,26 +345,24 @@ vi.mock('../Header', () => ({
323
345
  navItems,
324
346
  actions,
325
347
  userMenu,
326
- logo,
327
348
  logoUrl,
349
+ logoAlt,
328
350
  showContextSelector,
329
351
  showUserMenu,
330
352
  className
331
353
  }) => (
332
354
  <header data-testid="mock-header" role="banner" className={className}>
333
- <div data-testid="app-name">{logoUrl ? 'Test App' : 'Complex App'}</div>
355
+ <div data-testid="app-name">{logoAlt ? logoAlt.replace(' Logo', '') : 'Test App'}</div>
334
356
  <div data-testid="user-info">{user?.user_metadata?.display_name || user?.email}</div>
335
357
  <div data-testid="nav-items-count">{navItems?.length || 0}</div>
336
358
  {actions && actions}
337
359
  <div data-testid="has-actions">{actions ? 'true' : 'false'}</div>
338
360
  {userMenu && userMenu}
339
361
  <div data-testid="has-custom-user-menu">{userMenu ? 'true' : 'false'}</div>
340
- {logo && logo}
341
- <div data-testid="has-custom-logo">{logo ? 'true' : 'false'}</div>
342
362
  <div data-testid="logo-url">{logoUrl || 'default'}</div>
343
363
  <div data-testid="show-user-menu">{showUserMenu !== false ? 'true' : 'false'}</div>
344
364
  <nav data-testid="navigation">
345
- {navItems?.map((item, index) => (
365
+ {navItems?.map((item) => (
346
366
  <button
347
367
  key={item.id}
348
368
  data-testid={`nav-${item.id}`}
@@ -451,6 +471,7 @@ describe('PaceAppLayout Integration', () => {
451
471
 
452
472
  // Reset RBAC hook mocks
453
473
  // Access hoisted mocks directly (they're available in this scope)
474
+ // CRITICAL: All mocks must resolve immediately to prevent test hanging
454
475
  mockHasPermissionRBAC.mockClear();
455
476
  mockHasPermissionRBAC.mockResolvedValue(true);
456
477
  mockUseCan.mockReturnValue({
@@ -465,11 +486,12 @@ describe('PaceAppLayout Integration', () => {
465
486
  mockIsPermitted = vi.mocked(isPermitted);
466
487
 
467
488
  // Reset super admin mock (use module-level mockIsSuperAdmin)
489
+ // CRITICAL: Must resolve immediately to prevent hanging
468
490
  mockIsSuperAdmin.mockClear();
469
491
  mockIsSuperAdmin.mockResolvedValue(false);
470
492
 
471
493
  // Reset mockIsPermitted to default implementation
472
- mockIsPermitted.mockImplementation((input) => {
494
+ mockIsPermitted.mockImplementation((_input) => {
473
495
  return Promise.resolve(true);
474
496
  });
475
497
 
@@ -557,23 +579,6 @@ describe('PaceAppLayout Integration', () => {
557
579
  expect(screen.getByTestId('has-custom-user-menu')).toHaveTextContent('true');
558
580
  });
559
581
 
560
- it('integrates with custom logo', () => {
561
- const CustomLogo = () => (
562
- <div data-testid="custom-logo">
563
- <img src="/custom-logo.svg" alt="Custom Logo" />
564
- </div>
565
- );
566
-
567
- render(
568
- <TestWrapper>
569
- <PaceAppLayout appName="Test App" customLogo={<CustomLogo />} enforcePermissions={false} />
570
- </TestWrapper>
571
- );
572
-
573
- expect(screen.getByTestId('custom-logo')).toBeInTheDocument();
574
- expect(screen.getByTestId('has-custom-logo')).toHaveTextContent('true');
575
- expect(screen.getByTestId('logo-url')).toHaveTextContent('default');
576
- });
577
582
  });
578
583
 
579
584
  describe('Navigation Integration', () => {
@@ -698,7 +703,7 @@ describe('PaceAppLayout Integration', () => {
698
703
  { id: 'admin', label: 'Admin', href: '/admin' }
699
704
  ];
700
705
 
701
- it('integrates permission enforcement with navigation', async () => {
706
+ it('integrates permission enforcement with navigation', { timeout: 15000 }, async () => {
702
707
  const routePermissions = {
703
708
  '/dashboard': 'read',
704
709
  '/settings': 'read'
@@ -719,7 +724,7 @@ describe('PaceAppLayout Integration', () => {
719
724
  await waitFor(() => {
720
725
  expect(screen.getByTestId('mock-header')).toBeInTheDocument();
721
726
  expect(screen.getByTestId('mock-outlet')).toBeInTheDocument();
722
- }, { timeout: 2000 });
727
+ }, { timeout: 10000 });
723
728
  });
724
729
 
725
730
  it('integrates permission filtering with navigation items', async () => {
@@ -730,7 +735,6 @@ describe('PaceAppLayout Integration', () => {
730
735
  };
731
736
 
732
737
  // Get the mocked isPermitted and update it to deny 'private' page access
733
- const rbacApi = await import('../../rbac/api');
734
738
 
735
739
  render(
736
740
  <TestWrapper>
@@ -750,7 +754,7 @@ describe('PaceAppLayout Integration', () => {
750
754
  }, { timeout: 2000 });
751
755
  });
752
756
 
753
- it('integrates custom page ID mapping with permissions', async () => {
757
+ it('integrates custom page ID mapping with permissions', { timeout: 15000 }, async () => {
754
758
  const pageIdMapping = {
755
759
  '/test-path': 'custom-page-id'
756
760
  };
@@ -772,7 +776,7 @@ describe('PaceAppLayout Integration', () => {
772
776
  }, { timeout: 2000 });
773
777
  });
774
778
 
775
- it('integrates permission fallback with custom components', async () => {
779
+ it('integrates permission fallback with custom components', { timeout: 15000 }, async () => {
776
780
  // Mock the RBAC system to deny permission
777
781
  const CustomFallback = () => (
778
782
  <div data-testid="custom-fallback">
@@ -952,7 +956,7 @@ describe('PaceAppLayout Integration', () => {
952
956
  }, { timeout: 2000 });
953
957
  });
954
958
 
955
- it('handles complex navigation with custom items and permissions', async () => {
959
+ it('handles complex navigation with custom items and permissions', { timeout: 15000 }, async () => {
956
960
  // Mock permission check to filter admin access
957
961
  mockIsPermitted.mockImplementation((input) => {
958
962
  if (input.pageId === 'admin') return Promise.resolve(false);
@@ -1025,7 +1029,6 @@ describe('PaceAppLayout Integration', () => {
1025
1029
 
1026
1030
  const HeaderActions = () => <div data-testid="header-actions">Actions</div>;
1027
1031
  const CustomUserMenu = () => <div data-testid="custom-user-menu">Menu</div>;
1028
- const CustomLogo = () => <div data-testid="custom-logo">Logo</div>;
1029
1032
 
1030
1033
  const routePermissions = {
1031
1034
  '/custom1': 'read',
@@ -1044,7 +1047,6 @@ describe('PaceAppLayout Integration', () => {
1044
1047
  navItems={stableConfigNavItems}
1045
1048
  headerActions={<HeaderActions />}
1046
1049
  customUserMenu={<CustomUserMenu />}
1047
- customLogo={<CustomLogo />}
1048
1050
  showContextSelector={false}
1049
1051
  showUserMenu={false}
1050
1052
  headerClassName="complex-header-class"
@@ -1059,7 +1061,6 @@ describe('PaceAppLayout Integration', () => {
1059
1061
  // Verify all custom components are rendered
1060
1062
  expect(screen.getByTestId('header-actions')).toBeInTheDocument();
1061
1063
  expect(screen.getByTestId('custom-user-menu')).toBeInTheDocument();
1062
- expect(screen.getByTestId('custom-logo')).toBeInTheDocument();
1063
1064
 
1064
1065
  // Verify configuration is applied
1065
1066
  expect(screen.getByTestId('app-name')).toHaveTextContent('Complex App');
@@ -1069,7 +1070,7 @@ describe('PaceAppLayout Integration', () => {
1069
1070
  expect(screen.getByTestId('mock-header')).toHaveClass('complex-header-class');
1070
1071
  });
1071
1072
 
1072
- it('handles dynamic configuration changes', async () => {
1073
+ it('handles dynamic configuration changes', { timeout: 15000 }, async () => {
1073
1074
  // Ensure super admin check resolves immediately
1074
1075
  mockIsSuperAdmin.mockResolvedValue(false);
1075
1076
 
@@ -1,3 +1,17 @@
1
+ /**
2
+ * @file PaceAppLayout Performance Tests
3
+ * @package @jmruthers/pace-core
4
+ * @module Components/PaceAppLayout/Performance
5
+ * @since 0.1.0
6
+ *
7
+ * Comprehensive performance tests for PaceAppLayout component covering:
8
+ * - Render performance and optimization
9
+ * - Re-render prevention with stable props
10
+ * - Memory usage and cleanup
11
+ * - Navigation performance
12
+ * - Permission check performance
13
+ */
14
+
1
15
  import React from 'react';
2
16
  import { render, screen, fireEvent, waitFor } from '@testing-library/react';
3
17
  import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
@@ -202,6 +216,7 @@ vi.mock('../../providers/services/EventServiceProvider', () => {
202
216
 
203
217
  // Define mocks using vi.hoisted() so they're available in hoisted vi.mock factories
204
218
  // Note: Cannot export hoisted variables directly, so we define them and access directly in tests
219
+ // CRITICAL: All mocks must resolve immediately to prevent test hanging
205
220
  const mockIsPermitted = vi.hoisted(() => vi.fn().mockResolvedValue(true));
206
221
  const mockCheckPermission = vi.hoisted(() => vi.fn().mockResolvedValue(true));
207
222
  const mockHasPermissionRBAC = vi.hoisted(() => vi.fn().mockResolvedValue(true));
@@ -228,16 +243,17 @@ vi.mock('@supabase/supabase-js', () => {
228
243
 
229
244
  // Mock the new RBAC system for performance testing
230
245
  // Reference hoisted mocks - they're available when factory runs
246
+ // CRITICAL: All async mocks must resolve immediately to prevent test hanging
231
247
  vi.mock('../../rbac/api', () => ({
232
248
  isPermitted: mockIsPermitted,
233
249
  isPermittedCached: vi.fn().mockResolvedValue(true),
234
250
  getPermissionMap: vi.fn().mockResolvedValue({}),
235
251
  getAccessLevel: vi.fn().mockResolvedValue('viewer'),
236
252
  isSuperAdmin: mockIsSuperAdmin,
237
- setupRBAC: vi.fn()
253
+ setupRBAC: vi.fn().mockResolvedValue(undefined)
238
254
  }));
239
255
 
240
- // Mock RBAC hooks
256
+ // Mock RBAC hooks - mock individual files since barrel was removed
241
257
  // Reference hoisted mocks - they're available when factory runs
242
258
  // Mock useCan hook - create a mock function that can be controlled in tests
243
259
  const mockUseCanFn = vi.fn(() => ({
@@ -247,7 +263,7 @@ const mockUseCanFn = vi.fn(() => ({
247
263
  refetch: vi.fn().mockResolvedValue(undefined),
248
264
  }));
249
265
 
250
- vi.mock('../../rbac/hooks', () => ({
266
+ vi.mock('../../rbac/hooks/useRBAC', () => ({
251
267
  useRBAC: vi.fn(() => ({
252
268
  hasPermission: mockHasPermissionRBAC,
253
269
  isLoading: false,
@@ -260,7 +276,13 @@ vi.mock('../../rbac/hooks', () => ({
260
276
  eventRoles: [],
261
277
  permissionMap: {},
262
278
  })),
279
+ }));
280
+
281
+ vi.mock('../../rbac/hooks/usePermissions', () => ({
263
282
  useCan: (...args: any[]) => mockUseCanFn(...args),
283
+ }));
284
+
285
+ vi.mock('../../rbac/hooks/useResolvedScope', () => ({
264
286
  useResolvedScope: vi.fn(() => ({
265
287
  resolvedScope: { organisationId: 'org-123', eventId: 'event-123', appId: 'app-123' },
266
288
  isLoading: false,
@@ -370,6 +392,7 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
370
392
 
371
393
  (performance as any).memory = { usedJSHeapSize: 10_000_000 };
372
394
 
395
+ // CRITICAL: Ensure all async mocks resolve immediately to prevent hanging
373
396
  mockUpdatePassword.mockResolvedValue({ error: null });
374
397
  mockCheckPermission.mockClear();
375
398
  mockCheckPermission.mockResolvedValue(true);
@@ -378,15 +401,29 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
378
401
  // Reset RBAC hook mock
379
402
  mockHasPermissionRBAC.mockClear();
380
403
  mockHasPermissionRBAC.mockResolvedValue(true);
404
+ // Ensure super admin mock resolves immediately
405
+ mockIsSuperAdmin.mockClear();
406
+ mockIsSuperAdmin.mockResolvedValue(false);
407
+ // Reset useCan mock to return resolved state
408
+ mockUseCanFn.mockReturnValue({
409
+ can: true,
410
+ isLoading: false,
411
+ error: null,
412
+ refetch: vi.fn().mockResolvedValue(undefined),
413
+ });
381
414
  });
382
415
 
383
416
  afterEach(() => {
384
417
  performanceNowSpy?.mockRestore();
385
418
  (performance as any).memory = originalPerformanceMemory;
419
+ // Clear all timers to prevent hanging
420
+ vi.clearAllTimers();
421
+ // Ensure all mocks are reset
422
+ vi.clearAllMocks();
386
423
  });
387
424
 
388
425
  describe('Rendering Performance', () => {
389
- it('renders within performance threshold', async () => {
426
+ it('renders within performance threshold', { timeout: 10000 }, async () => {
390
427
  render(
391
428
  <TestWrapper>
392
429
  <PaceAppLayout appName="Test App" />
@@ -395,30 +432,27 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
395
432
 
396
433
  await waitFor(() => {
397
434
  expect(screen.getByTestId('mock-header')).toBeInTheDocument();
398
- });
435
+ }, { timeout: 5000 });
399
436
  });
400
437
 
401
- it('renders with custom components within threshold', async () => {
402
- const CustomLogo = () => <div data-testid="custom-logo">Custom Logo</div>;
438
+ it('renders with custom components within threshold', { timeout: 10000 }, async () => {
403
439
  const CustomUserMenu = () => <div data-testid="custom-user-menu">Custom Menu</div>;
404
440
 
405
441
  render(
406
442
  <TestWrapper>
407
443
  <PaceAppLayout
408
444
  appName="Test App"
409
- customLogo={<CustomLogo />}
410
445
  customUserMenu={<CustomUserMenu />}
411
446
  />
412
447
  </TestWrapper>
413
448
  );
414
449
 
415
450
  await waitFor(() => {
416
- expect(screen.getByTestId('custom-logo')).toBeInTheDocument();
417
451
  expect(screen.getByTestId('custom-user-menu')).toBeInTheDocument();
418
- });
452
+ }, { timeout: 5000 });
419
453
  });
420
454
 
421
- it('renders with large navigation items within threshold', async () => {
455
+ it('renders with large navigation items within threshold', { timeout: 10000 }, async () => {
422
456
  const largeNavItems = Array.from({ length: 50 }, (_, i) => ({
423
457
  id: `nav-${i}`,
424
458
  label: `Navigation ${i}`,
@@ -433,7 +467,7 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
433
467
 
434
468
  await waitFor(() => {
435
469
  expect(screen.getByTestId('mock-header')).toBeInTheDocument();
436
- });
470
+ }, { timeout: 5000 });
437
471
  expect(screen.getAllByRole('button').length).toBeGreaterThan(0);
438
472
  });
439
473
  });
@@ -452,7 +486,7 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
452
486
  // Wait for permission check to complete and component to render
453
487
  await waitFor(() => {
454
488
  expect(screen.getByTestId('mock-header')).toBeInTheDocument();
455
- });
489
+ }, { timeout: 5000 });
456
490
 
457
491
  // Use real performance.now() for accurate timing (temporarily restore the spy)
458
492
  // Note: We're measuring after mount, so this should be very fast
@@ -501,7 +535,7 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
501
535
  // Wait for component to fully mount (including super admin check)
502
536
  await waitFor(() => {
503
537
  expect(screen.getByTestId('mock-header')).toBeInTheDocument();
504
- });
538
+ }, { timeout: 5000 });
505
539
 
506
540
  // Use real performance.now() for accurate timing (temporarily restore the spy)
507
541
  performanceNowSpy?.mockRestore();
@@ -529,7 +563,7 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
529
563
  }
530
564
  });
531
565
 
532
- it('handles permission check errors efficiently', async () => {
566
+ it('handles permission check errors efficiently', { timeout: 10000 }, async () => {
533
567
  mockUseCanFn.mockReturnValue({
534
568
  can: false,
535
569
  isLoading: false,
@@ -545,12 +579,12 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
545
579
 
546
580
  await waitFor(() => {
547
581
  expect(screen.getByText('Permission check failed')).toBeInTheDocument();
548
- });
582
+ }, { timeout: 5000 });
549
583
  });
550
584
  });
551
585
 
552
586
  describe('Memory Usage', () => {
553
- it('does not cause significant memory leaks on re-renders', () => {
587
+ it('does not cause significant memory leaks on re-renders', { timeout: 10000 }, () => {
554
588
  const initialMemory = (performance as any).memory?.usedJSHeapSize || 0;
555
589
 
556
590
  const { rerender } = render(
@@ -581,7 +615,7 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
581
615
  }
582
616
  });
583
617
 
584
- it('handles large navigation items without memory issues', () => {
618
+ it('handles large navigation items without memory issues', { timeout: 10000 }, () => {
585
619
  const largeNavItems = Array.from({ length: 100 }, (_, i) => ({
586
620
  id: `nav-${i}`,
587
621
  label: `Navigation ${i}`,
@@ -611,7 +645,7 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
611
645
  });
612
646
 
613
647
  describe('Re-render Performance', () => {
614
- it('handles prop changes efficiently', () => {
648
+ it('handles prop changes efficiently', { timeout: 10000 }, () => {
615
649
  const { rerender } = render(
616
650
  <TestWrapper>
617
651
  <PaceAppLayout appName="Test App" />
@@ -646,7 +680,7 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
646
680
  }
647
681
  });
648
682
 
649
- it('handles permission enforcement toggles efficiently', async () => {
683
+ it('handles permission enforcement toggles efficiently', { timeout: 10000 }, async () => {
650
684
  // Ensure super admin check resolves immediately for performance testing
651
685
  mockIsSuperAdmin.mockResolvedValue(false);
652
686
 
@@ -659,7 +693,7 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
659
693
  // Wait for initial mount
660
694
  await waitFor(() => {
661
695
  expect(screen.getByTestId('mock-header')).toBeInTheDocument();
662
- });
696
+ }, { timeout: 5000 });
663
697
 
664
698
  // Use real performance.now() for accurate timing (temporarily restore the spy)
665
699
  performanceNowSpy?.mockRestore();
@@ -672,7 +706,10 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
672
706
  </TestWrapper>
673
707
  );
674
708
 
675
- await new Promise(resolve => setTimeout(resolve, 10));
709
+ // Wait for re-render to complete
710
+ await waitFor(() => {
711
+ expect(screen.getByTestId('mock-header')).toBeInTheDocument();
712
+ }, { timeout: 1000 });
676
713
 
677
714
  rerender(
678
715
  <TestWrapper>
@@ -701,7 +738,7 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
701
738
  });
702
739
 
703
740
  describe('Navigation Performance', () => {
704
- it('handles rapid navigation efficiently', () => {
741
+ it('handles rapid navigation efficiently', { timeout: 10000 }, () => {
705
742
  const navItems = [
706
743
  { id: 'home', label: 'Home', href: '/' },
707
744
  { id: 'dashboard', label: 'Dashboard', href: '/dashboard' },
@@ -731,18 +768,18 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
731
768
 
732
769
  // Rapidly click navigation buttons
733
770
  // If not, this test will fail.
734
- // @ts-ignore
771
+ // @ts-expect-error - fireEvent.click is used for performance testing
735
772
  fireEvent.click(screen.getByTestId('nav-nav-0'));
736
- // @ts-ignore
773
+ // @ts-expect-error - fireEvent.click is used for performance testing
737
774
  fireEvent.click(screen.getByTestId('nav-nav-1'));
738
- // @ts-ignore
775
+ // @ts-expect-error - fireEvent.click is used for performance testing
739
776
  fireEvent.click(screen.getByTestId('nav-nav-2'));
740
777
 
741
778
  // Should handle rapid navigation without performance issues
742
779
  expect(mockNavigate).toHaveBeenCalledTimes(3);
743
780
  });
744
781
 
745
- it('handles large navigation items efficiently', () => {
782
+ it('handles large navigation items efficiently', { timeout: 10000 }, () => {
746
783
  const largeNavItems = Array.from({ length: 50 }, (_, i) => ({
747
784
  id: `nav-${i}`,
748
785
  label: `Navigation ${i}`,
@@ -760,7 +797,7 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
760
797
  // Click on multiple navigation items
761
798
  for (let i = 0; i < 5; i++) {
762
799
  const navButton = screen.getByTestId(`nav-nav-${i}`);
763
- // @ts-ignore
800
+ // @ts-expect-error - fireEvent.click expects specific event types, but test environment allows this
764
801
  fireEvent.click(navButton);
765
802
  }
766
803
 
@@ -772,7 +809,7 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
772
809
  });
773
810
 
774
811
  describe('Authentication Performance', () => {
775
- it('handles authentication actions efficiently', async () => {
812
+ it('handles authentication actions efficiently', { timeout: 10000 }, async () => {
776
813
  // Ensure super admin check resolves immediately for performance testing
777
814
  mockIsSuperAdmin.mockResolvedValue(false);
778
815
 
@@ -789,7 +826,7 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
789
826
  // Wait for component to fully mount (including super admin check)
790
827
  await waitFor(() => {
791
828
  expect(screen.getByTestId('mock-header')).toBeInTheDocument();
792
- });
829
+ }, { timeout: 5000 });
793
830
 
794
831
  // Use real performance.now() for accurate timing (temporarily restore the spy)
795
832
  performanceNowSpy?.mockRestore();
@@ -802,8 +839,11 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
802
839
  fireEvent.click(signOutButton);
803
840
  fireEvent.click(changePasswordButton);
804
841
 
805
- // Wait for async operations to complete
806
- await new Promise(resolve => setTimeout(resolve, 50));
842
+ // Wait for async operations to complete with timeout
843
+ await waitFor(() => {
844
+ expect(mockSignOut).toHaveBeenCalled();
845
+ expect(mockUpdatePassword).toHaveBeenCalled();
846
+ }, { timeout: 1000 });
807
847
 
808
848
  const endTime = performance.now();
809
849
  const authTime = endTime - startTime;
@@ -827,7 +867,7 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
827
867
  expect(mockUpdatePassword).toHaveBeenCalledWith('newpassword123');
828
868
  });
829
869
 
830
- it('handles authentication errors efficiently', async () => {
870
+ it('handles authentication errors efficiently', { timeout: 10000 }, async () => {
831
871
  // Ensure super admin check resolves immediately for performance testing
832
872
  mockIsSuperAdmin.mockResolvedValue(false);
833
873
 
@@ -846,7 +886,7 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
846
886
  // Wait for component to fully mount (including super admin check)
847
887
  await waitFor(() => {
848
888
  expect(screen.getByTestId('mock-header')).toBeInTheDocument();
849
- });
889
+ }, { timeout: 5000 });
850
890
 
851
891
  // Use real performance.now() for accurate timing (temporarily restore the spy)
852
892
  performanceNowSpy?.mockRestore();
@@ -859,8 +899,11 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
859
899
  fireEvent.click(signOutButton);
860
900
  fireEvent.click(changePasswordButton);
861
901
 
862
- // Wait for async operations to complete
863
- await new Promise(resolve => setTimeout(resolve, 50));
902
+ // Wait for async operations to complete with timeout
903
+ await waitFor(() => {
904
+ expect(mockSignOut).toHaveBeenCalled();
905
+ expect(mockUpdatePassword).toHaveBeenCalled();
906
+ }, { timeout: 1000 });
864
907
 
865
908
  const endTime = performance.now();
866
909
  const authTime = endTime - startTime;
@@ -884,7 +927,7 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
884
927
  });
885
928
 
886
929
  describe('Complex Configuration Performance', () => {
887
- it('handles complex configurations efficiently', async () => {
930
+ it('handles complex configurations efficiently', { timeout: 10000 }, async () => {
888
931
  const customNavItems = Array.from({ length: 20 }, (_, i) => ({
889
932
  id: `nav-${i}`,
890
933
  label: `Navigation ${i}`,
@@ -939,7 +982,7 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
939
982
  await waitFor(() => {
940
983
  expect(screen.getByTestId('header-actions')).toBeInTheDocument();
941
984
  expect(screen.getByTestId('custom-user-menu')).toBeInTheDocument();
942
- });
985
+ }, { timeout: 5000 });
943
986
 
944
987
  const endTime = performance.now();
945
988
  const renderTime = endTime - startTime;