@jmruthers/pace-core 0.5.68 → 0.5.69

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (375) hide show
  1. package/dist/{DataTable-4IUY7BXB.js → DataTable-MPBSXUC6.js} +5 -6
  2. package/dist/{PublicLoadingSpinner-DdKXTkCZ.d.ts → PublicLoadingSpinner-BOdyU3u-.d.ts} +1 -1
  3. package/dist/{chunk-PXWEDX7Y.js → chunk-2ARQW6VX.js} +3 -3
  4. package/dist/{chunk-MOJXHWDE.js → chunk-6JILXFEA.js} +335 -5
  5. package/dist/chunk-6JILXFEA.js.map +1 -0
  6. package/dist/{chunk-D7ARGIA3.js → chunk-6RBH67W7.js} +23 -6
  7. package/dist/chunk-6RBH67W7.js.map +1 -0
  8. package/dist/{chunk-ZMS23NS5.js → chunk-FJTAWPAQ.js} +3 -5
  9. package/dist/{chunk-ZMS23NS5.js.map → chunk-FJTAWPAQ.js.map} +1 -1
  10. package/dist/{chunk-OPCWH3A4.js → chunk-NO5QHMDX.js} +7 -6
  11. package/dist/chunk-NO5QHMDX.js.map +1 -0
  12. package/dist/{chunk-ZPK5656W.js → chunk-O3NWNXDY.js} +4 -5
  13. package/dist/chunk-O3NWNXDY.js.map +1 -0
  14. package/dist/{chunk-UYA6U6H7.js → chunk-Q2UP3ZWQ.js} +4 -4
  15. package/dist/{chunk-KRCRNXPD.js → chunk-RVYGJPOD.js} +79 -18
  16. package/dist/chunk-RVYGJPOD.js.map +1 -0
  17. package/dist/{chunk-NN45OBIS.js → chunk-UCMHBF7Y.js} +3 -5
  18. package/dist/{chunk-NN45OBIS.js.map → chunk-UCMHBF7Y.js.map} +1 -1
  19. package/dist/{chunk-ZPG4XPV5.js → chunk-V3QO3LL7.js} +5 -7
  20. package/dist/chunk-V3QO3LL7.js.map +1 -0
  21. package/dist/{chunk-U6GPOF6J.js → chunk-ZXJGZLLO.js} +17 -17
  22. package/dist/{chunk-U6GPOF6J.js.map → chunk-ZXJGZLLO.js.map} +1 -1
  23. package/dist/components.d.ts +1 -1
  24. package/dist/components.js +8 -9
  25. package/dist/components.js.map +1 -1
  26. package/dist/hooks.d.ts +1 -1
  27. package/dist/hooks.js +9 -6
  28. package/dist/hooks.js.map +1 -1
  29. package/dist/index.d.ts +3 -3
  30. package/dist/index.js +16 -16
  31. package/dist/index.js.map +1 -1
  32. package/dist/providers.js +5 -7
  33. package/dist/rbac/index.js +5 -6
  34. package/dist/{usePublicRouteParams-CdoFxnJK.d.ts → usePublicRouteParams-Ua1Vz-HG.d.ts} +35 -1
  35. package/dist/utils.d.ts +4 -1
  36. package/dist/utils.js +3 -3
  37. package/docs/DOCUMENTATION_CHECKLIST.md +281 -0
  38. package/docs/README.md +22 -10
  39. package/docs/api/classes/ColumnFactory.md +1 -1
  40. package/docs/api/classes/ErrorBoundary.md +1 -1
  41. package/docs/api/classes/InvalidScopeError.md +1 -1
  42. package/docs/api/classes/MissingUserContextError.md +1 -1
  43. package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
  44. package/docs/api/classes/PermissionDeniedError.md +1 -1
  45. package/docs/api/classes/PublicErrorBoundary.md +1 -1
  46. package/docs/api/classes/RBACAuditManager.md +1 -1
  47. package/docs/api/classes/RBACCache.md +1 -1
  48. package/docs/api/classes/RBACEngine.md +1 -1
  49. package/docs/api/classes/RBACError.md +1 -1
  50. package/docs/api/classes/RBACNotInitializedError.md +1 -1
  51. package/docs/api/classes/SecureSupabaseClient.md +1 -1
  52. package/docs/api/classes/StorageUtils.md +1 -1
  53. package/docs/api/interfaces/AggregateConfig.md +1 -1
  54. package/docs/api/interfaces/ButtonProps.md +1 -1
  55. package/docs/api/interfaces/CardProps.md +1 -1
  56. package/docs/api/interfaces/ColorPalette.md +1 -1
  57. package/docs/api/interfaces/ColorShade.md +1 -1
  58. package/docs/api/interfaces/DataAccessRecord.md +1 -1
  59. package/docs/api/interfaces/DataTableAction.md +1 -1
  60. package/docs/api/interfaces/DataTableColumn.md +1 -1
  61. package/docs/api/interfaces/DataTableProps.md +1 -1
  62. package/docs/api/interfaces/DataTableToolbarButton.md +1 -1
  63. package/docs/api/interfaces/EmptyStateConfig.md +1 -1
  64. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
  65. package/docs/api/interfaces/EventContextType.md +1 -1
  66. package/docs/api/interfaces/EventLogoProps.md +1 -1
  67. package/docs/api/interfaces/EventProviderProps.md +1 -1
  68. package/docs/api/interfaces/FileSizeLimits.md +1 -1
  69. package/docs/api/interfaces/FileUploadProps.md +1 -1
  70. package/docs/api/interfaces/FooterProps.md +1 -1
  71. package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
  72. package/docs/api/interfaces/InputProps.md +1 -1
  73. package/docs/api/interfaces/LabelProps.md +1 -1
  74. package/docs/api/interfaces/LoginFormProps.md +1 -1
  75. package/docs/api/interfaces/NavigationAccessRecord.md +1 -1
  76. package/docs/api/interfaces/NavigationContextType.md +1 -1
  77. package/docs/api/interfaces/NavigationGuardProps.md +1 -1
  78. package/docs/api/interfaces/NavigationItem.md +1 -1
  79. package/docs/api/interfaces/NavigationMenuProps.md +1 -1
  80. package/docs/api/interfaces/NavigationProviderProps.md +1 -1
  81. package/docs/api/interfaces/Organisation.md +1 -1
  82. package/docs/api/interfaces/OrganisationContextType.md +1 -1
  83. package/docs/api/interfaces/OrganisationMembership.md +1 -1
  84. package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
  85. package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
  86. package/docs/api/interfaces/PaceAppLayoutProps.md +1 -1
  87. package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
  88. package/docs/api/interfaces/PageAccessRecord.md +1 -1
  89. package/docs/api/interfaces/PagePermissionContextType.md +1 -1
  90. package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
  91. package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
  92. package/docs/api/interfaces/PaletteData.md +1 -1
  93. package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
  94. package/docs/api/interfaces/PublicErrorBoundaryProps.md +1 -1
  95. package/docs/api/interfaces/PublicErrorBoundaryState.md +1 -1
  96. package/docs/api/interfaces/PublicLoadingSpinnerProps.md +1 -1
  97. package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
  98. package/docs/api/interfaces/PublicPageHeaderProps.md +2 -2
  99. package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
  100. package/docs/api/interfaces/RBACConfig.md +1 -1
  101. package/docs/api/interfaces/RBACContextType.md +1 -1
  102. package/docs/api/interfaces/RBACLogger.md +1 -1
  103. package/docs/api/interfaces/RBACProviderProps.md +1 -1
  104. package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
  105. package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
  106. package/docs/api/interfaces/RouteAccessRecord.md +1 -1
  107. package/docs/api/interfaces/RouteConfig.md +1 -1
  108. package/docs/api/interfaces/SecureDataContextType.md +1 -1
  109. package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
  110. package/docs/api/interfaces/StorageConfig.md +1 -1
  111. package/docs/api/interfaces/StorageFileInfo.md +1 -1
  112. package/docs/api/interfaces/StorageFileMetadata.md +1 -1
  113. package/docs/api/interfaces/StorageListOptions.md +1 -1
  114. package/docs/api/interfaces/StorageListResult.md +1 -1
  115. package/docs/api/interfaces/StorageUploadOptions.md +1 -1
  116. package/docs/api/interfaces/StorageUploadResult.md +1 -1
  117. package/docs/api/interfaces/StorageUrlOptions.md +1 -1
  118. package/docs/api/interfaces/StyleImport.md +1 -1
  119. package/docs/api/interfaces/SwitchProps.md +1 -1
  120. package/docs/api/interfaces/ToastActionElement.md +1 -1
  121. package/docs/api/interfaces/ToastProps.md +1 -1
  122. package/docs/api/interfaces/UnifiedAuthContextType.md +1 -1
  123. package/docs/api/interfaces/UnifiedAuthProviderProps.md +1 -1
  124. package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
  125. package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
  126. package/docs/api/interfaces/UsePublicEventLogoOptions.md +1 -1
  127. package/docs/api/interfaces/UsePublicEventLogoReturn.md +1 -1
  128. package/docs/api/interfaces/UsePublicEventOptions.md +1 -1
  129. package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
  130. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
  131. package/docs/api/interfaces/UserEventAccess.md +1 -1
  132. package/docs/api/interfaces/UserMenuProps.md +1 -1
  133. package/docs/api/interfaces/UserProfile.md +1 -1
  134. package/docs/api/modules.md +39 -14
  135. package/docs/architecture/services.md +374 -0
  136. package/docs/best-practices/README.md +1 -1
  137. package/docs/best-practices/testing.md +1 -1
  138. package/docs/breaking-changes.md +182 -0
  139. package/docs/common-patterns.md +445 -0
  140. package/docs/core-concepts/authentication.md +26 -11
  141. package/docs/core-concepts/events.md +2 -0
  142. package/docs/core-concepts/organisations.md +2 -0
  143. package/docs/core-concepts/permissions.md +2 -0
  144. package/docs/{INDEX.md → documentation-index.md} +26 -38
  145. package/docs/faq.md +286 -0
  146. package/docs/{FILE_REFERENCE_SYSTEM.md → file-reference-system.md} +1 -1
  147. package/docs/getting-started/installation-guide.md +284 -0
  148. package/docs/getting-started/quick-start.md +8 -1
  149. package/docs/implementation-guides/app-layout.md +3 -1
  150. package/docs/implementation-guides/data-tables.md +2 -0
  151. package/docs/implementation-guides/dynamic-colors.md +47 -2
  152. package/docs/implementation-guides/event-theming-summary.md +220 -0
  153. package/docs/implementation-guides/forms.md +9 -7
  154. package/docs/implementation-guides/navigation.md +2 -0
  155. package/docs/migration/service-architecture.md +351 -0
  156. package/docs/rbac/README-rbac-rls-integration.md +2 -2
  157. package/docs/rbac/README.md +1 -1
  158. package/docs/rbac/examples/rbac-rls-integration-example.md +3 -3
  159. package/docs/rbac/quick-start.md +2 -0
  160. package/docs/rbac/rbac-rls-integration.md +2 -2
  161. package/docs/style-guide.md +136 -1
  162. package/docs/testing/README.md +1 -1
  163. package/docs/troubleshooting/authentication-issues.md +334 -0
  164. package/docs/troubleshooting/common-issues.md +2 -0
  165. package/docs/troubleshooting/styling-issues.md +199 -144
  166. package/docs/usage.md +23 -2
  167. package/package.json +1 -1
  168. package/src/__tests__/{TESTING_GUIDELINES.md → TEST_GUIDE_CURSOR.md} +20 -0
  169. package/src/__tests__/TEST_GUIDE_HUMAN.md +103 -0
  170. package/src/__tests__/fixtures/test-data.ts +90 -0
  171. package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +260 -0
  172. package/src/__tests__/helpers/__tests__/optimized-test-setup.test.ts +224 -0
  173. package/src/__tests__/helpers/__tests__/supabaseMock.test.ts +273 -0
  174. package/src/__tests__/helpers/__tests__/test-providers.test.tsx +98 -0
  175. package/src/__tests__/helpers/__tests__/test-utils.test.tsx +436 -0
  176. package/src/__tests__/helpers/__tests__/timer-utils.test.ts +371 -0
  177. package/src/__tests__/helpers/component-test-utils.tsx +14 -4
  178. package/src/__tests__/helpers/optimized-test-setup.ts +68 -0
  179. package/src/__tests__/helpers/test-providers.tsx +329 -0
  180. package/src/__tests__/helpers/test-utils.tsx +91 -45
  181. package/src/__tests__/helpers/timer-utils.ts +71 -0
  182. package/src/__tests__/hooks/usePermissions.test.ts +1 -5
  183. package/src/__tests__/integration/UserProfile.test.tsx +1 -5
  184. package/src/__tests__/rbac/PagePermissionGuard.test.tsx +42 -12
  185. package/src/__tests__/setup.ts +34 -28
  186. package/src/components/Alert/Alert.test.tsx +1 -5
  187. package/src/components/Avatar/Avatar.test.tsx +1 -5
  188. package/src/components/Button/Button.test.tsx +4 -20
  189. package/src/components/Card/Card.test.tsx +1 -5
  190. package/src/components/Checkbox/Checkbox.test.tsx +1 -5
  191. package/src/components/DataTable/__tests__/DataTable.comprehensive.test.tsx +1 -5
  192. package/src/components/DataTable/__tests__/DataTable.test.tsx +45 -49
  193. package/src/components/DataTable/__tests__/DataTableCore.test.tsx +1 -5
  194. package/src/components/DataTable/__tests__/styles.test.ts +382 -0
  195. package/src/components/DataTable/context/__tests__/DataTableContext.test.tsx +409 -0
  196. package/src/components/DataTable/core/__tests__/ActionManager.test.ts +634 -0
  197. package/src/components/DataTable/core/__tests__/DataManager.test.ts +519 -0
  198. package/src/components/DataTable/core/__tests__/StateManager.test.ts +714 -0
  199. package/src/components/DataTable/hooks/__tests__/useDataTableState.test.ts +592 -0
  200. package/src/components/DataTable/utils/__tests__/exportUtils.test.ts +354 -0
  201. package/src/components/DataTable/utils/__tests__/hierarchicalUtils.test.ts +539 -0
  202. package/src/components/Dialog/examples/__tests__/SmartDialogExample.unit.test.tsx +1 -5
  203. package/src/components/Dialog/utils/__tests__/safeHtml.unit.test.ts +1 -8
  204. package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +34 -38
  205. package/src/components/Footer/Footer.test.tsx +1 -5
  206. package/src/components/Form/Form.test.tsx +22 -35
  207. package/src/components/Header/Header.test.tsx +1 -9
  208. package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +1 -5
  209. package/src/components/Input/Input.test.tsx +2 -10
  210. package/src/components/LoginForm/LoginForm.test.tsx +1 -5
  211. package/src/components/NavigationMenu/NavigationMenu.test.tsx +24 -24
  212. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.accessibility.test.tsx +1 -6
  213. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.integration.test.tsx +6 -16
  214. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.performance.test.tsx +1 -5
  215. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.rbac.test.tsx +1 -5
  216. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +1 -7
  217. package/src/components/PasswordReset/PasswordChangeForm.test.tsx +1 -9
  218. package/src/components/PasswordReset/PasswordResetForm.test.tsx +1 -9
  219. package/src/components/PublicLayout/PublicErrorBoundary.tsx +4 -5
  220. package/src/components/PublicLayout/PublicPageHeader.tsx +13 -9
  221. package/src/components/PublicLayout/__tests__/EventLogo.test.tsx +666 -0
  222. package/src/components/PublicLayout/__tests__/PublicErrorBoundary.test.tsx +457 -0
  223. package/src/components/PublicLayout/__tests__/PublicLoadingSpinner.test.tsx +393 -0
  224. package/src/components/PublicLayout/__tests__/PublicPageFooter.test.tsx +351 -0
  225. package/src/components/PublicLayout/__tests__/PublicPageHeader.test.tsx +374 -0
  226. package/src/components/PublicLayout/__tests__/PublicPageLayout.test.tsx +388 -0
  227. package/src/components/Select/Select.bug-test.tsx +69 -0
  228. package/src/components/Select/Select.refactored.tsx +497 -0
  229. package/src/components/Select/Select.test.tsx +42 -49
  230. package/src/components/Select/Select.tsx +5 -2
  231. package/src/components/Select/hooks.ts +254 -0
  232. package/src/components/Switch/Switch.test.tsx +1 -5
  233. package/src/components/Table/__tests__/Table.test.tsx +775 -0
  234. package/src/components/Toast/Toast.test.tsx +15 -8
  235. package/src/components/Tooltip/Tooltip.test.tsx +1 -5
  236. package/src/components/UserMenu/UserMenu.test.tsx +3 -15
  237. package/src/components/__tests__/FileDisplay.test.tsx +575 -0
  238. package/src/components/__tests__/FileUpload.test.tsx +446 -0
  239. package/src/components/__tests__/SuperAdminGuard.test.tsx +422 -354
  240. package/src/hooks/__tests__/ServiceHooks.test.tsx +613 -0
  241. package/src/hooks/__tests__/hooks.integration.test.tsx +1 -10
  242. package/src/hooks/__tests__/useApiFetch.unit.test.ts +10 -14
  243. package/src/hooks/__tests__/useAppConfig.unit.test.ts +307 -0
  244. package/src/hooks/__tests__/useComponentPerformance.unit.test.tsx +1 -6
  245. package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +1 -5
  246. package/src/hooks/__tests__/useOrganisationPermissions.unit.test.tsx +6 -9
  247. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +321 -0
  248. package/src/hooks/__tests__/usePublicEvent.unit.test.ts +583 -0
  249. package/src/hooks/__tests__/usePublicEventLogo.unit.test.ts +640 -0
  250. package/src/hooks/__tests__/usePublicRouteParams.unit.test.ts +435 -0
  251. package/src/hooks/__tests__/useRBAC.unit.test.ts +10 -10
  252. package/src/hooks/__tests__/useStorage.unit.test.ts +751 -0
  253. package/src/hooks/index.ts +3 -0
  254. package/src/hooks/public/usePublicEvent.ts +30 -9
  255. package/src/hooks/public/usePublicRouteParams.ts +13 -3
  256. package/src/hooks/services/useAuth.ts +50 -0
  257. package/src/hooks/services/useAuthService.ts +30 -0
  258. package/src/hooks/services/useCurrentEvent.ts +36 -0
  259. package/src/hooks/services/useCurrentOrganisation.ts +52 -0
  260. package/src/hooks/services/useEventService.ts +30 -0
  261. package/src/hooks/services/useInactivityService.ts +30 -0
  262. package/src/hooks/services/useOrganisationService.ts +30 -0
  263. package/src/hooks/services/usePermissions.ts +70 -0
  264. package/src/hooks/services/useRBACService.ts +30 -0
  265. package/src/hooks/useCounter.test.ts +1 -5
  266. package/src/hooks/useEventTheme.ts +86 -0
  267. package/src/hooks/useOrganisationPermissions.test.ts +2 -5
  268. package/src/hooks/useOrganisationSecurity.test.ts +1 -5
  269. package/src/hooks/usePermissionCache.test.ts +1 -5
  270. package/src/hooks/usePermissionCheck.ts +150 -0
  271. package/src/hooks/useSecureDataAccess.test.ts +1 -5
  272. package/src/index.ts +1 -0
  273. package/src/providers/OrganisationProvider.test.tsx +1 -5
  274. package/src/providers/OrganisationProvider.tsx +56 -4
  275. package/src/providers/UnifiedAuthProvider.test.tsx +1 -5
  276. package/src/providers/__tests__/AuthProvider.test.tsx +105 -439
  277. package/src/providers/__tests__/AuthProvider.test.tsx.backup +771 -0
  278. package/src/providers/__tests__/EventProvider.test.tsx +211 -110
  279. package/src/providers/__tests__/EventProvider.test.tsx.backup +824 -0
  280. package/src/providers/__tests__/InactivityProvider.test.tsx +1 -5
  281. package/src/providers/__tests__/OrganisationProvider.test.tsx +97 -261
  282. package/src/providers/__tests__/OrganisationProvider.test.tsx.backup +820 -0
  283. package/src/providers/__tests__/ServiceProviders.test.tsx +477 -0
  284. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +72 -504
  285. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx.backup +911 -0
  286. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx.backup2 +166 -0
  287. package/src/providers/services/AuthServiceProvider.tsx +65 -0
  288. package/src/providers/services/EventServiceProvider.tsx +83 -0
  289. package/src/providers/services/InactivityServiceProvider.tsx +83 -0
  290. package/src/providers/services/OrganisationServiceProvider.tsx +77 -0
  291. package/src/providers/services/RBACServiceProvider.tsx +79 -0
  292. package/src/providers/services/UnifiedAuthProvider.tsx +368 -0
  293. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +210 -0
  294. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +269 -0
  295. package/src/rbac/__tests__/adapters.comprehensive.test.tsx +892 -0
  296. package/src/rbac/__tests__/engine.comprehensive.test.ts +954 -0
  297. package/src/rbac/__tests__/integration.authflow.test.tsx +1 -5
  298. package/src/rbac/__tests__/integration.navigation.test.tsx +1 -4
  299. package/src/rbac/__tests__/rbac-core.test.tsx +2 -7
  300. package/src/rbac/__tests__/rbac-functions.test.ts +1 -9
  301. package/src/rbac/__tests__/rbac-integration.test.ts +1 -9
  302. package/src/rbac/api.test.ts +1 -9
  303. package/src/rbac/cache.test.ts +10 -8
  304. package/src/rbac/cli/__tests__/policy-manager.test.ts +339 -0
  305. package/src/rbac/components/EnhancedNavigationMenu.test.tsx +1 -5
  306. package/src/rbac/components/NavigationProvider.test.tsx +1 -5
  307. package/src/rbac/components/PagePermissionProvider.test.tsx +1 -5
  308. package/src/rbac/components/SecureDataProvider.test.tsx +1 -5
  309. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +25 -29
  310. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +27 -30
  311. package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +23 -27
  312. package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +18 -22
  313. package/src/rbac/config.test.ts +1 -5
  314. package/src/rbac/hooks/useCan.test.ts +262 -9
  315. package/src/rbac/hooks/usePermissions.test.ts +246 -6
  316. package/src/rbac/hooks/useRBAC.simple.test.ts +1 -5
  317. package/src/rbac/hooks/useRBAC.test.ts +472 -198
  318. package/src/rbac/providers/__tests__/RBACProvider.test.tsx +1 -9
  319. package/src/services/AuthService.ts +416 -0
  320. package/src/services/EventService.ts +366 -0
  321. package/src/services/InactivityService.ts +388 -0
  322. package/src/services/OrganisationService.ts +592 -0
  323. package/src/services/RBACService.ts +522 -0
  324. package/src/services/__tests__/AuthService.test.ts +356 -0
  325. package/src/services/__tests__/BaseService.test.ts +314 -0
  326. package/src/services/__tests__/EventService.test.ts +489 -0
  327. package/src/services/__tests__/InactivityService.test.ts +403 -0
  328. package/src/services/__tests__/OrganisationService.test.ts +660 -0
  329. package/src/services/__tests__/RBACService.test.ts +492 -0
  330. package/src/services/base/BaseService.ts +87 -0
  331. package/src/services/interfaces/IAuthService.ts +39 -0
  332. package/src/services/interfaces/IEventService.ts +30 -0
  333. package/src/services/interfaces/IInactivityService.ts +31 -0
  334. package/src/services/interfaces/IOrganisationService.ts +41 -0
  335. package/src/services/interfaces/IRBACService.ts +62 -0
  336. package/src/theming/__tests__/runtime.test.ts +540 -0
  337. package/src/types/__tests__/file-reference.test.ts +447 -0
  338. package/src/types/__tests__/organisation.test.ts +1133 -0
  339. package/src/types/__tests__/theme.test.ts +830 -0
  340. package/src/types/__tests__/type-validation.test.ts +527 -0
  341. package/src/utils/__tests__/bundleAnalysis.unit.test.ts +1 -5
  342. package/src/utils/__tests__/debugLogger.test.ts +417 -0
  343. package/src/utils/__tests__/deviceFingerprint.unit.test.ts +1 -6
  344. package/src/utils/__tests__/dynamicUtils.unit.test.ts +1 -5
  345. package/src/utils/__tests__/lazyLoad.unit.test.tsx +35 -35
  346. package/src/utils/__tests__/organisationContext.unit.test.ts +1 -5
  347. package/src/utils/__tests__/performanceBudgets.unit.test.ts +5 -11
  348. package/src/utils/__tests__/secureErrors.unit.test.ts +1 -6
  349. package/src/utils/__tests__/secureStorage.unit.test.ts +1 -5
  350. package/src/utils/__tests__/securityMonitor.unit.test.ts +1 -5
  351. package/src/utils/__tests__/sessionTracking.unit.test.ts +1 -5
  352. package/src/utils/appIdResolver.test.ts +6 -10
  353. package/src/utils/appNameResolver.simple.test.ts +142 -0
  354. package/src/utils/appNameResolver.test.ts +31 -458
  355. package/src/utils/appNameResolver.test.ts.backup +494 -0
  356. package/src/utils/debugLogger.ts +26 -5
  357. package/src/utils/formatDate.test.ts +1 -5
  358. package/src/utils/organisationContext.test.ts +1 -5
  359. package/src/utils/performanceBudgets.ts +3 -4
  360. package/src/utils/secureDataAccess.test.ts +1 -5
  361. package/src/utils/storage/__tests__/helpers.unit.test.ts +1 -5
  362. package/src/validation/__tests__/sqlInjectionProtection.unit.test.ts +1 -5
  363. package/dist/chunk-D7ARGIA3.js.map +0 -1
  364. package/dist/chunk-IPCH4YPT.js +0 -315
  365. package/dist/chunk-IPCH4YPT.js.map +0 -1
  366. package/dist/chunk-KRCRNXPD.js.map +0 -1
  367. package/dist/chunk-MOJXHWDE.js.map +0 -1
  368. package/dist/chunk-OPCWH3A4.js.map +0 -1
  369. package/dist/chunk-ZPG4XPV5.js.map +0 -1
  370. package/dist/chunk-ZPK5656W.js.map +0 -1
  371. package/docs/getting-started/installation.md +0 -269
  372. package/src/__tests__/REBUILD_PLAN.md +0 -223
  373. /package/dist/{DataTable-4IUY7BXB.js.map → DataTable-MPBSXUC6.js.map} +0 -0
  374. /package/dist/{chunk-PXWEDX7Y.js.map → chunk-2ARQW6VX.js.map} +0 -0
  375. /package/dist/{chunk-UYA6U6H7.js.map → chunk-Q2UP3ZWQ.js.map} +0 -0
@@ -90,11 +90,7 @@ describe('NavigationGuard Component', () => {
90
90
  });
91
91
  });
92
92
 
93
- afterEach(() => {
94
- vi.restoreAllMocks();
95
- });
96
-
97
- describe('Rendering', () => {
93
+ describe('Rendering', () => {
98
94
  it('renders children when permission is granted', async () => {
99
95
  mockUseCan.mockReturnValue({
100
96
  can: true,
@@ -111,7 +107,7 @@ describe('NavigationGuard Component', () => {
111
107
  await waitFor(() => {
112
108
  expect(screen.getByTestId('test-component')).toBeInTheDocument();
113
109
  expect(screen.getByText('Navigation Link')).toBeInTheDocument();
114
- });
110
+ }, { interval: 10 });
115
111
  });
116
112
 
117
113
  it('renders fallback when permission is denied', async () => {
@@ -133,7 +129,7 @@ describe('NavigationGuard Component', () => {
133
129
  await waitFor(() => {
134
130
  expect(screen.getByTestId('test-fallback')).toBeInTheDocument();
135
131
  expect(screen.queryByTestId('test-component')).not.toBeInTheDocument();
136
- });
132
+ }, { interval: 10 });
137
133
  });
138
134
 
139
135
  it('shows loading state during permission check', () => {
@@ -171,7 +167,7 @@ describe('NavigationGuard Component', () => {
171
167
 
172
168
  await waitFor(() => {
173
169
  expect(screen.getByText('Access Denied')).toBeInTheDocument();
174
- });
170
+ }, { interval: 10 });
175
171
  });
176
172
 
177
173
  it('uses default loading when none provided', () => {
@@ -207,7 +203,7 @@ describe('NavigationGuard Component', () => {
207
203
 
208
204
  await waitFor(() => {
209
205
  expect(screen.getByTestId('test-component')).toBeInTheDocument();
210
- });
206
+ }, { interval: 10 });
211
207
 
212
208
  expect(mockUseCan).toHaveBeenCalledWith(
213
209
  'user-123',
@@ -241,7 +237,7 @@ describe('NavigationGuard Component', () => {
241
237
 
242
238
  await waitFor(() => {
243
239
  expect(screen.getByTestId('test-component')).toBeInTheDocument();
244
- });
240
+ }, { interval: 10 });
245
241
 
246
242
  // Should check the first permission as representative
247
243
  expect(mockUseCan).toHaveBeenCalledWith(
@@ -276,7 +272,7 @@ describe('NavigationGuard Component', () => {
276
272
 
277
273
  await waitFor(() => {
278
274
  expect(screen.getByTestId('test-component')).toBeInTheDocument();
279
- });
275
+ }, { interval: 10 });
280
276
  });
281
277
 
282
278
  it('handles permission checking errors gracefully', async () => {
@@ -298,7 +294,7 @@ describe('NavigationGuard Component', () => {
298
294
 
299
295
  await waitFor(() => {
300
296
  expect(screen.getByTestId('test-fallback')).toBeInTheDocument();
301
- });
297
+ }, { interval: 10 });
302
298
  });
303
299
  });
304
300
 
@@ -327,7 +323,7 @@ describe('NavigationGuard Component', () => {
327
323
 
328
324
  await waitFor(() => {
329
325
  expect(screen.getByTestId('test-component')).toBeInTheDocument();
330
- });
326
+ }, { interval: 10 });
331
327
 
332
328
  expect(mockUseCan).toHaveBeenCalledWith(
333
329
  'user-123',
@@ -353,7 +349,7 @@ describe('NavigationGuard Component', () => {
353
349
 
354
350
  await waitFor(() => {
355
351
  expect(screen.getByTestId('test-component')).toBeInTheDocument();
356
- });
352
+ }, { interval: 10 });
357
353
 
358
354
  expect(mockUseCan).toHaveBeenCalledWith(
359
355
  'user-123',
@@ -389,7 +385,7 @@ describe('NavigationGuard Component', () => {
389
385
 
390
386
  await waitFor(() => {
391
387
  expect(screen.getByTestId('test-component')).toBeInTheDocument();
392
- });
388
+ }, { interval: 10 });
393
389
 
394
390
  expect(mockUseCan).toHaveBeenCalledWith(
395
391
  'user-123',
@@ -431,7 +427,7 @@ describe('NavigationGuard Component', () => {
431
427
 
432
428
  await waitFor(() => {
433
429
  expect(screen.getByTestId('test-component')).toBeInTheDocument();
434
- });
430
+ }, { interval: 10 });
435
431
 
436
432
  expect(mockCreateScopeFromEvent).toHaveBeenCalledWith({}, 'event-123');
437
433
  expect(mockUseCan).toHaveBeenCalledWith(
@@ -468,7 +464,7 @@ describe('NavigationGuard Component', () => {
468
464
 
469
465
  await waitFor(() => {
470
466
  expect(screen.getByText('Checking...')).toBeInTheDocument();
471
- });
467
+ }, { interval: 10 });
472
468
  });
473
469
 
474
470
  it('handles missing context gracefully', async () => {
@@ -490,7 +486,7 @@ describe('NavigationGuard Component', () => {
490
486
 
491
487
  await waitFor(() => {
492
488
  expect(screen.getByText('Checking...')).toBeInTheDocument();
493
- });
489
+ }, { interval: 10 });
494
490
  });
495
491
  });
496
492
 
@@ -516,7 +512,7 @@ describe('NavigationGuard Component', () => {
516
512
 
517
513
  await waitFor(() => {
518
514
  expect(screen.getByTestId('test-fallback')).toBeInTheDocument();
519
- });
515
+ }, { interval: 10 });
520
516
 
521
517
  expect(consoleSpy).toHaveBeenCalledWith(
522
518
  expect.stringContaining('STRICT MODE VIOLATION'),
@@ -551,7 +547,7 @@ describe('NavigationGuard Component', () => {
551
547
 
552
548
  await waitFor(() => {
553
549
  expect(screen.getByTestId('test-fallback')).toBeInTheDocument();
554
- });
550
+ }, { interval: 10 });
555
551
 
556
552
  expect(consoleSpy).toHaveBeenCalledWith(
557
553
  expect.stringContaining('Navigation access attempt'),
@@ -587,7 +583,7 @@ describe('NavigationGuard Component', () => {
587
583
 
588
584
  await waitFor(() => {
589
585
  expect(screen.getByTestId('test-fallback')).toBeInTheDocument();
590
- });
586
+ }, { interval: 10 });
591
587
 
592
588
  expect(onDeniedSpy).toHaveBeenCalledWith(mockNavigationItem);
593
589
  });
@@ -612,7 +608,7 @@ describe('NavigationGuard Component', () => {
612
608
 
613
609
  await waitFor(() => {
614
610
  expect(screen.getByTestId('test-component')).toBeInTheDocument();
615
- });
611
+ }, { interval: 10 });
616
612
 
617
613
  expect(onDeniedSpy).not.toHaveBeenCalled();
618
614
  });
@@ -640,7 +636,7 @@ describe('NavigationGuard Component', () => {
640
636
 
641
637
  await waitFor(() => {
642
638
  expect(screen.getByTestId('test-fallback')).toBeInTheDocument();
643
- });
639
+ }, { interval: 10 });
644
640
 
645
641
  expect(consoleSpy).not.toHaveBeenCalledWith(
646
642
  expect.stringContaining('STRICT MODE VIOLATION')
@@ -670,7 +666,7 @@ describe('NavigationGuard Component', () => {
670
666
 
671
667
  await waitFor(() => {
672
668
  expect(screen.getByTestId('test-fallback')).toBeInTheDocument();
673
- });
669
+ }, { interval: 10 });
674
670
 
675
671
  expect(consoleSpy).not.toHaveBeenCalledWith(
676
672
  expect.stringContaining('Navigation access attempt')
@@ -697,7 +693,7 @@ describe('NavigationGuard Component', () => {
697
693
 
698
694
  await waitFor(() => {
699
695
  expect(screen.getByTestId('test-component')).toBeInTheDocument();
700
- });
696
+ }, { interval: 10 });
701
697
 
702
698
  // Should still check the first permission as representative
703
699
  expect(mockUseCan).toHaveBeenCalledWith(
@@ -739,7 +735,7 @@ describe('NavigationGuard Component', () => {
739
735
 
740
736
  await waitFor(() => {
741
737
  expect(screen.getByTestId('test-fallback')).toBeInTheDocument();
742
- });
738
+ }, { interval: 10 });
743
739
 
744
740
  expect(mockUseCan).toHaveBeenCalledWith(
745
741
  '',
@@ -772,7 +768,7 @@ describe('NavigationGuard Component', () => {
772
768
 
773
769
  await waitFor(() => {
774
770
  expect(screen.getByTestId('test-fallback')).toBeInTheDocument();
775
- });
771
+ }, { interval: 10 });
776
772
  });
777
773
  });
778
774
 
@@ -803,7 +799,7 @@ describe('NavigationGuard Component', () => {
803
799
 
804
800
  await waitFor(() => {
805
801
  expect(screen.getByTestId('test-component')).toBeInTheDocument();
806
- });
802
+ }, { interval: 10 });
807
803
 
808
804
  expect(mockUseCan).toHaveBeenCalledWith(
809
805
  'user-123',
@@ -837,7 +833,7 @@ describe('NavigationGuard Component', () => {
837
833
 
838
834
  await waitFor(() => {
839
835
  expect(screen.getByTestId('test-component')).toBeInTheDocument();
840
- });
836
+ }, { interval: 10 });
841
837
  });
842
838
  });
843
839
  });
@@ -104,11 +104,7 @@ describe('PagePermissionGuard Component', () => {
104
104
  });
105
105
  });
106
106
 
107
- afterEach(() => {
108
- vi.restoreAllMocks();
109
- });
110
-
111
- describe('Rendering', () => {
107
+ describe('Rendering', () => {
112
108
  it('renders children when permission is granted', async () => {
113
109
  mockUseCan.mockReturnValue({
114
110
  can: true,
@@ -128,7 +124,7 @@ describe('PagePermissionGuard Component', () => {
128
124
  await waitFor(() => {
129
125
  expect(screen.getByTestId('test-component')).toBeInTheDocument();
130
126
  expect(screen.getByText('Protected Page')).toBeInTheDocument();
131
- });
127
+ }, { interval: 10 });
132
128
  });
133
129
 
134
130
  it('renders fallback when permission is denied', async () => {
@@ -151,7 +147,7 @@ describe('PagePermissionGuard Component', () => {
151
147
  await waitFor(() => {
152
148
  expect(screen.getByTestId('test-fallback')).toBeInTheDocument();
153
149
  expect(screen.queryByTestId('test-component')).not.toBeInTheDocument();
154
- });
150
+ }, { interval: 10 });
155
151
  });
156
152
 
157
153
  it('shows loading state during permission check', () => {
@@ -194,7 +190,7 @@ describe('PagePermissionGuard Component', () => {
194
190
  await waitFor(() => {
195
191
  expect(screen.getByText('Access Denied')).toBeInTheDocument();
196
192
  expect(screen.getByText('You don\'t have permission to access this page.')).toBeInTheDocument();
197
- });
193
+ }, { interval: 10 });
198
194
  });
199
195
 
200
196
  it('uses default loading when none provided', () => {
@@ -236,7 +232,7 @@ describe('PagePermissionGuard Component', () => {
236
232
 
237
233
  await waitFor(() => {
238
234
  expect(screen.getByTestId('test-component')).toBeInTheDocument();
239
- });
235
+ }, { interval: 10 });
240
236
 
241
237
  expect(mockUseCan).toHaveBeenCalledWith(
242
238
  'user-123',
@@ -272,7 +268,7 @@ describe('PagePermissionGuard Component', () => {
272
268
 
273
269
  await waitFor(() => {
274
270
  expect(screen.getByTestId('test-component')).toBeInTheDocument();
275
- });
271
+ }, { interval: 10 });
276
272
 
277
273
  expect(mockUseCan).toHaveBeenCalledWith(
278
274
  'user-123',
@@ -310,7 +306,7 @@ describe('PagePermissionGuard Component', () => {
310
306
 
311
307
  await waitFor(() => {
312
308
  expect(screen.getByTestId('test-component')).toBeInTheDocument();
313
- });
309
+ }, { interval: 10 });
314
310
 
315
311
  expect(mockUseCan).toHaveBeenCalledWith(
316
312
  'user-123',
@@ -348,7 +344,7 @@ describe('PagePermissionGuard Component', () => {
348
344
 
349
345
  await waitFor(() => {
350
346
  expect(screen.getByText('Checking permissions...')).toBeInTheDocument();
351
- });
347
+ }, { interval: 10 });
352
348
  });
353
349
  });
354
350
 
@@ -371,7 +367,7 @@ describe('PagePermissionGuard Component', () => {
371
367
 
372
368
  await waitFor(() => {
373
369
  expect(screen.getByTestId('test-component')).toBeInTheDocument();
374
- });
370
+ }, { interval: 10 });
375
371
 
376
372
  expect(mockGetCurrentAppName).toHaveBeenCalled();
377
373
  });
@@ -393,6 +389,7 @@ describe('PagePermissionGuard Component', () => {
393
389
  <PagePermissionGuard
394
390
  pageName={mockPageName}
395
391
  operation={mockOperation}
392
+ scope={mockScope}
396
393
  >
397
394
  <TestComponent>Protected Page</TestComponent>
398
395
  </PagePermissionGuard>
@@ -400,7 +397,7 @@ describe('PagePermissionGuard Component', () => {
400
397
 
401
398
  await waitFor(() => {
402
399
  expect(screen.getByTestId('test-component')).toBeInTheDocument();
403
- });
400
+ }, { interval: 10 });
404
401
 
405
402
  // Restore NODE_ENV
406
403
  process.env.NODE_ENV = originalEnv;
@@ -424,7 +421,7 @@ describe('PagePermissionGuard Component', () => {
424
421
 
425
422
  await waitFor(() => {
426
423
  expect(screen.getByText('Checking permissions...')).toBeInTheDocument();
427
- });
424
+ }, { interval: 10 });
428
425
 
429
426
  // Restore environment
430
427
  vi.unstubAllEnvs();
@@ -470,7 +467,7 @@ describe('PagePermissionGuard Component', () => {
470
467
 
471
468
  await waitFor(() => {
472
469
  expect(screen.getByText('Checking permissions...')).toBeInTheDocument();
473
- });
470
+ }, { interval: 10 });
474
471
 
475
472
  // Restore NODE_ENV
476
473
  process.env.NODE_ENV = originalEnv;
@@ -503,7 +500,7 @@ describe('PagePermissionGuard Component', () => {
503
500
 
504
501
  await waitFor(() => {
505
502
  expect(screen.getByTestId('test-component')).toBeInTheDocument();
506
- });
503
+ }, { interval: 10 });
507
504
 
508
505
  expect(mockUseCan).toHaveBeenCalledWith(
509
506
  'user-123',
@@ -532,7 +529,7 @@ describe('PagePermissionGuard Component', () => {
532
529
 
533
530
  await waitFor(() => {
534
531
  expect(screen.getByTestId('test-component')).toBeInTheDocument();
535
- });
532
+ }, { interval: 10 });
536
533
 
537
534
  expect(mockUseCan).toHaveBeenCalledWith(
538
535
  'user-123',
@@ -585,7 +582,7 @@ describe('PagePermissionGuard Component', () => {
585
582
 
586
583
  await waitFor(() => {
587
584
  expect(screen.getByTestId('test-component')).toBeInTheDocument();
588
- });
585
+ }, { interval: 10 });
589
586
 
590
587
  expect(mockUseCan).toHaveBeenCalledWith(
591
588
  'user-123',
@@ -644,7 +641,7 @@ describe('PagePermissionGuard Component', () => {
644
641
 
645
642
  await waitFor(() => {
646
643
  expect(screen.getByTestId('test-component')).toBeInTheDocument();
647
- });
644
+ }, { interval: 10 });
648
645
 
649
646
  expect(mockCreateScopeFromEvent).toHaveBeenCalledWith(
650
647
  expect.any(Object),
@@ -686,7 +683,7 @@ describe('PagePermissionGuard Component', () => {
686
683
 
687
684
  await waitFor(() => {
688
685
  expect(screen.getByText('Checking permissions...')).toBeInTheDocument();
689
- });
686
+ }, { interval: 10 });
690
687
  });
691
688
 
692
689
  it('handles missing context gracefully', async () => {
@@ -709,7 +706,7 @@ describe('PagePermissionGuard Component', () => {
709
706
 
710
707
  await waitFor(() => {
711
708
  expect(screen.getByText('Checking permissions...')).toBeInTheDocument();
712
- });
709
+ }, { interval: 10 });
713
710
  });
714
711
  });
715
712
 
@@ -736,7 +733,7 @@ describe('PagePermissionGuard Component', () => {
736
733
 
737
734
  await waitFor(() => {
738
735
  expect(screen.getByText('Checking permissions...')).toBeInTheDocument();
739
- });
736
+ }, { interval: 10 });
740
737
 
741
738
  expect(consoleSpy).toHaveBeenCalledWith(
742
739
  expect.stringContaining('STRICT MODE VIOLATION'),
@@ -772,7 +769,7 @@ describe('PagePermissionGuard Component', () => {
772
769
 
773
770
  await waitFor(() => {
774
771
  expect(screen.getByText('Checking permissions...')).toBeInTheDocument();
775
- });
772
+ }, { interval: 10 });
776
773
 
777
774
  expect(consoleSpy).toHaveBeenCalledWith(
778
775
  expect.stringContaining('Page access attempt'),
@@ -809,7 +806,7 @@ describe('PagePermissionGuard Component', () => {
809
806
 
810
807
  await waitFor(() => {
811
808
  expect(screen.getByText('Checking permissions...')).toBeInTheDocument();
812
- });
809
+ }, { interval: 10 });
813
810
 
814
811
  expect(onDeniedSpy).toHaveBeenCalledWith(mockPageName, mockOperation);
815
812
  });
@@ -835,7 +832,7 @@ describe('PagePermissionGuard Component', () => {
835
832
 
836
833
  await waitFor(() => {
837
834
  expect(screen.getByTestId('test-component')).toBeInTheDocument();
838
- });
835
+ }, { interval: 10 });
839
836
 
840
837
  expect(onDeniedSpy).not.toHaveBeenCalled();
841
838
  });
@@ -864,7 +861,7 @@ describe('PagePermissionGuard Component', () => {
864
861
 
865
862
  await waitFor(() => {
866
863
  expect(screen.getByText('Checking permissions...')).toBeInTheDocument();
867
- });
864
+ }, { interval: 10 });
868
865
 
869
866
  expect(consoleSpy).not.toHaveBeenCalledWith(
870
867
  expect.stringContaining('STRICT MODE VIOLATION')
@@ -895,7 +892,7 @@ describe('PagePermissionGuard Component', () => {
895
892
 
896
893
  await waitFor(() => {
897
894
  expect(screen.getByText('Checking permissions...')).toBeInTheDocument();
898
- });
895
+ }, { interval: 10 });
899
896
 
900
897
  expect(consoleSpy).not.toHaveBeenCalledWith(
901
898
  expect.stringContaining('Page access attempt')
@@ -945,7 +942,7 @@ describe('PagePermissionGuard Component', () => {
945
942
 
946
943
  await waitFor(() => {
947
944
  expect(screen.getByText('Checking permissions...')).toBeInTheDocument();
948
- });
945
+ }, { interval: 10 });
949
946
 
950
947
  expect(mockUseCan).toHaveBeenCalledWith(
951
948
  '',
@@ -997,7 +994,7 @@ describe('PagePermissionGuard Component', () => {
997
994
 
998
995
  await waitFor(() => {
999
996
  expect(screen.getByText('Checking permissions...')).toBeInTheDocument();
1000
- });
997
+ }, { interval: 10 });
1001
998
 
1002
999
  // Restore NODE_ENV
1003
1000
  process.env.NODE_ENV = originalEnv;
@@ -82,11 +82,7 @@ describe('PermissionEnforcer Component', () => {
82
82
  });
83
83
  });
84
84
 
85
- afterEach(() => {
86
- vi.restoreAllMocks();
87
- });
88
-
89
- describe('Rendering', () => {
85
+ describe('Rendering', () => {
90
86
  it('renders children when permission is granted', async () => {
91
87
  mockUseCan.mockReturnValue({
92
88
  can: true,
@@ -106,7 +102,7 @@ describe('PermissionEnforcer Component', () => {
106
102
  await waitFor(() => {
107
103
  expect(screen.getByTestId('test-component')).toBeInTheDocument();
108
104
  expect(screen.getByText('Protected Content')).toBeInTheDocument();
109
- });
105
+ }, { interval: 10 });
110
106
  });
111
107
 
112
108
  it('renders fallback when permission is denied', async () => {
@@ -129,7 +125,7 @@ describe('PermissionEnforcer Component', () => {
129
125
  await waitFor(() => {
130
126
  expect(screen.getByTestId('test-fallback')).toBeInTheDocument();
131
127
  expect(screen.queryByTestId('test-component')).not.toBeInTheDocument();
132
- });
128
+ }, { interval: 10 });
133
129
  });
134
130
 
135
131
  it('shows loading state during permission check', () => {
@@ -172,7 +168,7 @@ describe('PermissionEnforcer Component', () => {
172
168
  await waitFor(() => {
173
169
  expect(screen.getByText('Access Denied')).toBeInTheDocument();
174
170
  expect(screen.getByText('You don\'t have permission to perform this operation.')).toBeInTheDocument();
175
- });
171
+ }, { interval: 10 });
176
172
  });
177
173
 
178
174
  it('uses default loading when none provided', () => {
@@ -216,7 +212,7 @@ describe('PermissionEnforcer Component', () => {
216
212
 
217
213
  await waitFor(() => {
218
214
  expect(screen.getByTestId('test-component')).toBeInTheDocument();
219
- });
215
+ }, { interval: 10 });
220
216
 
221
217
  expect(mockUseCan).toHaveBeenCalledWith(
222
218
  'user-123',
@@ -249,7 +245,7 @@ describe('PermissionEnforcer Component', () => {
249
245
 
250
246
  await waitFor(() => {
251
247
  expect(screen.getByTestId('test-component')).toBeInTheDocument();
252
- });
248
+ }, { interval: 10 });
253
249
 
254
250
  // Should check the first permission as representative
255
251
  expect(mockUseCan).toHaveBeenCalledWith(
@@ -284,7 +280,7 @@ describe('PermissionEnforcer Component', () => {
284
280
 
285
281
  await waitFor(() => {
286
282
  expect(screen.getByTestId('test-fallback')).toBeInTheDocument();
287
- });
283
+ }, { interval: 10 });
288
284
  });
289
285
 
290
286
  it('handles empty permissions array', async () => {
@@ -305,7 +301,7 @@ describe('PermissionEnforcer Component', () => {
305
301
 
306
302
  await waitFor(() => {
307
303
  expect(screen.getByTestId('test-component')).toBeInTheDocument();
308
- });
304
+ }, { interval: 10 });
309
305
  });
310
306
  });
311
307
 
@@ -335,7 +331,7 @@ describe('PermissionEnforcer Component', () => {
335
331
 
336
332
  await waitFor(() => {
337
333
  expect(screen.getByTestId('test-component')).toBeInTheDocument();
338
- });
334
+ }, { interval: 10 });
339
335
 
340
336
  expect(mockUseCan).toHaveBeenCalledWith(
341
337
  'user-123',
@@ -364,7 +360,7 @@ describe('PermissionEnforcer Component', () => {
364
360
 
365
361
  await waitFor(() => {
366
362
  expect(screen.getByTestId('test-component')).toBeInTheDocument();
367
- });
363
+ }, { interval: 10 });
368
364
 
369
365
  expect(mockUseCan).toHaveBeenCalledWith(
370
366
  'user-123',
@@ -403,7 +399,7 @@ describe('PermissionEnforcer Component', () => {
403
399
 
404
400
  await waitFor(() => {
405
401
  expect(screen.getByTestId('test-component')).toBeInTheDocument();
406
- });
402
+ }, { interval: 10 });
407
403
 
408
404
  expect(mockUseCan).toHaveBeenCalledWith(
409
405
  'user-123',
@@ -448,7 +444,7 @@ describe('PermissionEnforcer Component', () => {
448
444
 
449
445
  await waitFor(() => {
450
446
  expect(screen.getByTestId('test-component')).toBeInTheDocument();
451
- });
447
+ }, { interval: 10 });
452
448
 
453
449
  expect(mockCreateScopeFromEvent).toHaveBeenCalledWith({}, 'event-123');
454
450
  expect(mockUseCan).toHaveBeenCalledWith(
@@ -486,7 +482,7 @@ describe('PermissionEnforcer Component', () => {
486
482
 
487
483
  await waitFor(() => {
488
484
  expect(screen.getByTestId('test-fallback')).toBeInTheDocument();
489
- });
485
+ }, { interval: 10 });
490
486
  });
491
487
 
492
488
  it('handles missing context gracefully', async () => {
@@ -509,7 +505,7 @@ describe('PermissionEnforcer Component', () => {
509
505
 
510
506
  await waitFor(() => {
511
507
  expect(screen.getByTestId('test-component')).toBeInTheDocument();
512
- });
508
+ }, { interval: 10 });
513
509
  });
514
510
  });
515
511
 
@@ -536,7 +532,7 @@ describe('PermissionEnforcer Component', () => {
536
532
 
537
533
  await waitFor(() => {
538
534
  expect(screen.getByTestId('test-fallback')).toBeInTheDocument();
539
- });
535
+ }, { interval: 10 });
540
536
 
541
537
  expect(consoleSpy).toHaveBeenCalledWith(
542
538
  expect.stringContaining('STRICT MODE VIOLATION'),
@@ -572,7 +568,7 @@ describe('PermissionEnforcer Component', () => {
572
568
 
573
569
  await waitFor(() => {
574
570
  expect(screen.getByTestId('test-fallback')).toBeInTheDocument();
575
- });
571
+ }, { interval: 10 });
576
572
 
577
573
  expect(consoleSpy).toHaveBeenCalledWith(
578
574
  expect.stringContaining('Permission check attempt'),
@@ -609,7 +605,7 @@ describe('PermissionEnforcer Component', () => {
609
605
 
610
606
  await waitFor(() => {
611
607
  expect(screen.getByTestId('test-fallback')).toBeInTheDocument();
612
- });
608
+ }, { interval: 10 });
613
609
 
614
610
  expect(onDeniedSpy).toHaveBeenCalledWith(mockPermissions, mockOperation);
615
611
  });
@@ -635,7 +631,7 @@ describe('PermissionEnforcer Component', () => {
635
631
 
636
632
  await waitFor(() => {
637
633
  expect(screen.getByTestId('test-component')).toBeInTheDocument();
638
- });
634
+ }, { interval: 10 });
639
635
 
640
636
  expect(onDeniedSpy).not.toHaveBeenCalled();
641
637
  });
@@ -664,7 +660,7 @@ describe('PermissionEnforcer Component', () => {
664
660
 
665
661
  await waitFor(() => {
666
662
  expect(screen.getByTestId('test-fallback')).toBeInTheDocument();
667
- });
663
+ }, { interval: 10 });
668
664
 
669
665
  expect(consoleSpy).not.toHaveBeenCalledWith(
670
666
  expect.stringContaining('STRICT MODE VIOLATION')
@@ -695,7 +691,7 @@ describe('PermissionEnforcer Component', () => {
695
691
 
696
692
  await waitFor(() => {
697
693
  expect(screen.getByTestId('test-fallback')).toBeInTheDocument();
698
- });
694
+ }, { interval: 10 });
699
695
 
700
696
  expect(consoleSpy).not.toHaveBeenCalledWith(
701
697
  expect.stringContaining('Permission check attempt')
@@ -723,7 +719,7 @@ describe('PermissionEnforcer Component', () => {
723
719
 
724
720
  await waitFor(() => {
725
721
  expect(screen.getByTestId('test-component')).toBeInTheDocument();
726
- });
722
+ }, { interval: 10 });
727
723
 
728
724
  // Should still check the first permission as representative
729
725
  expect(mockUseCan).toHaveBeenCalledWith(
@@ -766,7 +762,7 @@ describe('PermissionEnforcer Component', () => {
766
762
 
767
763
  await waitFor(() => {
768
764
  expect(screen.getByTestId('test-fallback')).toBeInTheDocument();
769
- });
765
+ }, { interval: 10 });
770
766
 
771
767
  expect(mockUseCan).toHaveBeenCalledWith(
772
768
  '',
@@ -800,7 +796,7 @@ describe('PermissionEnforcer Component', () => {
800
796
 
801
797
  await waitFor(() => {
802
798
  expect(screen.getByTestId('test-fallback')).toBeInTheDocument();
803
- });
799
+ }, { interval: 10 });
804
800
  });
805
801
  });
806
802
  });