@jmruthers/pace-core 0.5.191 → 0.6.1

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 (380) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/README.md +7 -1
  3. package/cursor-rules/00-pace-core-compliance.mdc +372 -0
  4. package/cursor-rules/01-standards-compliance.mdc +275 -0
  5. package/cursor-rules/02-project-structure.mdc +200 -0
  6. package/cursor-rules/03-solid-principles.mdc +341 -0
  7. package/cursor-rules/04-testing-standards.mdc +315 -0
  8. package/cursor-rules/05-bug-reports-and-features.mdc +246 -0
  9. package/cursor-rules/06-code-quality.mdc +392 -0
  10. package/cursor-rules/07-tech-stack-compliance.mdc +309 -0
  11. package/cursor-rules/CHANGELOG.md +101 -0
  12. package/cursor-rules/README.md +191 -0
  13. package/dist/{AuthService-CbP_utw2.d.ts → AuthService-DjnJHDtC.d.ts} +1 -0
  14. package/dist/{DataTable-Be6dH_dR.d.ts → DataTable-CH1U5Tpy.d.ts} +1 -1
  15. package/dist/{DataTable-WKRZD47S.js → DataTable-DQ7RSOHE.js} +8 -7
  16. package/dist/{PublicPageProvider-ULXC_u6U.d.ts → PublicPageProvider-ce4xlHYA.d.ts} +37 -156
  17. package/dist/{UnifiedAuthProvider-BYA9qB-o.d.ts → UnifiedAuthProvider-185Ih4dj.d.ts} +2 -0
  18. package/dist/{UnifiedAuthProvider-FTSG5XH7.js → UnifiedAuthProvider-ATAP5UTR.js} +3 -3
  19. package/dist/{api-IHKALJZD.js → api-N774RPUA.js} +2 -2
  20. package/dist/{chunk-6C4YBBJM.js → chunk-3QRJFVBR.js} +1 -1
  21. package/dist/chunk-3QRJFVBR.js.map +1 -0
  22. package/dist/{chunk-OETXORNB.js → chunk-3XTALGJF.js} +211 -136
  23. package/dist/chunk-3XTALGJF.js.map +1 -0
  24. package/dist/{chunk-6TQDD426.js → chunk-4N5C5XZU.js} +47 -228
  25. package/dist/chunk-4N5C5XZU.js.map +1 -0
  26. package/dist/{chunk-LOMZXPSN.js → chunk-4ZC4GX36.js} +47 -74
  27. package/dist/chunk-4ZC4GX36.js.map +1 -0
  28. package/dist/{chunk-6LTQQAT6.js → chunk-BYFSK72L.js} +357 -158
  29. package/dist/chunk-BYFSK72L.js.map +1 -0
  30. package/dist/{chunk-XYXSXPUK.js → chunk-EXUD6RNJ.js} +50 -10
  31. package/dist/chunk-EXUD6RNJ.js.map +1 -0
  32. package/dist/{chunk-VKB2CO4Z.js → chunk-GLK6VM3F.js} +244 -249
  33. package/dist/chunk-GLK6VM3F.js.map +1 -0
  34. package/dist/{chunk-HW3OVDUF.js → chunk-J36DSWQK.js} +1 -1
  35. package/dist/{chunk-HW3OVDUF.js.map → chunk-J36DSWQK.js.map} +1 -1
  36. package/dist/{chunk-XNYQOL3Z.js → chunk-JBKQ3SAO.js} +9 -18
  37. package/dist/chunk-JBKQ3SAO.js.map +1 -0
  38. package/dist/{chunk-ROXMHMY2.js → chunk-KNC55RTG.js} +13 -3
  39. package/dist/{chunk-ROXMHMY2.js.map → chunk-KNC55RTG.js.map} +1 -1
  40. package/dist/{chunk-QWWZ5CAQ.js → chunk-LXQLPRQ2.js} +2 -2
  41. package/dist/{chunk-ULHIJK66.js → chunk-T33XF5ZC.js} +255 -140
  42. package/dist/chunk-T33XF5ZC.js.map +1 -0
  43. package/dist/{chunk-VRGWKHDB.js → chunk-XM25TVIE.js} +100 -33
  44. package/dist/chunk-XM25TVIE.js.map +1 -0
  45. package/dist/components.d.ts +4 -4
  46. package/dist/components.js +9 -9
  47. package/dist/hooks.d.ts +6 -6
  48. package/dist/hooks.js +20 -25
  49. package/dist/hooks.js.map +1 -1
  50. package/dist/index.d.ts +11 -11
  51. package/dist/index.js +18 -21
  52. package/dist/index.js.map +1 -1
  53. package/dist/providers.d.ts +3 -3
  54. package/dist/providers.js +2 -2
  55. package/dist/rbac/index.d.ts +2 -20
  56. package/dist/rbac/index.js +7 -9
  57. package/dist/{usePublicRouteParams-TZe0gy-4.d.ts → usePublicRouteParams-BJAlWfuJ.d.ts} +3 -3
  58. package/dist/{useToast-C8gR5ir4.d.ts → useToast-AyaT-x7p.d.ts} +2 -2
  59. package/dist/utils.d.ts +1 -1
  60. package/dist/utils.js +3 -3
  61. package/docs/api/classes/ColumnFactory.md +1 -1
  62. package/docs/api/classes/ErrorBoundary.md +1 -1
  63. package/docs/api/classes/InvalidScopeError.md +1 -1
  64. package/docs/api/classes/Logger.md +1 -1
  65. package/docs/api/classes/MissingUserContextError.md +1 -1
  66. package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
  67. package/docs/api/classes/PermissionDeniedError.md +2 -2
  68. package/docs/api/classes/RBACAuditManager.md +2 -2
  69. package/docs/api/classes/RBACCache.md +1 -1
  70. package/docs/api/classes/RBACEngine.md +2 -2
  71. package/docs/api/classes/RBACError.md +1 -1
  72. package/docs/api/classes/RBACNotInitializedError.md +1 -1
  73. package/docs/api/classes/SecureSupabaseClient.md +10 -10
  74. package/docs/api/classes/StorageUtils.md +1 -1
  75. package/docs/api/enums/FileCategory.md +1 -1
  76. package/docs/api/enums/LogLevel.md +1 -1
  77. package/docs/api/enums/RBACErrorCode.md +1 -1
  78. package/docs/api/enums/RPCFunction.md +1 -1
  79. package/docs/api/interfaces/AddressFieldProps.md +1 -1
  80. package/docs/api/interfaces/AddressFieldRef.md +1 -1
  81. package/docs/api/interfaces/AggregateConfig.md +1 -1
  82. package/docs/api/interfaces/AutocompleteOptions.md +1 -1
  83. package/docs/api/interfaces/AvatarProps.md +1 -1
  84. package/docs/api/interfaces/BadgeProps.md +1 -1
  85. package/docs/api/interfaces/ButtonProps.md +1 -1
  86. package/docs/api/interfaces/CalendarProps.md +1 -1
  87. package/docs/api/interfaces/CardProps.md +1 -1
  88. package/docs/api/interfaces/ColorPalette.md +1 -1
  89. package/docs/api/interfaces/ColorShade.md +1 -1
  90. package/docs/api/interfaces/ComplianceResult.md +1 -1
  91. package/docs/api/interfaces/DataAccessRecord.md +1 -1
  92. package/docs/api/interfaces/DataRecord.md +1 -1
  93. package/docs/api/interfaces/DataTableAction.md +1 -1
  94. package/docs/api/interfaces/DataTableColumn.md +1 -1
  95. package/docs/api/interfaces/DataTableProps.md +1 -1
  96. package/docs/api/interfaces/DataTableToolbarButton.md +1 -1
  97. package/docs/api/interfaces/DatabaseComplianceResult.md +1 -1
  98. package/docs/api/interfaces/DatabaseIssue.md +1 -1
  99. package/docs/api/interfaces/EmptyStateConfig.md +1 -1
  100. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
  101. package/docs/api/interfaces/EventAppRoleData.md +1 -1
  102. package/docs/api/interfaces/ExportColumn.md +1 -1
  103. package/docs/api/interfaces/ExportOptions.md +1 -1
  104. package/docs/api/interfaces/FileDisplayProps.md +24 -11
  105. package/docs/api/interfaces/FileMetadata.md +1 -1
  106. package/docs/api/interfaces/FileReference.md +1 -1
  107. package/docs/api/interfaces/FileSizeLimits.md +1 -1
  108. package/docs/api/interfaces/FileUploadOptions.md +1 -1
  109. package/docs/api/interfaces/FileUploadProps.md +1 -1
  110. package/docs/api/interfaces/FooterProps.md +1 -1
  111. package/docs/api/interfaces/FormFieldProps.md +1 -1
  112. package/docs/api/interfaces/FormProps.md +1 -1
  113. package/docs/api/interfaces/GrantEventAppRoleParams.md +1 -1
  114. package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
  115. package/docs/api/interfaces/InputProps.md +1 -1
  116. package/docs/api/interfaces/LabelProps.md +1 -1
  117. package/docs/api/interfaces/LoggerConfig.md +1 -1
  118. package/docs/api/interfaces/LoginFormProps.md +1 -1
  119. package/docs/api/interfaces/NavigationAccessRecord.md +2 -2
  120. package/docs/api/interfaces/NavigationContextType.md +1 -1
  121. package/docs/api/interfaces/NavigationGuardProps.md +1 -1
  122. package/docs/api/interfaces/NavigationItem.md +1 -1
  123. package/docs/api/interfaces/NavigationMenuProps.md +1 -1
  124. package/docs/api/interfaces/NavigationProviderProps.md +1 -1
  125. package/docs/api/interfaces/Organisation.md +1 -1
  126. package/docs/api/interfaces/OrganisationContextType.md +1 -1
  127. package/docs/api/interfaces/OrganisationMembership.md +1 -1
  128. package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
  129. package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
  130. package/docs/api/interfaces/PaceAppLayoutProps.md +1 -1
  131. package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
  132. package/docs/api/interfaces/PageAccessRecord.md +1 -1
  133. package/docs/api/interfaces/PagePermissionContextType.md +1 -1
  134. package/docs/api/interfaces/PagePermissionGuardProps.md +2 -2
  135. package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
  136. package/docs/api/interfaces/PaletteData.md +1 -1
  137. package/docs/api/interfaces/ParsedAddress.md +1 -1
  138. package/docs/api/interfaces/PermissionEnforcerProps.md +4 -4
  139. package/docs/api/interfaces/ProgressProps.md +1 -1
  140. package/docs/api/interfaces/ProtectedRouteProps.md +1 -1
  141. package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
  142. package/docs/api/interfaces/PublicPageHeaderProps.md +1 -1
  143. package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
  144. package/docs/api/interfaces/QuickFix.md +1 -1
  145. package/docs/api/interfaces/RBACAccessValidateParams.md +1 -1
  146. package/docs/api/interfaces/RBACAccessValidateResult.md +1 -1
  147. package/docs/api/interfaces/RBACAuditLogParams.md +1 -1
  148. package/docs/api/interfaces/RBACAuditLogResult.md +1 -1
  149. package/docs/api/interfaces/RBACConfig.md +2 -2
  150. package/docs/api/interfaces/RBACContext.md +1 -1
  151. package/docs/api/interfaces/RBACLogger.md +1 -1
  152. package/docs/api/interfaces/RBACPageAccessCheckParams.md +1 -1
  153. package/docs/api/interfaces/RBACPerformanceMetrics.md +1 -1
  154. package/docs/api/interfaces/RBACPermissionCheckParams.md +1 -1
  155. package/docs/api/interfaces/RBACPermissionCheckResult.md +2 -2
  156. package/docs/api/interfaces/RBACPermissionsGetParams.md +1 -1
  157. package/docs/api/interfaces/RBACPermissionsGetResult.md +1 -1
  158. package/docs/api/interfaces/RBACResult.md +1 -1
  159. package/docs/api/interfaces/RBACRoleGrantParams.md +2 -2
  160. package/docs/api/interfaces/RBACRoleGrantResult.md +1 -1
  161. package/docs/api/interfaces/RBACRoleRevokeParams.md +2 -2
  162. package/docs/api/interfaces/RBACRoleRevokeResult.md +1 -1
  163. package/docs/api/interfaces/RBACRoleValidateParams.md +2 -2
  164. package/docs/api/interfaces/RBACRoleValidateResult.md +1 -1
  165. package/docs/api/interfaces/RBACRolesListParams.md +1 -1
  166. package/docs/api/interfaces/RBACRolesListResult.md +2 -2
  167. package/docs/api/interfaces/RBACSessionTrackParams.md +1 -1
  168. package/docs/api/interfaces/RBACSessionTrackResult.md +1 -1
  169. package/docs/api/interfaces/ResourcePermissions.md +1 -1
  170. package/docs/api/interfaces/RevokeEventAppRoleParams.md +1 -1
  171. package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
  172. package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
  173. package/docs/api/interfaces/RoleManagementResult.md +1 -1
  174. package/docs/api/interfaces/RouteAccessRecord.md +2 -2
  175. package/docs/api/interfaces/RouteConfig.md +2 -2
  176. package/docs/api/interfaces/RuntimeComplianceResult.md +1 -1
  177. package/docs/api/interfaces/SecureDataContextType.md +1 -1
  178. package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
  179. package/docs/api/interfaces/SessionRestorationLoaderProps.md +1 -1
  180. package/docs/api/interfaces/SetupIssue.md +1 -1
  181. package/docs/api/interfaces/StorageConfig.md +1 -1
  182. package/docs/api/interfaces/StorageFileInfo.md +1 -1
  183. package/docs/api/interfaces/StorageFileMetadata.md +1 -1
  184. package/docs/api/interfaces/StorageListOptions.md +1 -1
  185. package/docs/api/interfaces/StorageListResult.md +1 -1
  186. package/docs/api/interfaces/StorageUploadOptions.md +1 -1
  187. package/docs/api/interfaces/StorageUploadResult.md +1 -1
  188. package/docs/api/interfaces/StorageUrlOptions.md +1 -1
  189. package/docs/api/interfaces/StyleImport.md +1 -1
  190. package/docs/api/interfaces/SwitchProps.md +1 -1
  191. package/docs/api/interfaces/TabsContentProps.md +1 -1
  192. package/docs/api/interfaces/TabsListProps.md +1 -1
  193. package/docs/api/interfaces/TabsProps.md +1 -1
  194. package/docs/api/interfaces/TabsTriggerProps.md +1 -1
  195. package/docs/api/interfaces/TextareaProps.md +1 -1
  196. package/docs/api/interfaces/ToastActionElement.md +1 -1
  197. package/docs/api/interfaces/ToastProps.md +1 -1
  198. package/docs/api/interfaces/UnifiedAuthContextType.md +60 -38
  199. package/docs/api/interfaces/UnifiedAuthProviderProps.md +13 -13
  200. package/docs/api/interfaces/UseFormDialogOptions.md +1 -1
  201. package/docs/api/interfaces/UseFormDialogReturn.md +1 -1
  202. package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
  203. package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
  204. package/docs/api/interfaces/UsePublicEventLogoOptions.md +2 -2
  205. package/docs/api/interfaces/UsePublicEventLogoReturn.md +1 -1
  206. package/docs/api/interfaces/UsePublicEventOptions.md +1 -1
  207. package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
  208. package/docs/api/interfaces/UsePublicFileDisplayOptions.md +2 -2
  209. package/docs/api/interfaces/UsePublicFileDisplayReturn.md +1 -1
  210. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
  211. package/docs/api/interfaces/UseResolvedScopeOptions.md +2 -2
  212. package/docs/api/interfaces/UseResolvedScopeReturn.md +1 -1
  213. package/docs/api/interfaces/UseResourcePermissionsOptions.md +1 -1
  214. package/docs/api/interfaces/UserEventAccess.md +1 -1
  215. package/docs/api/interfaces/UserMenuProps.md +1 -1
  216. package/docs/api/interfaces/UserProfile.md +1 -1
  217. package/docs/api/modules.md +194 -209
  218. package/docs/getting-started/cursor-rules.md +262 -0
  219. package/docs/getting-started/installation-guide.md +6 -1
  220. package/docs/getting-started/quick-start.md +6 -1
  221. package/docs/migration/MIGRATION_GUIDE.md +4 -4
  222. package/docs/migration/REACT_19_MIGRATION.md +227 -0
  223. package/docs/migration/database-changes-december-2025.md +2 -1
  224. package/docs/rbac/event-based-apps.md +124 -6
  225. package/docs/standards/README.md +39 -0
  226. package/docs/troubleshooting/migration.md +4 -4
  227. package/examples/PublicPages/PublicEventPage.tsx +1 -1
  228. package/package.json +11 -6
  229. package/scripts/audit-consuming-app.cjs +961 -0
  230. package/scripts/check-pace-core-compliance.cjs +315 -61
  231. package/scripts/install-cursor-rules.cjs +236 -0
  232. package/src/__tests__/helpers/test-providers.tsx +1 -1
  233. package/src/__tests__/helpers/test-utils.tsx +1 -1
  234. package/src/__tests__/rls-policies.test.ts +3 -1
  235. package/src/components/Badge/Badge.tsx +2 -4
  236. package/src/components/Button/Button.tsx +5 -4
  237. package/src/components/Calendar/Calendar.tsx +1 -1
  238. package/src/components/DataTable/DataTable.test.tsx +57 -93
  239. package/src/components/DataTable/DataTable.tsx +2 -2
  240. package/src/components/DataTable/__tests__/DataTable.default-state.test.tsx +172 -45
  241. package/src/components/DataTable/__tests__/DataTable.grouping-aggregation.test.tsx +121 -28
  242. package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +9 -8
  243. package/src/components/DataTable/__tests__/DataTableCore.test.tsx +20 -52
  244. package/src/components/DataTable/__tests__/a11y.basic.test.tsx +170 -34
  245. package/src/components/DataTable/__tests__/keyboard.test.tsx +75 -12
  246. package/src/components/DataTable/__tests__/pagination.modes.test.tsx +88 -16
  247. package/src/components/DataTable/__tests__/ssr.strict-mode.test.tsx +12 -12
  248. package/src/components/DataTable/components/AccessDeniedPage.tsx +1 -1
  249. package/src/components/DataTable/components/BulkOperationsDropdown.tsx +1 -1
  250. package/src/components/DataTable/components/DataTableCore.tsx +4 -7
  251. package/src/components/DataTable/components/DataTableModals.tsx +1 -1
  252. package/src/components/DataTable/components/EditableRow.tsx +1 -1
  253. package/src/components/DataTable/components/UnifiedTableBody.tsx +86 -17
  254. package/src/components/DataTable/components/__tests__/DataTableModals.test.tsx +23 -23
  255. package/src/components/DataTable/components/__tests__/EditableRow.test.tsx +11 -11
  256. package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +36 -36
  257. package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +27 -27
  258. package/src/components/DataTable/components/__tests__/ImportModal.test.tsx +39 -39
  259. package/src/components/DataTable/components/__tests__/UnifiedTableBody.test.tsx +33 -33
  260. package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +29 -29
  261. package/src/components/DataTable/hooks/useColumnReordering.ts +2 -2
  262. package/src/components/DataTable/hooks/useDataTablePermissions.ts +75 -10
  263. package/src/components/DataTable/hooks/useKeyboardNavigation.ts +2 -2
  264. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +8 -14
  265. package/src/components/Dialog/Dialog.tsx +6 -5
  266. package/src/components/ErrorBoundary/ErrorBoundary.tsx +1 -1
  267. package/src/components/EventSelector/EventSelector.tsx +1 -1
  268. package/src/components/FileDisplay/FileDisplay.test.tsx +4 -3
  269. package/src/components/FileDisplay/FileDisplay.tsx +16 -4
  270. package/src/components/Footer/Footer.tsx +1 -1
  271. package/src/components/Form/Form.test.tsx +36 -15
  272. package/src/components/Form/Form.tsx +30 -26
  273. package/src/components/Header/Header.tsx +1 -1
  274. package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +40 -40
  275. package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +1 -1
  276. package/src/components/Input/Input.tsx +28 -30
  277. package/src/components/Label/Label.tsx +1 -1
  278. package/src/components/LoadingSpinner/LoadingSpinner.tsx +1 -1
  279. package/src/components/LoginForm/LoginForm.test.tsx +42 -42
  280. package/src/components/LoginForm/LoginForm.tsx +8 -8
  281. package/src/components/NavigationMenu/NavigationMenu.test.tsx +6 -4
  282. package/src/components/NavigationMenu/NavigationMenu.tsx +2 -11
  283. package/src/components/OrganisationSelector/OrganisationSelector.tsx +0 -1
  284. package/src/components/PaceAppLayout/PaceAppLayout.performance.test.tsx +1 -1
  285. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +75 -52
  286. package/src/components/PaceAppLayout/PaceAppLayout.tsx +98 -69
  287. package/src/components/PaceAppLayout/README.md +1 -1
  288. package/src/components/PaceLoginPage/PaceLoginPage.tsx +1 -8
  289. package/src/components/PasswordChange/PasswordChangeForm.test.tsx +33 -33
  290. package/src/components/PasswordChange/PasswordChangeForm.tsx +1 -1
  291. package/src/components/Progress/Progress.tsx +1 -1
  292. package/src/components/ProtectedRoute/ProtectedRoute.test.tsx +5 -9
  293. package/src/components/ProtectedRoute/ProtectedRoute.tsx +0 -1
  294. package/src/components/PublicLayout/PublicPageLayout.tsx +1 -1
  295. package/src/components/PublicLayout/PublicPageProvider.tsx +0 -1
  296. package/src/components/Select/Select.tsx +33 -22
  297. package/src/components/SessionRestorationLoader/SessionRestorationLoader.tsx +1 -1
  298. package/src/components/Table/Table.tsx +1 -1
  299. package/src/components/Textarea/Textarea.tsx +27 -29
  300. package/src/components/Toast/Toast.tsx +1 -1
  301. package/src/components/Tooltip/Tooltip.tsx +1 -1
  302. package/src/components/UserMenu/UserMenu.tsx +1 -1
  303. package/src/hooks/__tests__/hooks.integration.test.tsx +80 -55
  304. package/src/hooks/__tests__/useSecureDataAccess.unit.test.tsx +14 -7
  305. package/src/hooks/__tests__/useStorage.unit.test.ts +36 -36
  306. package/src/hooks/public/usePublicEvent.ts +1 -1
  307. package/src/hooks/public/usePublicEventLogo.ts +1 -1
  308. package/src/hooks/public/usePublicRouteParams.ts +1 -1
  309. package/src/hooks/services/useAuthService.ts +21 -3
  310. package/src/hooks/services/useEventService.ts +21 -3
  311. package/src/hooks/services/useInactivityService.ts +21 -3
  312. package/src/hooks/services/useOrganisationService.ts +21 -3
  313. package/src/hooks/useDataTableState.ts +8 -18
  314. package/src/hooks/useFileDisplay.ts +10 -17
  315. package/src/hooks/useFocusManagement.ts +2 -2
  316. package/src/hooks/useFocusTrap.ts +4 -4
  317. package/src/hooks/useFormDialog.ts +8 -7
  318. package/src/hooks/useInactivityTracker.ts +1 -1
  319. package/src/hooks/usePermissionCache.ts +1 -1
  320. package/src/hooks/useSecureDataAccess.test.ts +16 -9
  321. package/src/hooks/useSecureDataAccess.ts +22 -6
  322. package/src/hooks/useToast.ts +2 -2
  323. package/src/providers/__tests__/OrganisationProvider.test.tsx +57 -13
  324. package/src/providers/__tests__/ProviderLifecycle.test.tsx +21 -6
  325. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +10 -10
  326. package/src/providers/services/EventServiceProvider.tsx +0 -8
  327. package/src/providers/services/UnifiedAuthProvider.tsx +196 -46
  328. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +13 -3
  329. package/src/rbac/__tests__/adapters.comprehensive.test.tsx +34 -40
  330. package/src/rbac/__tests__/isSuperAdmin.real.test.ts +82 -0
  331. package/src/rbac/adapters.tsx +3 -22
  332. package/src/rbac/api.test.ts +2 -2
  333. package/src/rbac/api.ts +7 -1
  334. package/src/rbac/components/EnhancedNavigationMenu.tsx +3 -16
  335. package/src/rbac/components/NavigationGuard.tsx +2 -11
  336. package/src/rbac/components/NavigationProvider.tsx +1 -2
  337. package/src/rbac/components/PagePermissionGuard.tsx +1 -1
  338. package/src/rbac/components/PagePermissionProvider.tsx +1 -1
  339. package/src/rbac/components/PermissionEnforcer.tsx +46 -13
  340. package/src/rbac/components/RoleBasedRouter.tsx +1 -1
  341. package/src/rbac/components/SecureDataProvider.tsx +1 -2
  342. package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +7 -43
  343. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +4 -11
  344. package/src/rbac/components/__tests__/NavigationProvider.test.tsx +3 -3
  345. package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +1 -1
  346. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +1 -1
  347. package/src/rbac/engine.ts +14 -2
  348. package/src/rbac/hooks/index.ts +0 -3
  349. package/src/rbac/hooks/usePermissions.ts +51 -11
  350. package/src/rbac/hooks/useRBAC.ts +3 -13
  351. package/src/rbac/hooks/useResolvedScope.test.ts +75 -54
  352. package/src/rbac/hooks/useResolvedScope.ts +58 -33
  353. package/src/rbac/hooks/useSecureSupabase.ts +4 -9
  354. package/src/rbac/secureClient.ts +43 -0
  355. package/src/services/EventService.ts +4 -57
  356. package/src/services/InactivityService.ts +127 -34
  357. package/src/services/OrganisationService.ts +68 -10
  358. package/src/utils/security/secureDataAccess.test.ts +31 -20
  359. package/src/utils/security/secureDataAccess.ts +4 -3
  360. package/dist/chunk-6C4YBBJM.js.map +0 -1
  361. package/dist/chunk-6LTQQAT6.js.map +0 -1
  362. package/dist/chunk-6TQDD426.js.map +0 -1
  363. package/dist/chunk-LOMZXPSN.js.map +0 -1
  364. package/dist/chunk-OETXORNB.js.map +0 -1
  365. package/dist/chunk-ULHIJK66.js.map +0 -1
  366. package/dist/chunk-VKB2CO4Z.js.map +0 -1
  367. package/dist/chunk-VRGWKHDB.js.map +0 -1
  368. package/dist/chunk-XNYQOL3Z.js.map +0 -1
  369. package/dist/chunk-XYXSXPUK.js.map +0 -1
  370. package/scripts/check-pace-core-compliance.js +0 -512
  371. package/src/rbac/hooks/useSuperAdminBypass.ts +0 -126
  372. package/src/utils/context/superAdminOverride.ts +0 -58
  373. /package/dist/{DataTable-WKRZD47S.js.map → DataTable-DQ7RSOHE.js.map} +0 -0
  374. /package/dist/{UnifiedAuthProvider-FTSG5XH7.js.map → UnifiedAuthProvider-ATAP5UTR.js.map} +0 -0
  375. /package/dist/{api-IHKALJZD.js.map → api-N774RPUA.js.map} +0 -0
  376. /package/dist/{chunk-QWWZ5CAQ.js.map → chunk-LXQLPRQ2.js.map} +0 -0
  377. /package/examples/{rbac → RBAC}/CompleteRBACExample.tsx +0 -0
  378. /package/examples/{rbac → RBAC}/EventBasedApp.tsx +0 -0
  379. /package/examples/{rbac → RBAC}/PermissionExample.tsx +0 -0
  380. /package/examples/{rbac → RBAC}/index.ts +0 -0
@@ -70,7 +70,7 @@ describe('[component] DataTable', () => {
70
70
  const testData = createTestData(3);
71
71
  const testColumns = createTestColumns();
72
72
  const defaultRBAC = { pageId: 'test-page-id' };
73
- const defaultProps = {
73
+ const baseProps = {
74
74
  data: testData,
75
75
  columns: testColumns,
76
76
  rbac: defaultRBAC,
@@ -90,7 +90,7 @@ describe('[component] DataTable', () => {
90
90
 
91
91
  describe('Rendering', () => {
92
92
  it('renders DataTableCore with required props', () => {
93
- render(<DataTable {...defaultProps} />);
93
+ render(<DataTable {...baseProps} />);
94
94
 
95
95
  expect(screen.getByTestId('data-table-core')).toBeInTheDocument();
96
96
  expect(getMockedDataTableCore()).toHaveBeenCalledTimes(1);
@@ -99,7 +99,7 @@ describe('[component] DataTable', () => {
99
99
  it('renders with title and description', () => {
100
100
  render(
101
101
  <DataTable
102
- {...defaultProps}
102
+ {...baseProps}
103
103
  title="Test Table"
104
104
  description="Test description"
105
105
  />
@@ -111,14 +111,14 @@ describe('[component] DataTable', () => {
111
111
  });
112
112
 
113
113
  it('renders with custom variant', () => {
114
- render(<DataTable {...defaultProps} variant="compact" />);
114
+ render(<DataTable {...baseProps} variant="compact" />);
115
115
 
116
116
  const core = screen.getByTestId('data-table-core');
117
117
  expect(core).toHaveAttribute('data-variant', 'compact');
118
118
  });
119
119
 
120
120
  it('renders with custom className', () => {
121
- render(<DataTable {...defaultProps} className="custom-table-class" />);
121
+ render(<DataTable {...baseProps} className="custom-table-class" />);
122
122
 
123
123
  const core = screen.getByTestId('data-table-core');
124
124
  expect(core).toHaveAttribute('data-class-name', 'custom-table-class');
@@ -127,7 +127,7 @@ describe('[component] DataTable', () => {
127
127
 
128
128
  describe('Feature Configuration', () => {
129
129
  it('normalizes undefined features to default disabled features', () => {
130
- render(<DataTable {...defaultProps} />);
130
+ render(<DataTable {...baseProps} />);
131
131
 
132
132
  const core = screen.getByTestId('data-table-core');
133
133
  const features = JSON.parse(core.getAttribute('data-features') || '{}');
@@ -157,7 +157,7 @@ describe('[component] DataTable', () => {
157
157
  pagination: true,
158
158
  };
159
159
 
160
- render(<DataTable {...defaultProps} features={partialFeatures} />);
160
+ render(<DataTable {...baseProps} features={partialFeatures} />);
161
161
 
162
162
  const core = screen.getByTestId('data-table-core');
163
163
  const features = JSON.parse(core.getAttribute('data-features') || '{}');
@@ -170,7 +170,7 @@ describe('[component] DataTable', () => {
170
170
 
171
171
  it('passes fully normalized features to DataTableCore', () => {
172
172
  const features = createFullFeatures();
173
- render(<DataTable {...defaultProps} features={features} />);
173
+ render(<DataTable {...baseProps} features={features} />);
174
174
 
175
175
  const core = screen.getByTestId('data-table-core');
176
176
  const normalizedFeatures = JSON.parse(core.getAttribute('data-features') || '{}');
@@ -192,11 +192,11 @@ describe('[component] DataTable', () => {
192
192
 
193
193
  it('memoizes normalized features when features prop does not change', () => {
194
194
  const features = createDefaultFeatures();
195
- const { rerender } = render(<DataTable {...defaultProps} features={features} />);
195
+ const { rerender } = render(<DataTable {...baseProps} features={features} />);
196
196
 
197
197
  expect(getMockedDataTableCore()).toHaveBeenCalledTimes(1);
198
198
 
199
- rerender(<DataTable {...defaultProps} features={features} />);
199
+ rerender(<DataTable {...baseProps} features={features} />);
200
200
 
201
201
  // Should not re-normalize if features object reference is the same
202
202
  expect(getMockedDataTableCore()).toHaveBeenCalledTimes(2);
@@ -205,14 +205,14 @@ describe('[component] DataTable', () => {
205
205
 
206
206
  describe('RBAC Configuration', () => {
207
207
  it('passes rbac with pageId to DataTableCore', () => {
208
- render(<DataTable {...defaultProps} rbac={{ pageId: 'custom-page-id' }} />);
208
+ render(<DataTable {...baseProps} rbac={{ pageId: 'custom-page-id' }} />);
209
209
 
210
210
  const core = screen.getByTestId('data-table-core');
211
211
  expect(core).toHaveAttribute('data-page-id', 'custom-page-id');
212
212
  });
213
213
 
214
214
  it('passes rbac with pageName to DataTableCore', () => {
215
- render(<DataTable {...defaultProps} rbac={{ pageName: 'custom-page-name' }} />);
215
+ render(<DataTable {...baseProps} rbac={{ pageName: 'custom-page-name' }} />);
216
216
 
217
217
  const core = screen.getByTestId('data-table-core');
218
218
  expect(core).toHaveAttribute('data-page-name', 'custom-page-name');
@@ -223,7 +223,7 @@ describe('[component] DataTable', () => {
223
223
  it('logs debug information in development mode', () => {
224
224
  // Note: Debug logging has been removed from DataTable component
225
225
  // The component now uses a logger utility instead of console.log
226
- render(<DataTable {...defaultProps} />);
226
+ render(<DataTable {...baseProps} />);
227
227
 
228
228
  // Verify component renders correctly
229
229
  expect(screen.getByTestId('data-table-core')).toBeInTheDocument();
@@ -241,7 +241,7 @@ describe('[component] DataTable', () => {
241
241
  mockLogger.info.mockClear();
242
242
 
243
243
  // Render without features prop - should trigger the warning in development mode
244
- render(<DataTable {...defaultProps} />);
244
+ render(<DataTable {...baseProps} />);
245
245
 
246
246
  // Wait for useEffect to run - it runs after render
247
247
  // The effect checks: if (!features && import.meta.env?.MODE === 'development')
@@ -259,7 +259,7 @@ describe('[component] DataTable', () => {
259
259
  });
260
260
 
261
261
  it('does not log info message when features are provided', () => {
262
- render(<DataTable {...defaultProps} features={createDefaultFeatures()} />);
262
+ render(<DataTable {...baseProps} features={createDefaultFeatures()} />);
263
263
 
264
264
  expect(mockLogger.info).not.toHaveBeenCalled();
265
265
  });
@@ -270,7 +270,7 @@ describe('[component] DataTable', () => {
270
270
  deletion: false,
271
271
  });
272
272
 
273
- render(<DataTable {...defaultProps} features={invalidFeatures} />);
273
+ render(<DataTable {...baseProps} features={invalidFeatures} />);
274
274
 
275
275
  expect(mockLogger.warn).toHaveBeenCalledWith(
276
276
  'deleteSelected requires deletion to be enabled'
@@ -283,7 +283,7 @@ describe('[component] DataTable', () => {
283
283
  deletion: true,
284
284
  });
285
285
 
286
- render(<DataTable {...defaultProps} features={validFeatures} />);
286
+ render(<DataTable {...baseProps} features={validFeatures} />);
287
287
 
288
288
  expect(mockLogger.warn).not.toHaveBeenCalled();
289
289
  });
@@ -292,81 +292,57 @@ describe('[component] DataTable', () => {
292
292
  describe('Event Handlers', () => {
293
293
  it('passes onEditRow handler to DataTableCore', () => {
294
294
  const onEditRow = vi.fn();
295
- render(<DataTable {...defaultProps} onEditRow={onEditRow} />);
295
+ render(<DataTable {...baseProps} onEditRow={onEditRow} />);
296
296
 
297
- expect(getMockedDataTableCore()).toHaveBeenCalledWith(
298
- expect.objectContaining({
299
- onEditRow,
300
- }),
301
- expect.anything()
302
- );
297
+ const mockCall = getMockedDataTableCore().mock.calls[0];
298
+ expect(mockCall[0]).toHaveProperty('onEditRow', onEditRow);
303
299
  });
304
300
 
305
301
  it('passes onDeleteRow handler to DataTableCore', () => {
306
302
  const onDeleteRow = vi.fn();
307
- render(<DataTable {...defaultProps} onDeleteRow={onDeleteRow} />);
303
+ render(<DataTable {...baseProps} onDeleteRow={onDeleteRow} />);
308
304
 
309
- expect(getMockedDataTableCore()).toHaveBeenCalledWith(
310
- expect.objectContaining({
311
- onDeleteRow,
312
- }),
313
- expect.anything()
314
- );
305
+ const mockCall = getMockedDataTableCore().mock.calls[0];
306
+ expect(mockCall[0]).toHaveProperty('onDeleteRow', onDeleteRow);
315
307
  });
316
308
 
317
309
  it('passes onCreateRow handler to DataTableCore', () => {
318
310
  const onCreateRow = vi.fn();
319
- render(<DataTable {...defaultProps} onCreateRow={onCreateRow} />);
311
+ render(<DataTable {...baseProps} onCreateRow={onCreateRow} />);
320
312
 
321
- expect(getMockedDataTableCore()).toHaveBeenCalledWith(
322
- expect.objectContaining({
323
- onCreateRow,
324
- }),
325
- expect.anything()
326
- );
313
+ const mockCall = getMockedDataTableCore().mock.calls[0];
314
+ expect(mockCall[0]).toHaveProperty('onCreateRow', onCreateRow);
327
315
  });
328
316
 
329
317
  it('passes onImport handler to DataTableCore', () => {
330
318
  const onImport = vi.fn();
331
- render(<DataTable {...defaultProps} onImport={onImport} />);
319
+ render(<DataTable {...baseProps} onImport={onImport} />);
332
320
 
333
- expect(getMockedDataTableCore()).toHaveBeenCalledWith(
334
- expect.objectContaining({
335
- onImport,
336
- }),
337
- expect.anything()
338
- );
321
+ const mockCall = getMockedDataTableCore().mock.calls[0];
322
+ expect(mockCall[0]).toHaveProperty('onImport', onImport);
339
323
  });
340
324
 
341
325
  it('passes onRowSelectionChange handler to DataTableCore', () => {
342
326
  const onRowSelectionChange = vi.fn();
343
- render(<DataTable {...defaultProps} onRowSelectionChange={onRowSelectionChange} />);
327
+ render(<DataTable {...baseProps} onRowSelectionChange={onRowSelectionChange} />);
344
328
 
345
- expect(getMockedDataTableCore()).toHaveBeenCalledWith(
346
- expect.objectContaining({
347
- onRowSelectionChange,
348
- }),
349
- expect.anything()
350
- );
329
+ const mockCall = getMockedDataTableCore().mock.calls[0];
330
+ expect(mockCall[0]).toHaveProperty('onRowSelectionChange', onRowSelectionChange);
351
331
  });
352
332
 
353
333
  it('passes onDeleteSelected handler to DataTableCore', () => {
354
334
  const onDeleteSelected = vi.fn();
355
- render(<DataTable {...defaultProps} onDeleteSelected={onDeleteSelected} />);
335
+ render(<DataTable {...baseProps} onDeleteSelected={onDeleteSelected} />);
356
336
 
357
- expect(getMockedDataTableCore()).toHaveBeenCalledWith(
358
- expect.objectContaining({
359
- onDeleteSelected,
360
- }),
361
- expect.anything()
362
- );
337
+ const mockCall = getMockedDataTableCore().mock.calls[0];
338
+ expect(mockCall[0]).toHaveProperty('onDeleteSelected', onDeleteSelected);
363
339
  });
364
340
  });
365
341
 
366
342
  describe('Data Handling', () => {
367
343
  it('handles empty data array', () => {
368
344
  // Note: Debug logging has been removed from DataTable component
369
- render(<DataTable {...defaultProps} data={[]} />);
345
+ render(<DataTable {...baseProps} data={[]} />);
370
346
 
371
347
  expect(screen.getByTestId('data-table-core')).toBeInTheDocument();
372
348
  });
@@ -374,7 +350,7 @@ describe('[component] DataTable', () => {
374
350
  it('handles single data item', () => {
375
351
  // Note: Debug logging has been removed from DataTable component
376
352
  const singleData = testDataScenarios.single;
377
- render(<DataTable {...defaultProps} data={singleData} />);
353
+ render(<DataTable {...baseProps} data={singleData} />);
378
354
 
379
355
  expect(screen.getByTestId('data-table-core')).toBeInTheDocument();
380
356
  });
@@ -382,14 +358,14 @@ describe('[component] DataTable', () => {
382
358
  it('handles large dataset', () => {
383
359
  // Note: Debug logging has been removed from DataTable component
384
360
  const largeData = testDataScenarios.large;
385
- render(<DataTable {...defaultProps} data={largeData} />);
361
+ render(<DataTable {...baseProps} data={largeData} />);
386
362
 
387
363
  expect(screen.getByTestId('data-table-core')).toBeInTheDocument();
388
364
  });
389
365
 
390
366
  it('handles data with null values', () => {
391
367
  const dataWithNulls = testDataScenarios.withNulls;
392
- render(<DataTable {...defaultProps} data={dataWithNulls} />);
368
+ render(<DataTable {...baseProps} data={dataWithNulls} />);
393
369
 
394
370
  expect(screen.getByTestId('data-table-core')).toBeInTheDocument();
395
371
  });
@@ -402,14 +378,10 @@ describe('[component] DataTable', () => {
402
378
  enableChunking: true,
403
379
  };
404
380
 
405
- render(<DataTable {...defaultProps} performance={performance} />);
381
+ render(<DataTable {...baseProps} performance={performance} />);
406
382
 
407
- expect(getMockedDataTableCore()).toHaveBeenCalledWith(
408
- expect.objectContaining({
409
- performance,
410
- }),
411
- expect.anything()
412
- );
383
+ const mockCall = getMockedDataTableCore().mock.calls[0];
384
+ expect(mockCall[0]).toHaveProperty('performance', performance);
413
385
  });
414
386
 
415
387
  it('passes serverSide config to DataTableCore', () => {
@@ -418,32 +390,24 @@ describe('[component] DataTable', () => {
418
390
  enableServerSorting: true,
419
391
  };
420
392
 
421
- render(<DataTable {...defaultProps} serverSide={serverSide} />);
393
+ render(<DataTable {...baseProps} serverSide={serverSide} />);
422
394
 
423
- expect(getMockedDataTableCore()).toHaveBeenCalledWith(
424
- expect.objectContaining({
425
- serverSide,
426
- }),
427
- expect.anything()
428
- );
395
+ const mockCall = getMockedDataTableCore().mock.calls[0];
396
+ expect(mockCall[0]).toHaveProperty('serverSide', serverSide);
429
397
  });
430
398
 
431
399
  it('passes paginationMode to DataTableCore', () => {
432
- render(<DataTable {...defaultProps} paginationMode="server" />);
400
+ render(<DataTable {...baseProps} paginationMode="server" />);
433
401
 
434
- expect(getMockedDataTableCore()).toHaveBeenCalledWith(
435
- expect.objectContaining({
436
- paginationMode: 'server',
437
- }),
438
- expect.anything()
439
- );
402
+ const mockCall = getMockedDataTableCore().mock.calls[0];
403
+ expect(mockCall[0]).toHaveProperty('paginationMode', 'server');
440
404
  });
441
405
  });
442
406
 
443
407
  describe('Component Integration', () => {
444
408
  it('passes all props to DataTableCore except features', () => {
445
409
  const allProps = {
446
- ...defaultProps,
410
+ ...baseProps,
447
411
  title: 'Test Table',
448
412
  description: 'Test description',
449
413
  variant: 'compact' as const,
@@ -490,7 +454,7 @@ describe('[component] DataTable', () => {
490
454
 
491
455
  describe('Memory Management', () => {
492
456
  it('cleans up resources on unmount', () => {
493
- const { unmount } = render(<DataTable {...defaultProps} />);
457
+ const { unmount } = render(<DataTable {...baseProps} />);
494
458
 
495
459
  expect(screen.getByTestId('data-table-core')).toBeInTheDocument();
496
460
 
@@ -499,11 +463,11 @@ describe('[component] DataTable', () => {
499
463
  });
500
464
 
501
465
  it('handles rapid mount/unmount cycles', () => {
502
- const { unmount: unmount1 } = render(<DataTable {...defaultProps} />);
466
+ const { unmount: unmount1 } = render(<DataTable {...baseProps} />);
503
467
  expect(screen.getByTestId('data-table-core')).toBeInTheDocument();
504
468
  unmount1();
505
469
 
506
- const { unmount: unmount2 } = render(<DataTable {...defaultProps} />);
470
+ const { unmount: unmount2 } = render(<DataTable {...baseProps} />);
507
471
  expect(screen.getByTestId('data-table-core')).toBeInTheDocument();
508
472
  unmount2();
509
473
 
@@ -514,27 +478,27 @@ describe('[component] DataTable', () => {
514
478
  describe('Edge Cases', () => {
515
479
  it('handles missing columns gracefully', () => {
516
480
  // Note: Debug logging has been removed from DataTable component
517
- render(<DataTable {...defaultProps} columns={[]} />);
481
+ render(<DataTable {...baseProps} columns={[]} />);
518
482
 
519
483
  expect(screen.getByTestId('data-table-core')).toBeInTheDocument();
520
484
  });
521
485
 
522
486
  it('handles undefined rbac pageId and pageName', () => {
523
487
  // Note: Debug logging has been removed from DataTable component
524
- render(<DataTable {...defaultProps} rbac={{}} />);
488
+ render(<DataTable {...baseProps} rbac={{}} />);
525
489
 
526
490
  expect(screen.getByTestId('data-table-core')).toBeInTheDocument();
527
491
  });
528
492
 
529
493
  it('handles rapid feature prop changes', () => {
530
- const { rerender } = render(<DataTable {...defaultProps} features={{ search: true }} />);
494
+ const { rerender } = render(<DataTable {...baseProps} features={{ search: true }} />);
531
495
 
532
496
  expect(getMockedDataTableCore()).toHaveBeenCalledTimes(1);
533
497
 
534
- rerender(<DataTable {...defaultProps} features={{ search: false }} />);
498
+ rerender(<DataTable {...baseProps} features={{ search: false }} />);
535
499
  expect(getMockedDataTableCore()).toHaveBeenCalledTimes(2);
536
500
 
537
- rerender(<DataTable {...defaultProps} features={{ search: true, pagination: true }} />);
501
+ rerender(<DataTable {...baseProps} features={{ search: true, pagination: true }} />);
538
502
  expect(getMockedDataTableCore()).toHaveBeenCalledTimes(3);
539
503
  });
540
504
  });
@@ -424,7 +424,7 @@ export interface DataTableProps<TData extends DataRecord> {
424
424
  /** Whether the table is in a loading state */
425
425
  isLoading?: boolean;
426
426
  /** Custom component to display when table is empty */
427
- emptyState?: EmptyStateConfig | React.ReactElement;
427
+ emptyState?: EmptyStateConfig | React.ReactElement<any>;
428
428
  /** Array of aggregation functions for grouped data */
429
429
  aggregates?: AggregateConfig[];
430
430
 
@@ -463,7 +463,7 @@ export interface DataTableProps<TData extends DataRecord> {
463
463
  * Features are configured through the unified `features` prop for maximum flexibility.
464
464
  */
465
465
  export function DataTable<TData extends DataRecord>(props: DataTableProps<TData>) {
466
- const logger = React.useMemo(() => createLogger('DataTable'), []);
466
+ const logger = createLogger('DataTable');
467
467
  const { features, ...rest } = props;
468
468
 
469
469
  const normalizedFeatures = React.useMemo(