@jmruthers/pace-core 0.6.1 → 0.6.3

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 (549) hide show
  1. package/CHANGELOG.md +88 -10
  2. package/cursor-rules/00-pace-core-compliance.mdc +46 -87
  3. package/cursor-rules/01-standards-compliance.mdc +16 -47
  4. package/cursor-rules/02-project-structure.mdc +4 -4
  5. package/cursor-rules/03-solid-principles.mdc +45 -164
  6. package/cursor-rules/04-testing-standards.mdc +22 -69
  7. package/cursor-rules/05-bug-reports-and-features.mdc +2 -2
  8. package/cursor-rules/06-code-quality.mdc +42 -125
  9. package/cursor-rules/07-tech-stack-compliance.mdc +33 -128
  10. package/cursor-rules/08-markup-quality.mdc +452 -0
  11. package/cursor-rules/CHANGELOG.md +18 -0
  12. package/cursor-rules/README.md +2 -1
  13. package/dist/{AuthService-DjnJHDtC.d.ts → AuthService-Cb34EQs3.d.ts} +63 -1
  14. package/dist/{DataTable-CH1U5Tpy.d.ts → DataTable-BMRU8a1j.d.ts} +33 -1
  15. package/dist/{DataTable-DQ7RSOHE.js → DataTable-THFPBKTP.js} +12 -10
  16. package/dist/{PublicPageProvider-ce4xlHYA.d.ts → PublicPageProvider-DEMpysFR.d.ts} +394 -171
  17. package/dist/{UnifiedAuthProvider-185Ih4dj.d.ts → UnifiedAuthProvider-CKvHP1MK.d.ts} +30 -8
  18. package/dist/{UnifiedAuthProvider-ATAP5UTR.js → UnifiedAuthProvider-KAGUYQ4J.js} +5 -4
  19. package/dist/{api-N774RPUA.js → api-IAGWF3ZG.js} +10 -10
  20. package/dist/{audit-B5P6FFIR.js → audit-V53FV5AG.js} +2 -2
  21. package/dist/{chunk-JBKQ3SAO.js → chunk-2T2IG7T7.js} +107 -57
  22. package/dist/chunk-2T2IG7T7.js.map +1 -0
  23. package/dist/{chunk-3QRJFVBR.js → chunk-6SOIHG6Z.js} +1 -1
  24. package/dist/chunk-6SOIHG6Z.js.map +1 -0
  25. package/dist/{chunk-3XTALGJF.js → chunk-6Z7LTB3D.js} +69 -240
  26. package/dist/chunk-6Z7LTB3D.js.map +1 -0
  27. package/dist/{chunk-4ZC4GX36.js → chunk-CNCQDFLN.js} +199 -46
  28. package/dist/chunk-CNCQDFLN.js.map +1 -0
  29. package/dist/chunk-DGUM43GV.js +11 -0
  30. package/dist/{chunk-BYFSK72L.js → chunk-DWUBLJJM.js} +361 -187
  31. package/dist/chunk-DWUBLJJM.js.map +1 -0
  32. package/dist/{chunk-LXQLPRQ2.js → chunk-FFQEQTNW.js} +6 -8
  33. package/dist/chunk-FFQEQTNW.js.map +1 -0
  34. package/dist/chunk-FMUCXFII.js +76 -0
  35. package/dist/chunk-FMUCXFII.js.map +1 -0
  36. package/dist/{chunk-4N5C5XZU.js → chunk-HFZBI76P.js} +4 -4
  37. package/dist/chunk-HFZBI76P.js.map +1 -0
  38. package/dist/{chunk-SQGMNID3.js → chunk-L4OXEN46.js} +4 -5
  39. package/dist/chunk-L4OXEN46.js.map +1 -0
  40. package/dist/{chunk-R77UEZ4E.js → chunk-M43Y4SSO.js} +1 -1
  41. package/dist/chunk-M43Y4SSO.js.map +1 -0
  42. package/dist/{chunk-I7PSE6JW.js → chunk-M7MPQISP.js} +3 -76
  43. package/dist/chunk-M7MPQISP.js.map +1 -0
  44. package/dist/chunk-PQBSKX33.js +7793 -0
  45. package/dist/chunk-PQBSKX33.js.map +1 -0
  46. package/dist/chunk-QRPVRXYT.js +226 -0
  47. package/dist/chunk-QRPVRXYT.js.map +1 -0
  48. package/dist/{chunk-KNC55RTG.js → chunk-RWEBCB47.js} +194 -416
  49. package/dist/chunk-RWEBCB47.js.map +1 -0
  50. package/dist/{chunk-XM25TVIE.js → chunk-YDQHOZNA.js} +843 -388
  51. package/dist/chunk-YDQHOZNA.js.map +1 -0
  52. package/dist/{chunk-GLK6VM3F.js → chunk-ZNIWI3UC.js} +739 -737
  53. package/dist/chunk-ZNIWI3UC.js.map +1 -0
  54. package/dist/components.d.ts +5 -5
  55. package/dist/components.js +18 -16
  56. package/dist/components.js.map +1 -1
  57. package/dist/contextValidator-3JNZKUTX.js +9 -0
  58. package/dist/contextValidator-3JNZKUTX.js.map +1 -0
  59. package/dist/eslint-rules/pace-core-compliance.cjs +106 -0
  60. package/dist/{functions-D_kgHktt.d.ts → functions-DHebl8-F.d.ts} +1 -1
  61. package/dist/hooks.d.ts +55 -122
  62. package/dist/hooks.js +10 -13
  63. package/dist/hooks.js.map +1 -1
  64. package/dist/index.d.ts +60 -13
  65. package/dist/index.js +30 -25
  66. package/dist/index.js.map +1 -1
  67. package/dist/providers.d.ts +21 -3
  68. package/dist/providers.js +4 -3
  69. package/dist/rbac/index.d.ts +210 -139
  70. package/dist/rbac/index.js +17 -13
  71. package/dist/styles/index.js +1 -1
  72. package/dist/theming/runtime.d.ts +1 -13
  73. package/dist/theming/runtime.js +2 -2
  74. package/dist/{timezone-_pgH8qrY.d.ts → timezone-CHhWg6b4.d.ts} +3 -10
  75. package/dist/{types-UU913iLA.d.ts → types-BeoeWV5I.d.ts} +8 -0
  76. package/dist/{types-CEpcvwwF.d.ts → types-CkbwOr4Y.d.ts} +6 -0
  77. package/dist/types.d.ts +2 -2
  78. package/dist/types.js +1 -1
  79. package/dist/{usePublicRouteParams-BJAlWfuJ.d.ts → usePublicRouteParams-i3qtoBgg.d.ts} +38 -17
  80. package/dist/utils.d.ts +4 -5
  81. package/dist/utils.js +17 -19
  82. package/dist/utils.js.map +1 -1
  83. package/docs/api/README.md +21 -17
  84. package/docs/api/modules.md +4191 -2967
  85. package/docs/architecture/database-schema-requirements.md +161 -0
  86. package/docs/components/context-selector.md +126 -0
  87. package/docs/core-concepts/rbac-system.md +3 -3
  88. package/docs/documentation-index.md +2 -4
  89. package/docs/getting-started/cursor-rules.md +2 -1
  90. package/docs/migration/DOCUMENTATION_STRUCTURE.md +441 -0
  91. package/docs/migration/MIGRATION_GUIDE.md +2 -24
  92. package/docs/migration/RBAC_SCOPE_MIGRATION.md +385 -0
  93. package/docs/migration/README.md +52 -6
  94. package/docs/migration/V0.5.190_TO_V0.6.1_MIGRATION.md +1153 -0
  95. package/docs/migration/database-changes-december-2025.md +3 -3
  96. package/docs/pace-mint-fix-auto-selection.md +218 -0
  97. package/docs/pace-mint-rbac-setup.md +391 -0
  98. package/docs/rbac/event-based-apps.md +1 -1
  99. package/docs/rbac/getting-started.md +1 -1
  100. package/docs/rbac/quick-start.md +1 -1
  101. package/docs/rbac/secure-client-protection.md +330 -0
  102. package/docs/standards/README.md +1 -0
  103. package/package.json +4 -3
  104. package/scripts/audit/core/checks/accessibility.cjs +197 -0
  105. package/scripts/audit/core/checks/api-usage.cjs +191 -0
  106. package/scripts/audit/core/checks/bundle.cjs +142 -0
  107. package/scripts/{check-pace-core-compliance.cjs → audit/core/checks/compliance.cjs} +784 -685
  108. package/scripts/audit/core/checks/config.cjs +54 -0
  109. package/scripts/audit/core/checks/coverage.cjs +84 -0
  110. package/scripts/audit/core/checks/dependencies.cjs +985 -0
  111. package/scripts/audit/core/checks/documentation.cjs +268 -0
  112. package/scripts/audit/core/checks/environment.cjs +116 -0
  113. package/scripts/audit/core/checks/error-handling.cjs +340 -0
  114. package/scripts/audit/core/checks/forms.cjs +172 -0
  115. package/scripts/audit/core/checks/heuristics.cjs +68 -0
  116. package/scripts/audit/core/checks/hooks.cjs +334 -0
  117. package/scripts/audit/core/checks/imports.cjs +244 -0
  118. package/scripts/audit/core/checks/performance.cjs +325 -0
  119. package/scripts/audit/core/checks/routes.cjs +117 -0
  120. package/scripts/audit/core/checks/state.cjs +130 -0
  121. package/scripts/audit/core/checks/structure.cjs +65 -0
  122. package/scripts/audit/core/checks/style.cjs +584 -0
  123. package/scripts/audit/core/checks/testing.cjs +122 -0
  124. package/scripts/audit/core/checks/typescript.cjs +61 -0
  125. package/scripts/audit/core/scanner.cjs +199 -0
  126. package/scripts/audit/core/utils.cjs +137 -0
  127. package/scripts/audit/index.cjs +223 -0
  128. package/scripts/audit/reporters/console.cjs +151 -0
  129. package/scripts/audit/reporters/json.cjs +54 -0
  130. package/scripts/audit/reporters/markdown.cjs +124 -0
  131. package/scripts/audit-consuming-app.cjs +61 -936
  132. package/scripts/build-docs/build-decision.js +240 -0
  133. package/scripts/build-docs/cache-utils.js +105 -0
  134. package/scripts/build-docs/content-normalization.js +150 -0
  135. package/scripts/build-docs/file-utils.js +105 -0
  136. package/scripts/build-docs/git-utils.js +86 -0
  137. package/scripts/build-docs/hash-utils.js +116 -0
  138. package/scripts/build-docs/typedoc-runner.js +220 -0
  139. package/scripts/build-docs-incremental.js +77 -913
  140. package/scripts/utils/command-runner.js +16 -11
  141. package/scripts/validate-formats.js +61 -56
  142. package/scripts/validate-master.js +74 -69
  143. package/scripts/validate-pre-publish.js +70 -65
  144. package/src/__tests__/hooks/usePermissions.test.ts +2 -2
  145. package/src/components/Alert/Alert.test.tsx +12 -18
  146. package/src/components/Alert/Alert.tsx +5 -7
  147. package/src/components/Avatar/Avatar.test.tsx +4 -4
  148. package/src/components/Badge/Badge.tsx +14 -0
  149. package/src/components/Button/Button.tsx +22 -0
  150. package/src/components/Calendar/Calendar.tsx +8 -2
  151. package/src/components/Card/Card.tsx +4 -0
  152. package/src/components/Checkbox/Checkbox.test.tsx +12 -12
  153. package/src/components/Checkbox/Checkbox.tsx +2 -2
  154. package/src/components/ContextSelector/ContextSelector.tsx +384 -0
  155. package/src/components/ContextSelector/index.ts +3 -0
  156. package/src/components/DataTable/DataTable.tsx +38 -4
  157. package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +5 -6
  158. package/src/components/DataTable/__tests__/pagination.modes.test.tsx +18 -4
  159. package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +2 -3
  160. package/src/components/DataTable/components/AccessDeniedPage.tsx +16 -25
  161. package/src/components/DataTable/components/ActionButtons.tsx +10 -7
  162. package/src/components/DataTable/components/BulkOperationsDropdown.tsx +1 -1
  163. package/src/components/DataTable/components/ColumnFilter.tsx +10 -0
  164. package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +12 -0
  165. package/src/components/DataTable/components/DataTableBody.tsx +8 -0
  166. package/src/components/DataTable/components/DataTableCore.tsx +196 -554
  167. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +11 -0
  168. package/src/components/DataTable/components/DataTableLayout.tsx +559 -0
  169. package/src/components/DataTable/components/DataTableModals.tsx +8 -0
  170. package/src/components/DataTable/components/DataTableToolbar.tsx +8 -0
  171. package/src/components/DataTable/components/DraggableColumnHeader.tsx +12 -0
  172. package/src/components/DataTable/components/EditFields.tsx +307 -0
  173. package/src/components/DataTable/components/EditableRow.tsx +8 -0
  174. package/src/components/DataTable/components/EmptyState.tsx +10 -0
  175. package/src/components/DataTable/components/FilterRow.tsx +12 -0
  176. package/src/components/DataTable/components/GroupHeader.tsx +12 -0
  177. package/src/components/DataTable/components/GroupingDropdown.tsx +12 -0
  178. package/src/components/DataTable/components/ImportModal.tsx +7 -0
  179. package/src/components/DataTable/components/LoadingState.tsx +6 -0
  180. package/src/components/DataTable/components/PaginationControls.tsx +16 -1
  181. package/src/components/DataTable/components/RowComponent.tsx +391 -0
  182. package/src/components/DataTable/components/UnifiedTableBody.tsx +63 -851
  183. package/src/components/DataTable/components/VirtualizedDataTable.tsx +16 -4
  184. package/src/components/DataTable/components/__tests__/AccessDeniedPage.test.tsx +4 -2
  185. package/src/components/DataTable/components/cellValueUtils.ts +40 -0
  186. package/src/components/DataTable/components/hooks/useImportModalFocus.ts +53 -0
  187. package/src/components/DataTable/components/hooks/usePermissionTracking.ts +126 -0
  188. package/src/components/DataTable/context/DataTableContext.tsx +50 -0
  189. package/src/components/DataTable/core/ColumnFactory.ts +31 -0
  190. package/src/components/DataTable/core/DataTableContext.tsx +32 -1
  191. package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +10 -0
  192. package/src/components/DataTable/hooks/useColumnReordering.ts +12 -0
  193. package/src/components/DataTable/hooks/useColumnVisibilityPersistence.ts +10 -0
  194. package/src/components/DataTable/hooks/useDataTableDataPipeline.ts +16 -0
  195. package/src/components/DataTable/hooks/useDataTablePermissions.ts +127 -33
  196. package/src/components/DataTable/hooks/useDataTableState.ts +35 -1
  197. package/src/components/DataTable/hooks/useEffectiveColumnOrder.ts +12 -0
  198. package/src/components/DataTable/hooks/useServerSideDataEffect.ts +11 -0
  199. package/src/components/DataTable/hooks/useTableColumns.ts +8 -0
  200. package/src/components/DataTable/hooks/useTableHandlers.ts +14 -0
  201. package/src/components/DataTable/styles.ts +6 -6
  202. package/src/components/DataTable/types.ts +6 -10
  203. package/src/components/DataTable/utils/a11yUtils.ts +7 -0
  204. package/src/components/DataTable/utils/debugTools.ts +18 -113
  205. package/src/components/DataTable/utils/errorHandling.ts +12 -0
  206. package/src/components/DataTable/utils/exportUtils.ts +9 -0
  207. package/src/components/DataTable/utils/flexibleImport.ts +12 -48
  208. package/src/components/DataTable/utils/paginationUtils.ts +8 -0
  209. package/src/components/DataTable/utils/performanceUtils.ts +5 -1
  210. package/src/components/Dialog/Dialog.tsx +31 -3
  211. package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +180 -1
  212. package/src/components/ErrorBoundary/ErrorBoundary.tsx +45 -5
  213. package/src/components/ErrorBoundary/ErrorBoundaryContext.tsx +129 -0
  214. package/src/components/ErrorBoundary/index.ts +27 -2
  215. package/src/components/FileDisplay/FileDisplay.tsx +74 -28
  216. package/src/components/FileUpload/FileUpload.tsx +22 -2
  217. package/src/components/Footer/Footer.test.tsx +16 -16
  218. package/src/components/Footer/Footer.tsx +14 -11
  219. package/src/components/Form/Form.tsx +1 -0
  220. package/src/components/Header/Header.test.tsx +43 -73
  221. package/src/components/Header/Header.tsx +59 -49
  222. package/src/components/Input/Input.test.tsx +2 -2
  223. package/src/components/Input/Input.tsx +8 -4
  224. package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +4 -4
  225. package/src/components/LoginForm/LoginForm.tsx +4 -0
  226. package/src/components/NavigationMenu/NavigationMenu.tsx +14 -513
  227. package/src/components/NavigationMenu/types.ts +56 -0
  228. package/src/components/NavigationMenu/useNavigationFiltering.ts +390 -0
  229. package/src/components/PaceAppLayout/PaceAppLayout.integration.test.tsx +10 -19
  230. package/src/components/PaceAppLayout/PaceAppLayout.performance.test.tsx +2 -2
  231. package/src/components/PaceAppLayout/PaceAppLayout.security.test.tsx +5 -5
  232. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +13 -11
  233. package/src/components/PaceAppLayout/PaceAppLayout.tsx +167 -44
  234. package/src/components/PaceAppLayout/README.md +14 -17
  235. package/src/components/PaceAppLayout/test-setup.tsx +3 -4
  236. package/src/components/PaceLoginPage/PaceLoginPage.tsx +3 -0
  237. package/src/components/PasswordChange/PasswordChangeForm.tsx +9 -0
  238. package/src/components/ProtectedRoute/ProtectedRoute.tsx +3 -9
  239. package/src/components/PublicLayout/PublicPageLayout.tsx +2 -5
  240. package/src/components/PublicLayout/PublicPageProvider.tsx +4 -0
  241. package/src/components/Select/Select.tsx +80 -434
  242. package/src/components/Select/context.ts +23 -0
  243. package/src/components/Select/hooks/useSelectEvents.ts +87 -0
  244. package/src/components/Select/hooks/useSelectSearch.ts +91 -0
  245. package/src/components/Select/hooks/useSelectState.ts +104 -0
  246. package/src/components/Select/index.ts +9 -1
  247. package/src/components/Select/types.ts +123 -0
  248. package/src/components/Select/utils/text.ts +26 -0
  249. package/src/components/SessionRestorationLoader/SessionRestorationLoader.tsx +4 -5
  250. package/src/components/Switch/Switch.tsx +4 -4
  251. package/src/components/Tabs/Tabs.tsx +1 -1
  252. package/src/components/Toast/Toast.tsx +4 -0
  253. package/src/components/Tooltip/Tooltip.tsx +2 -2
  254. package/src/components/UserMenu/UserMenu.test.tsx +24 -11
  255. package/src/components/UserMenu/UserMenu.tsx +21 -18
  256. package/src/components/index.ts +7 -7
  257. package/src/eslint-rules/pace-core-compliance.cjs +106 -0
  258. package/src/hooks/__tests__/index.unit.test.ts +2 -5
  259. package/src/hooks/__tests__/useAppConfig.unit.test.ts +4 -98
  260. package/src/hooks/index.ts +1 -2
  261. package/src/hooks/public/usePublicEvent.ts +4 -0
  262. package/src/hooks/public/usePublicEventLogo.ts +4 -0
  263. package/src/hooks/public/usePublicFileDisplay.ts +4 -0
  264. package/src/hooks/public/usePublicRouteParams.ts +4 -0
  265. package/src/hooks/services/useAuth.ts +32 -0
  266. package/src/hooks/services/useCurrentEvent.ts +6 -0
  267. package/src/hooks/services/useCurrentOrganisation.ts +6 -0
  268. package/src/hooks/useAppConfig.ts +15 -30
  269. package/src/hooks/useDebounce.ts +9 -0
  270. package/src/hooks/useEventTheme.ts +6 -0
  271. package/src/hooks/useFileDisplay.ts +81 -50
  272. package/src/hooks/useFileReference.ts +25 -7
  273. package/src/hooks/useFileUrl.ts +11 -1
  274. package/src/hooks/useFocusManagement.ts +14 -0
  275. package/src/hooks/useFocusTrap.ts +3 -0
  276. package/src/hooks/useInactivityTracker.ts +3 -0
  277. package/src/hooks/useKeyboardShortcuts.ts +4 -0
  278. package/src/hooks/useOrganisationPermissions.ts +4 -0
  279. package/src/hooks/useOrganisationSecurity.ts +4 -0
  280. package/src/hooks/usePerformanceMonitor.ts +4 -0
  281. package/src/hooks/usePermissionCache.ts +7 -0
  282. package/src/hooks/useQueryCache.ts +12 -1
  283. package/src/hooks/useSessionRestoration.ts +4 -0
  284. package/src/hooks/useStorage.ts +4 -0
  285. package/src/hooks/useToast.ts +1 -1
  286. package/src/index.ts +6 -6
  287. package/src/providers/__tests__/OrganisationProvider.test.tsx +92 -70
  288. package/src/providers/services/AuthServiceProvider.tsx +35 -7
  289. package/src/providers/services/EventServiceProvider.tsx +51 -5
  290. package/src/providers/services/InactivityServiceProvider.tsx +18 -0
  291. package/src/providers/services/OrganisationServiceProvider.tsx +18 -0
  292. package/src/providers/services/UnifiedAuthProvider.tsx +126 -134
  293. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +29 -13
  294. package/src/rbac/README.md +1 -1
  295. package/src/rbac/__tests__/adapters.comprehensive.test.tsx +1 -1
  296. package/src/rbac/__tests__/scenarios.user-role.test.tsx +4 -5
  297. package/src/rbac/adapters.tsx +12 -3
  298. package/src/rbac/api.test.ts +59 -51
  299. package/src/rbac/api.ts +246 -167
  300. package/src/rbac/components/NavigationProvider.tsx +4 -1
  301. package/src/rbac/components/PagePermissionGuard.tsx +185 -17
  302. package/src/rbac/components/RoleBasedRouter.tsx +5 -1
  303. package/src/rbac/components/SecureDataProvider.test.tsx +84 -49
  304. package/src/rbac/components/SecureDataProvider.tsx +20 -5
  305. package/src/rbac/components/__tests__/PagePermissionGuard.race-condition.test.tsx +24 -14
  306. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +7 -0
  307. package/src/rbac/components/__tests__/PagePermissionGuard.verification.test.tsx +14 -6
  308. package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +15 -4
  309. package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +148 -24
  310. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +81 -15
  311. package/src/rbac/engine.ts +38 -14
  312. package/src/rbac/hooks/__tests__/useSecureSupabase.test.ts +32 -21
  313. package/src/rbac/hooks/permissions/index.ts +7 -0
  314. package/src/rbac/hooks/permissions/useAccessLevel.ts +105 -0
  315. package/src/rbac/hooks/permissions/useCachedPermissions.ts +79 -0
  316. package/src/rbac/hooks/permissions/useCan.ts +377 -0
  317. package/src/rbac/hooks/permissions/useHasAllPermissions.ts +90 -0
  318. package/src/rbac/hooks/permissions/useHasAnyPermission.ts +90 -0
  319. package/src/rbac/hooks/permissions/useMultiplePermissions.ts +93 -0
  320. package/src/rbac/hooks/permissions/usePermissions.ts +253 -0
  321. package/src/rbac/hooks/useCan.test.ts +64 -66
  322. package/src/rbac/hooks/usePermissions.ts +14 -995
  323. package/src/rbac/hooks/useRBAC.test.ts +1 -5
  324. package/src/rbac/hooks/useRBAC.ts +36 -37
  325. package/src/rbac/hooks/useResolvedScope.test.ts +120 -35
  326. package/src/rbac/hooks/useResolvedScope.ts +35 -40
  327. package/src/rbac/hooks/useResourcePermissions.test.ts +54 -18
  328. package/src/rbac/hooks/useResourcePermissions.ts +14 -4
  329. package/src/rbac/hooks/useSecureSupabase.ts +27 -7
  330. package/src/rbac/index.ts +7 -0
  331. package/src/rbac/permissions.ts +0 -30
  332. package/src/rbac/secureClient.test.ts +22 -18
  333. package/src/rbac/secureClient.ts +294 -68
  334. package/src/rbac/security.ts +0 -17
  335. package/src/rbac/types.ts +9 -0
  336. package/src/rbac/utils/__tests__/contextValidator.test.ts +64 -86
  337. package/src/rbac/utils/clientSecurity.ts +93 -0
  338. package/src/rbac/utils/contextValidator.ts +77 -168
  339. package/src/services/AuthService.ts +39 -7
  340. package/src/services/EventService.ts +186 -54
  341. package/src/services/OrganisationService.ts +81 -14
  342. package/src/services/__tests__/EventService.test.ts +1 -2
  343. package/src/services/base/BaseService.ts +3 -0
  344. package/src/theming/__tests__/parseEventColours.test.ts +6 -9
  345. package/src/theming/parseEventColours.ts +5 -19
  346. package/src/types/vitest-globals.d.ts +51 -26
  347. package/src/utils/__mocks__/supabaseMock.ts +1 -3
  348. package/src/utils/__tests__/formatting.unit.test.ts +4 -4
  349. package/src/utils/__tests__/index.unit.test.ts +2 -2
  350. package/src/utils/audit/audit.ts +0 -3
  351. package/src/utils/core/cn.ts +1 -1
  352. package/src/utils/dynamic/dynamicUtils.ts +7 -4
  353. package/src/utils/file-reference/index.ts +53 -1
  354. package/src/utils/formatting/formatting.ts +8 -18
  355. package/src/utils/index.ts +0 -1
  356. package/dist/chunk-3QRJFVBR.js.map +0 -1
  357. package/dist/chunk-3XTALGJF.js.map +0 -1
  358. package/dist/chunk-4N5C5XZU.js.map +0 -1
  359. package/dist/chunk-4ZC4GX36.js.map +0 -1
  360. package/dist/chunk-7D4SUZUM.js +0 -38
  361. package/dist/chunk-BYFSK72L.js.map +0 -1
  362. package/dist/chunk-EXUD6RNJ.js +0 -451
  363. package/dist/chunk-EXUD6RNJ.js.map +0 -1
  364. package/dist/chunk-GLK6VM3F.js.map +0 -1
  365. package/dist/chunk-I7PSE6JW.js.map +0 -1
  366. package/dist/chunk-JBKQ3SAO.js.map +0 -1
  367. package/dist/chunk-KNC55RTG.js.map +0 -1
  368. package/dist/chunk-LXQLPRQ2.js.map +0 -1
  369. package/dist/chunk-R77UEZ4E.js.map +0 -1
  370. package/dist/chunk-SQGMNID3.js.map +0 -1
  371. package/dist/chunk-T33XF5ZC.js +0 -12922
  372. package/dist/chunk-T33XF5ZC.js.map +0 -1
  373. package/dist/chunk-XM25TVIE.js.map +0 -1
  374. package/docs/api/classes/ColumnFactory.md +0 -243
  375. package/docs/api/classes/ErrorBoundary.md +0 -144
  376. package/docs/api/classes/InvalidScopeError.md +0 -73
  377. package/docs/api/classes/Logger.md +0 -178
  378. package/docs/api/classes/MissingUserContextError.md +0 -66
  379. package/docs/api/classes/OrganisationContextRequiredError.md +0 -66
  380. package/docs/api/classes/PermissionDeniedError.md +0 -73
  381. package/docs/api/classes/RBACAuditManager.md +0 -297
  382. package/docs/api/classes/RBACCache.md +0 -322
  383. package/docs/api/classes/RBACEngine.md +0 -171
  384. package/docs/api/classes/RBACError.md +0 -76
  385. package/docs/api/classes/RBACNotInitializedError.md +0 -66
  386. package/docs/api/classes/SecureSupabaseClient.md +0 -160
  387. package/docs/api/classes/StorageUtils.md +0 -328
  388. package/docs/api/enums/FileCategory.md +0 -184
  389. package/docs/api/enums/LogLevel.md +0 -54
  390. package/docs/api/enums/RBACErrorCode.md +0 -228
  391. package/docs/api/enums/RPCFunction.md +0 -118
  392. package/docs/api/interfaces/AddressFieldProps.md +0 -241
  393. package/docs/api/interfaces/AddressFieldRef.md +0 -94
  394. package/docs/api/interfaces/AggregateConfig.md +0 -43
  395. package/docs/api/interfaces/AutocompleteOptions.md +0 -75
  396. package/docs/api/interfaces/AvatarProps.md +0 -128
  397. package/docs/api/interfaces/BadgeProps.md +0 -27
  398. package/docs/api/interfaces/ButtonProps.md +0 -53
  399. package/docs/api/interfaces/CalendarProps.md +0 -70
  400. package/docs/api/interfaces/CardProps.md +0 -66
  401. package/docs/api/interfaces/ColorPalette.md +0 -7
  402. package/docs/api/interfaces/ColorShade.md +0 -66
  403. package/docs/api/interfaces/ComplianceResult.md +0 -30
  404. package/docs/api/interfaces/DataAccessRecord.md +0 -96
  405. package/docs/api/interfaces/DataRecord.md +0 -11
  406. package/docs/api/interfaces/DataTableAction.md +0 -249
  407. package/docs/api/interfaces/DataTableColumn.md +0 -504
  408. package/docs/api/interfaces/DataTableProps.md +0 -625
  409. package/docs/api/interfaces/DataTableToolbarButton.md +0 -96
  410. package/docs/api/interfaces/DatabaseComplianceResult.md +0 -85
  411. package/docs/api/interfaces/DatabaseIssue.md +0 -41
  412. package/docs/api/interfaces/EmptyStateConfig.md +0 -61
  413. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +0 -235
  414. package/docs/api/interfaces/EventAppRoleData.md +0 -71
  415. package/docs/api/interfaces/ExportColumn.md +0 -90
  416. package/docs/api/interfaces/ExportOptions.md +0 -126
  417. package/docs/api/interfaces/FileDisplayProps.md +0 -249
  418. package/docs/api/interfaces/FileMetadata.md +0 -129
  419. package/docs/api/interfaces/FileReference.md +0 -118
  420. package/docs/api/interfaces/FileSizeLimits.md +0 -7
  421. package/docs/api/interfaces/FileUploadOptions.md +0 -139
  422. package/docs/api/interfaces/FileUploadProps.md +0 -293
  423. package/docs/api/interfaces/FooterProps.md +0 -105
  424. package/docs/api/interfaces/FormFieldProps.md +0 -166
  425. package/docs/api/interfaces/FormProps.md +0 -113
  426. package/docs/api/interfaces/GrantEventAppRoleParams.md +0 -122
  427. package/docs/api/interfaces/InactivityWarningModalProps.md +0 -115
  428. package/docs/api/interfaces/InputProps.md +0 -53
  429. package/docs/api/interfaces/LabelProps.md +0 -107
  430. package/docs/api/interfaces/LoggerConfig.md +0 -62
  431. package/docs/api/interfaces/LoginFormProps.md +0 -184
  432. package/docs/api/interfaces/NavigationAccessRecord.md +0 -107
  433. package/docs/api/interfaces/NavigationContextType.md +0 -164
  434. package/docs/api/interfaces/NavigationGuardProps.md +0 -139
  435. package/docs/api/interfaces/NavigationItem.md +0 -120
  436. package/docs/api/interfaces/NavigationMenuProps.md +0 -221
  437. package/docs/api/interfaces/NavigationProviderProps.md +0 -117
  438. package/docs/api/interfaces/Organisation.md +0 -140
  439. package/docs/api/interfaces/OrganisationContextType.md +0 -388
  440. package/docs/api/interfaces/OrganisationMembership.md +0 -140
  441. package/docs/api/interfaces/OrganisationProviderProps.md +0 -76
  442. package/docs/api/interfaces/OrganisationSecurityError.md +0 -62
  443. package/docs/api/interfaces/PaceAppLayoutProps.md +0 -406
  444. package/docs/api/interfaces/PaceLoginPageProps.md +0 -47
  445. package/docs/api/interfaces/PageAccessRecord.md +0 -85
  446. package/docs/api/interfaces/PagePermissionContextType.md +0 -140
  447. package/docs/api/interfaces/PagePermissionGuardProps.md +0 -153
  448. package/docs/api/interfaces/PagePermissionProviderProps.md +0 -119
  449. package/docs/api/interfaces/PaletteData.md +0 -41
  450. package/docs/api/interfaces/ParsedAddress.md +0 -120
  451. package/docs/api/interfaces/PermissionEnforcerProps.md +0 -153
  452. package/docs/api/interfaces/ProgressProps.md +0 -42
  453. package/docs/api/interfaces/ProtectedRouteProps.md +0 -97
  454. package/docs/api/interfaces/PublicPageFooterProps.md +0 -112
  455. package/docs/api/interfaces/PublicPageHeaderProps.md +0 -125
  456. package/docs/api/interfaces/PublicPageLayoutProps.md +0 -198
  457. package/docs/api/interfaces/QuickFix.md +0 -52
  458. package/docs/api/interfaces/RBACAccessValidateParams.md +0 -52
  459. package/docs/api/interfaces/RBACAccessValidateResult.md +0 -41
  460. package/docs/api/interfaces/RBACAuditLogParams.md +0 -85
  461. package/docs/api/interfaces/RBACAuditLogResult.md +0 -52
  462. package/docs/api/interfaces/RBACConfig.md +0 -133
  463. package/docs/api/interfaces/RBACContext.md +0 -52
  464. package/docs/api/interfaces/RBACLogger.md +0 -112
  465. package/docs/api/interfaces/RBACPageAccessCheckParams.md +0 -74
  466. package/docs/api/interfaces/RBACPerformanceMetrics.md +0 -138
  467. package/docs/api/interfaces/RBACPermissionCheckParams.md +0 -74
  468. package/docs/api/interfaces/RBACPermissionCheckResult.md +0 -52
  469. package/docs/api/interfaces/RBACPermissionsGetParams.md +0 -63
  470. package/docs/api/interfaces/RBACPermissionsGetResult.md +0 -63
  471. package/docs/api/interfaces/RBACResult.md +0 -58
  472. package/docs/api/interfaces/RBACRoleGrantParams.md +0 -63
  473. package/docs/api/interfaces/RBACRoleGrantResult.md +0 -52
  474. package/docs/api/interfaces/RBACRoleRevokeParams.md +0 -63
  475. package/docs/api/interfaces/RBACRoleRevokeResult.md +0 -52
  476. package/docs/api/interfaces/RBACRoleValidateParams.md +0 -52
  477. package/docs/api/interfaces/RBACRoleValidateResult.md +0 -63
  478. package/docs/api/interfaces/RBACRolesListParams.md +0 -52
  479. package/docs/api/interfaces/RBACRolesListResult.md +0 -74
  480. package/docs/api/interfaces/RBACSessionTrackParams.md +0 -74
  481. package/docs/api/interfaces/RBACSessionTrackResult.md +0 -52
  482. package/docs/api/interfaces/ResourcePermissions.md +0 -155
  483. package/docs/api/interfaces/RevokeEventAppRoleParams.md +0 -100
  484. package/docs/api/interfaces/RoleBasedRouterContextType.md +0 -151
  485. package/docs/api/interfaces/RoleBasedRouterProps.md +0 -156
  486. package/docs/api/interfaces/RoleManagementResult.md +0 -52
  487. package/docs/api/interfaces/RouteAccessRecord.md +0 -107
  488. package/docs/api/interfaces/RouteConfig.md +0 -134
  489. package/docs/api/interfaces/RuntimeComplianceResult.md +0 -55
  490. package/docs/api/interfaces/SecureDataContextType.md +0 -168
  491. package/docs/api/interfaces/SecureDataProviderProps.md +0 -132
  492. package/docs/api/interfaces/SessionRestorationLoaderProps.md +0 -34
  493. package/docs/api/interfaces/SetupIssue.md +0 -41
  494. package/docs/api/interfaces/StorageConfig.md +0 -41
  495. package/docs/api/interfaces/StorageFileInfo.md +0 -74
  496. package/docs/api/interfaces/StorageFileMetadata.md +0 -151
  497. package/docs/api/interfaces/StorageListOptions.md +0 -99
  498. package/docs/api/interfaces/StorageListResult.md +0 -41
  499. package/docs/api/interfaces/StorageUploadOptions.md +0 -101
  500. package/docs/api/interfaces/StorageUploadResult.md +0 -63
  501. package/docs/api/interfaces/StorageUrlOptions.md +0 -60
  502. package/docs/api/interfaces/StyleImport.md +0 -19
  503. package/docs/api/interfaces/SwitchProps.md +0 -34
  504. package/docs/api/interfaces/TabsContentProps.md +0 -9
  505. package/docs/api/interfaces/TabsListProps.md +0 -9
  506. package/docs/api/interfaces/TabsProps.md +0 -9
  507. package/docs/api/interfaces/TabsTriggerProps.md +0 -50
  508. package/docs/api/interfaces/TextareaProps.md +0 -53
  509. package/docs/api/interfaces/ToastActionElement.md +0 -9
  510. package/docs/api/interfaces/ToastProps.md +0 -9
  511. package/docs/api/interfaces/UnifiedAuthContextType.md +0 -820
  512. package/docs/api/interfaces/UnifiedAuthProviderProps.md +0 -171
  513. package/docs/api/interfaces/UseFormDialogOptions.md +0 -62
  514. package/docs/api/interfaces/UseFormDialogReturn.md +0 -117
  515. package/docs/api/interfaces/UseInactivityTrackerOptions.md +0 -136
  516. package/docs/api/interfaces/UseInactivityTrackerReturn.md +0 -123
  517. package/docs/api/interfaces/UsePublicEventLogoOptions.md +0 -87
  518. package/docs/api/interfaces/UsePublicEventLogoReturn.md +0 -81
  519. package/docs/api/interfaces/UsePublicEventOptions.md +0 -34
  520. package/docs/api/interfaces/UsePublicEventReturn.md +0 -68
  521. package/docs/api/interfaces/UsePublicFileDisplayOptions.md +0 -47
  522. package/docs/api/interfaces/UsePublicFileDisplayReturn.md +0 -120
  523. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +0 -94
  524. package/docs/api/interfaces/UseResolvedScopeOptions.md +0 -47
  525. package/docs/api/interfaces/UseResolvedScopeReturn.md +0 -47
  526. package/docs/api/interfaces/UseResourcePermissionsOptions.md +0 -34
  527. package/docs/api/interfaces/UserEventAccess.md +0 -118
  528. package/docs/api/interfaces/UserMenuProps.md +0 -86
  529. package/docs/api/interfaces/UserProfile.md +0 -63
  530. package/docs/migration/quick-migration-guide.md +0 -356
  531. package/docs/migration/service-architecture.md +0 -281
  532. package/src/components/EventSelector/EventSelector.test.tsx +0 -720
  533. package/src/components/EventSelector/EventSelector.tsx +0 -420
  534. package/src/components/EventSelector/index.ts +0 -3
  535. package/src/components/OrganisationSelector/OrganisationSelector.test.tsx +0 -784
  536. package/src/components/OrganisationSelector/OrganisationSelector.tsx +0 -324
  537. package/src/components/OrganisationSelector/index.ts +0 -9
  538. package/src/hooks/__tests__/useSecureDataAccess.unit.test.tsx +0 -680
  539. package/src/hooks/useSecureDataAccess.test.ts +0 -559
  540. package/src/hooks/useSecureDataAccess.ts +0 -681
  541. /package/dist/{DataTable-DQ7RSOHE.js.map → DataTable-THFPBKTP.js.map} +0 -0
  542. /package/dist/{UnifiedAuthProvider-ATAP5UTR.js.map → UnifiedAuthProvider-KAGUYQ4J.js.map} +0 -0
  543. /package/dist/{api-N774RPUA.js.map → api-IAGWF3ZG.js.map} +0 -0
  544. /package/dist/{audit-B5P6FFIR.js.map → audit-V53FV5AG.js.map} +0 -0
  545. /package/dist/{chunk-7D4SUZUM.js.map → chunk-DGUM43GV.js.map} +0 -0
  546. /package/docs/migration/{organisation-context-timing-fix.md → V0.3.44_organisation-context-timing-fix.md} +0 -0
  547. /package/docs/migration/{rbac-migration.md → V0.4.0_rbac-migration.md} +0 -0
  548. /package/docs/migration/{person-scoped-profiles-migration-guide.md → V0.5.190_person-scoped-profiles-migration-guide.md} +0 -0
  549. /package/docs/migration/{REACT_19_MIGRATION.md → V0.6.0_REACT_19_MIGRATION.md} +0 -0
@@ -14,9 +14,9 @@ import type {
14
14
  import { createLogger } from '../../../utils/core/logger';
15
15
 
16
16
  /**
17
- * Debug levels for controlling verbosity
17
+ * Debug levels for controlling verbosity (internal use only)
18
18
  */
19
- export enum DebugLevel {
19
+ enum DebugLevel {
20
20
  NONE = 0,
21
21
  ERROR = 1,
22
22
  WARN = 2,
@@ -26,9 +26,9 @@ export enum DebugLevel {
26
26
  }
27
27
 
28
28
  /**
29
- * Performance debug configuration
29
+ * Performance debug configuration (internal use only)
30
30
  */
31
- export interface DebugConfig {
31
+ interface DebugConfig {
32
32
  enabled: boolean;
33
33
  level: DebugLevel;
34
34
  logToConsole: boolean;
@@ -41,9 +41,9 @@ export interface DebugConfig {
41
41
  }
42
42
 
43
43
  /**
44
- * Default debug configuration
44
+ * Default debug configuration (internal use only)
45
45
  */
46
- export const DEFAULT_DEBUG_CONFIG: DebugConfig = {
46
+ const DEFAULT_DEBUG_CONFIG: DebugConfig = {
47
47
  enabled: import.meta.env.MODE === 'development',
48
48
  level: DebugLevel.INFO,
49
49
  logToConsole: true,
@@ -56,9 +56,9 @@ export const DEFAULT_DEBUG_CONFIG: DebugConfig = {
56
56
  };
57
57
 
58
58
  /**
59
- * Debug log entry interface
59
+ * Debug log entry interface (internal use only)
60
60
  */
61
- export interface DebugLogEntry {
61
+ interface DebugLogEntry {
62
62
  timestamp: number;
63
63
  level: DebugLevel;
64
64
  category: string;
@@ -70,9 +70,9 @@ export interface DebugLogEntry {
70
70
  }
71
71
 
72
72
  /**
73
- * Performance timeline entry
73
+ * Performance timeline entry (internal use only)
74
74
  */
75
- export interface PerformanceTimelineEntry {
75
+ interface PerformanceTimelineEntry {
76
76
  id: string;
77
77
  operation: string;
78
78
  startTime: number;
@@ -83,9 +83,9 @@ export interface PerformanceTimelineEntry {
83
83
  }
84
84
 
85
85
  /**
86
- * Memory snapshot
86
+ * Memory snapshot (internal use only)
87
87
  */
88
- export interface MemorySnapshot {
88
+ interface MemorySnapshot {
89
89
  timestamp: number;
90
90
  heapUsed: number;
91
91
  heapTotal: number;
@@ -94,9 +94,9 @@ export interface MemorySnapshot {
94
94
  }
95
95
 
96
96
  /**
97
- * Render performance data
97
+ * Render performance data (internal use only)
98
98
  */
99
- export interface RenderPerformanceData {
99
+ interface RenderPerformanceData {
100
100
  componentName: string;
101
101
  renderCount: number;
102
102
  totalRenderTime: number;
@@ -106,9 +106,9 @@ export interface RenderPerformanceData {
106
106
  }
107
107
 
108
108
  /**
109
- * Advanced DataTable debugger
109
+ * Advanced DataTable debugger (internal use only)
110
110
  */
111
- export class DataTableDebugger {
111
+ class DataTableDebugger {
112
112
  private config: DebugConfig
113
113
  private logger = createLogger('DataTableDebugger');
114
114
  private logEntries: DebugLogEntry[] = [];
@@ -469,104 +469,9 @@ export class DataTableDebugger {
469
469
  }
470
470
 
471
471
  /**
472
- * Global debugger instance
472
+ * Global debugger instance (internal use only)
473
473
  */
474
- export const dataTableDebugger = new DataTableDebugger();
475
-
476
- /**
477
- * Performance profiler decorator
478
- */
479
- export function profile(operation: string) {
480
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
481
- return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
482
- const originalMethod = descriptor.value;
483
-
484
- descriptor.value = async function (this: unknown, ...args: unknown[]) {
485
- const operationId = `${target.constructor.name}.${propertyKey}_${Date.now()}`;
486
-
487
- dataTableDebugger.startOperation(operationId, operation, {
488
- className: target.constructor.name,
489
- methodName: propertyKey,
490
- args: args.length,
491
- });
492
-
493
- try {
494
- const result = await originalMethod.apply(this, args);
495
- dataTableDebugger.endOperation(operationId, { success: true });
496
- return result;
497
- } catch (error) {
498
- dataTableDebugger.endOperation(operationId, { success: false, error: error instanceof Error ? error.message : String(error) });
499
- dataTableDebugger.log(DebugLevel.ERROR, 'Performance', `Operation failed: ${operation}`, error);
500
- throw error;
501
- }
502
- };
503
-
504
- return descriptor;
505
- };
506
- }
507
-
508
- /**
509
- * Memory monitoring utility
510
- */
511
- export class MemoryMonitor {
512
- private debuggerInstance: DataTableDebugger;
513
- private intervalId: NodeJS.Timeout | null = null;
514
-
515
- constructor(debuggerInstance: DataTableDebugger = dataTableDebugger) {
516
- this.debuggerInstance = debuggerInstance;
517
- }
518
-
519
- start(interval: number = 5000): void {
520
- this.stop(); // Stop any existing monitoring
521
-
522
- this.intervalId = setInterval(() => {
523
- this.debuggerInstance.takeMemorySnapshot('periodic');
524
- }, interval);
525
- }
526
-
527
- stop(): void {
528
- if (this.intervalId) {
529
- clearInterval(this.intervalId);
530
- this.intervalId = null;
531
- }
532
- }
533
- }
534
-
535
- /**
536
- * Performance monitoring React hook
537
- */
538
- export function usePerformanceDebugger(componentName: string) {
539
- const startTime = React.useRef<number>(0);
540
-
541
- React.useEffect(() => {
542
- startTime.current = performance.now();
543
-
544
- return () => {
545
- const renderTime = performance.now() - startTime.current;
546
- dataTableDebugger.trackRender(componentName, renderTime);
547
- };
548
- });
549
-
550
- const trackOperation = React.useCallback((operation: string, fn: () => unknown) => {
551
- const operationId = `${componentName}_${operation}_${Date.now()}`;
552
- dataTableDebugger.startOperation(operationId, operation);
553
-
554
- try {
555
- const result = fn();
556
- dataTableDebugger.endOperation(operationId);
557
- return result;
558
- } catch (error) {
559
- dataTableDebugger.endOperation(operationId, { error: error instanceof Error ? error.message : String(error) });
560
- throw error;
561
- }
562
- }, [componentName]);
563
-
564
- return {
565
- trackOperation,
566
- log: (level: DebugLevel, message: string, data?: unknown) =>
567
- dataTableDebugger.log(level, componentName, message, data),
568
- };
569
- }
474
+ const dataTableDebugger = new DataTableDebugger();
570
475
 
571
476
  /**
572
477
  * Development tools integration
@@ -23,6 +23,10 @@ export enum DataTableErrorType {
23
23
  MEMORY = 'memory'
24
24
  }
25
25
 
26
+ /**
27
+ * Custom error class for DataTable operations.
28
+ * Provides error type and recoverability information.
29
+ */
26
30
  export class DataTableError extends Error {
27
31
  constructor(
28
32
  message: string,
@@ -34,6 +38,10 @@ export class DataTableError extends Error {
34
38
  }
35
39
  }
36
40
 
41
+ /**
42
+ * Error recovery manager for DataTable.
43
+ * Handles error recovery strategies and error logging.
44
+ */
37
45
  export class ErrorRecoveryManager {
38
46
  constructor(private config: FallbackConfig) {}
39
47
 
@@ -46,6 +54,10 @@ export class ErrorRecoveryManager {
46
54
  }
47
55
  }
48
56
 
57
+ /**
58
+ * Memory monitor for DataTable.
59
+ * Tracks memory usage and provides warnings when thresholds are exceeded.
60
+ */
49
61
  export class MemoryMonitor {
50
62
  constructor(private threshold: number = 100) {}
51
63
 
@@ -333,6 +333,15 @@ export async function exportToCSVWithTableRows(
333
333
  * - Triggers browser download
334
334
  * - Throws error if export fails
335
335
  */
336
+ /**
337
+ * Exports DataTable data to CSV format.
338
+ * Handles column mapping, data formatting, and browser download.
339
+ *
340
+ * @template TData - The type of data records in the table
341
+ * @param data - Array of data records to export
342
+ * @param columns - Column definitions for export
343
+ * @param filename - Name of the CSV file to download
344
+ */
336
345
  export function exportToCSV<TData extends DataRecord>(
337
346
  data: TData[],
338
347
  columns: ExportColumn[],
@@ -11,10 +11,18 @@
11
11
  import { createLogger } from '../../../utils/core/logger';
12
12
  import type { CellValue } from '../types';
13
13
 
14
+ /**
15
+ * Column mapping interface for CSV import.
16
+ * Maps target field names to possible CSV column names.
17
+ */
14
18
  export interface ColumnMapping {
15
19
  [targetField: string]: string[];
16
20
  }
17
21
 
22
+ /**
23
+ * Options for flexible CSV import.
24
+ * Configures column mapping, date parsing, validation, and other import settings.
25
+ */
18
26
  export interface ImportOptions {
19
27
  columnMappings?: ColumnMapping;
20
28
  dateFormats?: readonly string[];
@@ -160,6 +168,10 @@ export interface ImportError {
160
168
  message: string;
161
169
  }
162
170
 
171
+ /**
172
+ * Import warning interface.
173
+ * Represents warnings encountered during CSV import.
174
+ */
163
175
  export interface ImportWarning {
164
176
  row: number;
165
177
  field: string;
@@ -609,54 +621,6 @@ export const commonMappings = {
609
621
  }
610
622
  };
611
623
 
612
- /**
613
- * Helper function to create import options with predefined date format sets
614
- */
615
- export function createImportOptions(options: Partial<ImportOptions> = {}): ImportOptions {
616
- return {
617
- dateFormats: DATE_FORMAT_SETS.ALL,
618
- strictDateParsing: false,
619
- ...options,
620
- };
621
- }
622
-
623
- /**
624
- * Helper function to create import options for specific regions
625
- */
626
- export function createRegionalImportOptions(region: 'US' | 'EUROPEAN' | 'ISO' | 'NATURAL' | 'ALL', options: Partial<ImportOptions> = {}): ImportOptions {
627
- return {
628
- dateFormats: DATE_FORMAT_SETS[region],
629
- strictDateParsing: false,
630
- ...options,
631
- };
632
- }
633
-
634
- /**
635
- * Helper function to test if a string can be parsed as a date
636
- */
637
- export function testDateParsing(dateStr: string, formats?: string[]): { success: boolean; parsedDate?: Date; matchedFormat?: string } {
638
- if (!dateStr || typeof dateStr !== 'string') {
639
- return { success: false };
640
- }
641
-
642
- const testFormats = formats || DATE_FORMAT_SETS.ALL;
643
-
644
- for (const format of testFormats) {
645
- // This is a simplified version of the parseDateWithFormat function
646
- // In a real implementation, you'd want to reuse the actual parsing logic
647
- try {
648
- const date = new Date(dateStr);
649
- if (!isNaN(date.getTime())) {
650
- return { success: true, parsedDate: date, matchedFormat: 'native' };
651
- }
652
- } catch (error) {
653
- // Continue to next format
654
- }
655
- }
656
-
657
- return { success: false };
658
- }
659
-
660
624
  /**
661
625
  * Helper function to get suggested date formats based on sample data
662
626
  */
@@ -121,6 +121,14 @@ export interface PaginationBinding {
121
121
  * });
122
122
  * ```
123
123
  */
124
+ /**
125
+ * Creates a unified pagination binding that works across all pagination modes.
126
+ * Provides consistent pagination state and actions regardless of client/server/hybrid mode.
127
+ *
128
+ * @template TData - The type of data records in the table
129
+ * @param config - Pagination binding configuration
130
+ * @returns Unified pagination state and actions
131
+ */
124
132
  export function getPaginationBinding<TData extends DataRecord>(
125
133
  config: PaginationBindingConfig<TData>
126
134
  ): PaginationBinding {
@@ -17,7 +17,7 @@ import type {
17
17
  // ============================================================================
18
18
 
19
19
  /**
20
- * Determines the optimal pagination mode based on dataset size
20
+ * Determines the optimal pagination mode based on dataset size.
21
21
  *
22
22
  * IMPORTANT: This function NEVER returns 'server' mode - it only returns 'client' or 'hybrid'.
23
23
  * Server mode should ONLY be used when serverSide config is explicitly provided.
@@ -26,6 +26,10 @@ import type {
26
26
  *
27
27
  * For large datasets (>10k rows), returns 'hybrid' which still uses client-side pagination
28
28
  * but with optimizations. If true server-side pagination is needed, serverSide config must be provided.
29
+ *
30
+ * @param dataLength - Number of rows in the dataset
31
+ * @param serverSideThreshold - Threshold for switching to hybrid mode (default: 10000)
32
+ * @returns Optimal pagination mode ('client' or 'hybrid')
29
33
  */
30
34
  export function determinePaginationMode(
31
35
  dataLength: number,
@@ -43,10 +43,10 @@
43
43
  * </DialogHeader>
44
44
  * <DialogBody>
45
45
  * <section className="space-y-4">
46
- * <div className="grid grid-cols-4 items-center gap-4">
46
+ * <fieldset className="grid grid-cols-4 items-center gap-4">
47
47
  * <Label htmlFor="name" className="text-right">Name</Label>
48
48
  * <Input id="name" defaultValue="John Doe" className="col-span-3" />
49
- * </div>
49
+ * </fieldset>
50
50
  * </section>
51
51
  * </DialogBody>
52
52
  * <DialogFooter>
@@ -159,7 +159,35 @@ import { X } from 'lucide-react';
159
159
  import { cn } from '../../utils/core/cn';
160
160
  import { renderSafeHtml } from '../../utils/validation/htmlSanitization';
161
161
  import { useState, useEffect } from 'react';
162
- import { debounce } from 'lodash';
162
+
163
+ /**
164
+ * Simple debounce function that matches lodash debounce API
165
+ * Returns a debounced function with a cancel method
166
+ */
167
+ function debounce<T extends (...args: any[]) => void>(
168
+ func: T,
169
+ wait: number
170
+ ): T & { cancel: () => void } {
171
+ let timeoutId: ReturnType<typeof setTimeout> | null = null;
172
+
173
+ const debounced = ((...args: Parameters<T>) => {
174
+ if (timeoutId !== null) {
175
+ clearTimeout(timeoutId);
176
+ }
177
+ timeoutId = setTimeout(() => {
178
+ func(...args);
179
+ }, wait);
180
+ }) as T & { cancel: () => void };
181
+
182
+ debounced.cancel = () => {
183
+ if (timeoutId !== null) {
184
+ clearTimeout(timeoutId);
185
+ timeoutId = null;
186
+ }
187
+ };
188
+
189
+ return debounced;
190
+ }
163
191
 
164
192
  /**
165
193
  * Dialog size variants
@@ -8,7 +8,8 @@ import React from 'react';
8
8
  import { screen, waitFor } from '@testing-library/react';
9
9
  import userEvent from '@testing-library/user-event';
10
10
  import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
11
- import { ErrorBoundary } from './ErrorBoundary';
11
+ import { ErrorBoundary } from './index';
12
+ import { ErrorBoundaryProvider } from './ErrorBoundaryContext';
12
13
  import { renderWithProviders } from '../../__tests__/helpers/test-utils';
13
14
 
14
15
  // Mock the performance budget monitor
@@ -778,4 +779,182 @@ describe('ErrorBoundary Component', () => {
778
779
  }
779
780
  vi.clearAllMocks();
780
781
  });
782
+
783
+ describe('Global Error Handler', () => {
784
+ it('uses global error handler when no onError prop is provided', async () => {
785
+ const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
786
+ const globalErrorHandler = vi.fn();
787
+
788
+ renderWithProviders(
789
+ <ErrorBoundaryProvider defaultErrorHandler={globalErrorHandler}>
790
+ <ErrorBoundary componentName="TestComponent">
791
+ <ThrowingComponent />
792
+ </ErrorBoundary>
793
+ </ErrorBoundaryProvider>
794
+ );
795
+
796
+ await waitFor(() => {
797
+ expect(globalErrorHandler).toHaveBeenCalledTimes(1);
798
+ expect(globalErrorHandler).toHaveBeenCalledWith(
799
+ expect.any(Error),
800
+ expect.any(Object), // errorInfo
801
+ expect.any(String), // errorId
802
+ 'TestComponent' // componentName
803
+ );
804
+ }, { interval: 10 });
805
+
806
+ consoleSpy.mockRestore();
807
+ });
808
+
809
+ it('uses global error handler with default component name when componentName not provided', async () => {
810
+ const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
811
+ const globalErrorHandler = vi.fn();
812
+
813
+ renderWithProviders(
814
+ <ErrorBoundaryProvider defaultErrorHandler={globalErrorHandler}>
815
+ <ErrorBoundary>
816
+ <ThrowingComponent />
817
+ </ErrorBoundary>
818
+ </ErrorBoundaryProvider>
819
+ );
820
+
821
+ await waitFor(() => {
822
+ expect(globalErrorHandler).toHaveBeenCalledTimes(1);
823
+ expect(globalErrorHandler).toHaveBeenCalledWith(
824
+ expect.any(Error),
825
+ expect.any(Object), // errorInfo
826
+ expect.any(String), // errorId
827
+ 'Unknown Component' // componentName (default)
828
+ );
829
+ }, { interval: 10 });
830
+
831
+ consoleSpy.mockRestore();
832
+ });
833
+
834
+ it('prefers onError prop over global error handler', async () => {
835
+ const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
836
+ const globalErrorHandler = vi.fn();
837
+ const localErrorHandler = vi.fn();
838
+
839
+ renderWithProviders(
840
+ <ErrorBoundaryProvider defaultErrorHandler={globalErrorHandler}>
841
+ <ErrorBoundary
842
+ componentName="TestComponent"
843
+ onError={localErrorHandler}
844
+ >
845
+ <ThrowingComponent />
846
+ </ErrorBoundary>
847
+ </ErrorBoundaryProvider>
848
+ );
849
+
850
+ await waitFor(() => {
851
+ expect(localErrorHandler).toHaveBeenCalledTimes(1);
852
+ expect(globalErrorHandler).not.toHaveBeenCalled();
853
+ }, { interval: 10 });
854
+
855
+ consoleSpy.mockRestore();
856
+ });
857
+
858
+ it('does not call global handler when ErrorBoundary is not wrapped in provider', async () => {
859
+ const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
860
+ const globalErrorHandler = vi.fn();
861
+
862
+ // Render without provider
863
+ renderWithProviders(
864
+ <ErrorBoundary componentName="TestComponent">
865
+ <ThrowingComponent />
866
+ </ErrorBoundary>
867
+ );
868
+
869
+ await waitFor(() => {
870
+ expect(screen.getByText('Error in TestComponent')).toBeInTheDocument();
871
+ }, { interval: 10 });
872
+
873
+ // Global handler should not be called since there's no provider
874
+ expect(globalErrorHandler).not.toHaveBeenCalled();
875
+
876
+ consoleSpy.mockRestore();
877
+ });
878
+
879
+ it('works with nested ErrorBoundary providers (inner provider overrides outer)', async () => {
880
+ const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
881
+ const outerErrorHandler = vi.fn();
882
+ const innerErrorHandler = vi.fn();
883
+
884
+ renderWithProviders(
885
+ <ErrorBoundaryProvider defaultErrorHandler={outerErrorHandler}>
886
+ <ErrorBoundary componentName="Outer">
887
+ <ErrorBoundaryProvider defaultErrorHandler={innerErrorHandler}>
888
+ <ErrorBoundary componentName="Inner">
889
+ <ThrowingComponent />
890
+ </ErrorBoundary>
891
+ </ErrorBoundaryProvider>
892
+ </ErrorBoundary>
893
+ </ErrorBoundaryProvider>
894
+ );
895
+
896
+ await waitFor(() => {
897
+ expect(innerErrorHandler).toHaveBeenCalledTimes(1);
898
+ expect(innerErrorHandler).toHaveBeenCalledWith(
899
+ expect.any(Error),
900
+ expect.any(Object),
901
+ expect.any(String),
902
+ 'Inner'
903
+ );
904
+ // Outer handler should not be called for inner boundary
905
+ expect(outerErrorHandler).not.toHaveBeenCalled();
906
+ }, { interval: 10 });
907
+
908
+ consoleSpy.mockRestore();
909
+ });
910
+
911
+ it('allows ErrorBoundaryProvider without defaultErrorHandler (no-op)', async () => {
912
+ const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
913
+
914
+ renderWithProviders(
915
+ <ErrorBoundaryProvider>
916
+ <ErrorBoundary componentName="TestComponent">
917
+ <ThrowingComponent />
918
+ </ErrorBoundary>
919
+ </ErrorBoundaryProvider>
920
+ );
921
+
922
+ await waitFor(() => {
923
+ expect(screen.getByText('Error in TestComponent')).toBeInTheDocument();
924
+ }, { interval: 10 });
925
+
926
+ // Should render error UI without calling any handler
927
+ expect(screen.getByText('Error in TestComponent')).toBeInTheDocument();
928
+
929
+ consoleSpy.mockRestore();
930
+ });
931
+
932
+ it('passes correct error information to global handler', async () => {
933
+ const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
934
+ const globalErrorHandler = vi.fn();
935
+ const testError = new Error('Custom test error');
936
+
937
+ renderWithProviders(
938
+ <ErrorBoundaryProvider defaultErrorHandler={globalErrorHandler}>
939
+ <ErrorBoundary componentName="TestComponent">
940
+ <ThrowingComponent errorMessage="Custom test error" />
941
+ </ErrorBoundary>
942
+ </ErrorBoundaryProvider>
943
+ );
944
+
945
+ await waitFor(() => {
946
+ expect(globalErrorHandler).toHaveBeenCalledTimes(1);
947
+ const callArgs = globalErrorHandler.mock.calls[0];
948
+ expect(callArgs[0]).toBeInstanceOf(Error);
949
+ expect(callArgs[0].message).toBe('Custom test error');
950
+ expect(callArgs[1]).toBeDefined(); // errorInfo
951
+ expect(callArgs[1].componentStack).toBeDefined();
952
+ expect(typeof callArgs[2]).toBe('string'); // errorId
953
+ expect(callArgs[2]).toMatch(/^error_/); // errorId format
954
+ expect(callArgs[3]).toBe('TestComponent'); // componentName
955
+ }, { interval: 10 });
956
+
957
+ consoleSpy.mockRestore();
958
+ });
959
+ });
781
960
  });